+def can_run?(*command, **options)
+ options = {
+ :in => :close,
+ :out => [File::NULL, "w"],
+ }.merge(options)
+ system(*command, **options)
+end
+
+class JavaSDK
+ def self.build_path
+ "sdk/java-v2"
+ end
+
+ def self.can_build?
+ can_run?("gradle", "--version")
+ end
+end
+
+class PythonSDK
+ def self.build_path
+ "sdk/python/arvados"
+ end
+
+ def self.can_build?
+ can_run?("./pysdk_pdoc.py", "--version")
+ end
+end
+
+class RSDK
+ def self.build_path
+ "sdk/R"
+ end
+
+ def self.can_build?
+ can_run?("R", "--version")
+ end
+end
+
+$build_sdks = begin
+ no_sdk_env = ENV.fetch("NO_SDK", "")
+ sdks_env = ENV.fetch("sdks", "")
+ all_sdks = Hash[[JavaSDK, PythonSDK, RSDK].map { |c| [c.name, c] }]
+
+ if no_sdk_env != "" and sdks_env != ""
+ fail "both NO_SDK and sdks defined in environment"
+ elsif sdks_env != ""
+ # Nothing to do
+ elsif no_sdk_env != "" or File.exist?("no-sdk")
+ sdks_env = "none"
+ end
+
+ if sdks_env == ""
+ all_sdks.each_pair.filter_map do |name, sdk|
+ if sdk.can_build?
+ sdk
+ else
+ puts "Warning: cannot build #{name.gsub(/SDK$/, ' SDK')} documentation, skipping".colorize(:light_red)
+ end
+ end
+ else
+ wanted_sdks = []
+ sdks_env.split(/\s*[,\s]\s*/).each do |key|
+ key = "#{key.capitalize}SDK"
+ if key == "AllSDK"
+ wanted_sdks = all_sdks.values
+ elsif key == "NoneSDK"
+ wanted_sdks.clear
+ elsif sdk = all_sdks[key]
+ wanted_sdks << sdk
+ else
+ fail "cannot build documentation for unknown #{key}"
+ end
+ end
+ wanted_sdks
+ end
+end
+