Rakefile 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. require 'xcjobs'
  2. require 'json'
  3. def xcode_version
  4. `xcodebuild -version`.split("\n").first.scan(/\d+/).join('.')
  5. end
  6. def destinations(platform: 'iphonesimulator')
  7. if platform == 'iphonesimulator'
  8. if xcode_version.start_with?('10')
  9. [ 'name=iPhone 5s,OS=12.0',
  10. 'name=iPhone 6,OS=12.0',
  11. 'name=iPhone 6s Plus,OS=12.0',
  12. 'name=iPhone SE,OS=12.0',
  13. 'name=iPad Air 2,OS=12.0',
  14. 'name=iPad Pro (9.7-inch),OS=12.0',
  15. 'name=iPad Pro (12.9-inch),OS=12.0'
  16. ]
  17. elsif xcode_version.start_with?('9.4')
  18. [ 'name=iPhone 5s,OS=11.4',
  19. 'name=iPhone 6,OS=11.4',
  20. 'name=iPhone 6s Plus,OS=11.4',
  21. 'name=iPhone SE,OS=11.4',
  22. 'name=iPad Air 2,OS=11.4',
  23. 'name=iPad Pro (9.7-inch),OS=11.4',
  24. 'name=iPad Pro (12.9-inch),OS=11.4'
  25. ]
  26. elsif xcode_version.start_with?('9.3')
  27. [ 'name=iPhone 5s,OS=11.0.1',
  28. 'name=iPhone 5s,OS=11.1',
  29. 'name=iPhone 6,OS=11.2',
  30. 'name=iPhone 6s Plus,OS=11.3',
  31. 'name=iPhone SE,OS=11.0.1',
  32. 'name=iPad Air 2,OS=11.1',
  33. 'name=iPad Pro (9.7-inch),OS=11.2',
  34. 'name=iPad Pro (12.9-inch),OS=11.3'
  35. ]
  36. elsif xcode_version.start_with?('9.2')
  37. [ 'name=iPhone 5s,OS=11.2',
  38. 'name=iPhone 5s,OS=11.2',
  39. 'name=iPhone 6,OS=11.2',
  40. 'name=iPhone 6s Plus,OS=11.2',
  41. 'name=iPhone SE,OS=11.2',
  42. 'name=iPad Air 2,OS=11.2',
  43. 'name=iPad Pro (9.7-inch),OS=11.2',
  44. 'name=iPad Pro (12.9-inch),OS=11.2'
  45. ]
  46. elsif xcode_version.start_with?('9.1')
  47. [ 'name=iPhone 5s,OS=11.1',
  48. 'name=iPhone 5s,OS=11.1',
  49. 'name=iPhone 6,OS=11.1',
  50. 'name=iPhone 6s Plus,OS=11.1',
  51. 'name=iPhone SE,OS=11.1',
  52. 'name=iPad Air 2,OS=11.1',
  53. 'name=iPad Pro (9.7-inch),OS=11.1',
  54. 'name=iPad Pro (12.9-inch),OS=11.1'
  55. ]
  56. elsif xcode_version.start_with?('9')
  57. [ 'name=iPhone 5,OS=10.0',
  58. 'name=iPhone 5s,OS=10.0',
  59. 'name=iPhone 6,OS=10.0',
  60. 'name=iPhone 6s Plus,OS=10.3.1',
  61. 'name=iPhone SE,OS=10.3.1',
  62. 'name=iPhone 7,OS=11.0',
  63. 'name=iPad Air 2,OS=10.0',
  64. 'name=iPad Pro (9.7-inch),OS=10.0',
  65. 'name=iPad Pro (12.9-inch),OS=10.0',
  66. 'name=iPad Pro (10.5-inch),OS=11.0'
  67. ]
  68. else
  69. [ 'name=iPhone 5,OS=10.0',
  70. 'name=iPhone 5s,OS=10.0',
  71. 'name=iPhone 6,OS=10.0',
  72. 'name=iPhone 6s Plus,OS=10.3.1',
  73. 'name=iPhone SE,OS=10.3.1',
  74. 'name=iPad Air 2,OS=10.0',
  75. 'name=iPad Pro (9.7-inch),OS=10.0',
  76. 'name=iPad Pro (12.9-inch),OS=10.0'
  77. ]
  78. end
  79. elsif platform == 'watchsimulator'
  80. if xcode_version.start_with?('10')
  81. [ 'name=Apple Watch Series 4 - 40mm,OS=5.0',
  82. 'name=Apple Watch Series 4 - 44mm,OS=5.0'
  83. ]
  84. elsif xcode_version.start_with?('9.4')
  85. [ 'name=Apple Watch Series 3 - 38mm,OS=4.3',
  86. 'name=Apple Watch Series 3 - 42mm,OS=4.3'
  87. ]
  88. elsif xcode_version.start_with?('9.3')
  89. [ 'name=Apple Watch - 38mm,OS=4.3',
  90. 'name=Apple Watch - 42mm,OS=4.3',
  91. 'name=Apple Watch Series 2 - 42mm,OS=4.3'
  92. ]
  93. elsif xcode_version.start_with?('9.2')
  94. [ 'name=Apple Watch - 38mm,OS=4.2',
  95. 'name=Apple Watch - 42mm,OS=4.2',
  96. 'name=Apple Watch Series 2 - 42mm,OS=4.2'
  97. ]
  98. elsif xcode_version.start_with?('9.1')
  99. [ 'name=Apple Watch - 38mm,OS=4.1',
  100. 'name=Apple Watch - 42mm,OS=4.1',
  101. 'name=Apple Watch Series 2 - 42mm,OS=4.1'
  102. ]
  103. elsif xcode_version.start_with?('9')
  104. [ 'name=Apple Watch - 38mm,OS=3.2',
  105. 'name=Apple Watch - 42mm,OS=4.0',
  106. 'name=Apple Watch Series 2 - 42mm,OS=4.0'
  107. ]
  108. else
  109. [ 'name=Apple Watch - 38mm,OS=3.2',
  110. 'name=Apple Watch Series 2 - 42mm,OS=3.2'
  111. ]
  112. end
  113. elsif platform == 'appletvsimulator'
  114. if xcode_version.start_with?('10')
  115. [ 'name=Apple TV 4K,OS=12.0'
  116. ]
  117. elsif xcode_version.start_with?('9.4')
  118. [ 'name=Apple TV 4K,OS=11.4'
  119. ]
  120. elsif xcode_version.start_with?('9.3')
  121. [ 'name=Apple TV 4K,OS=11.3'
  122. ]
  123. elsif xcode_version.start_with?('9.2')
  124. [ 'name=Apple TV 4K,OS=11.2'
  125. ]
  126. elsif xcode_version.start_with?('9.1')
  127. [ 'name=Apple TV 4K,OS=11.1'
  128. ]
  129. elsif xcode_version.start_with?('9')
  130. [ 'name=Apple TV 1080p,OS=10.2',
  131. 'name=Apple TV 1080p,OS=11.0'
  132. ]
  133. else
  134. [ 'name=Apple TV 1080p,OS=10.2'
  135. ]
  136. end
  137. else
  138. [
  139. 'platform=OS X,arch=x86_64'
  140. ]
  141. end
  142. end
  143. def supportedPlatforms
  144. ['macosx', 'iphoneos', 'iphonesimulator', 'watchos', 'watchsimulator', 'appletvos', 'appletvsimulator']
  145. end
  146. def configurations
  147. ['Debug', 'Release']
  148. end
  149. desc "build for all platforms"
  150. task :build do |t|
  151. supportedPlatforms
  152. .product(configurations)
  153. .map { |platform, configuration| Rake::Task["build:#{platform}:#{configuration.downcase}"] }
  154. .map(&:invoke)
  155. end
  156. namespace :build do
  157. supportedPlatforms.product(configurations).each do |platform, configuration|
  158. XCJobs::Build.new("#{platform}:#{configuration.downcase}") do |t|
  159. t.project = 'KeychainAccess'
  160. t.scheme = 'KeychainAccess'
  161. t.sdk = platform
  162. t.configuration = configuration
  163. t.build_dir = 'build'
  164. t.hide_shell_script_environment = true
  165. t.formatter = 'xcpretty -c'
  166. if ENV['CI']
  167. t.add_build_setting('CODE_SIGN_IDENTITY', '')
  168. t.add_build_setting('CODE_SIGNING_REQUIRED', 'NO')
  169. end
  170. if xcode_version.start_with?('10')
  171. t.add_build_setting('SWIFT_VERSION', '4.2')
  172. if platform == 'iphonesimulator'
  173. t.add_destination('name=iPhone 7,OS=12.0')
  174. elsif platform == 'watchsimulator'
  175. t.add_destination('name=Apple Watch Series 4 - 44mm,OS=5.0')
  176. elsif platform == 'appletvsimulator'
  177. t.add_destination('name=Apple TV 4K,OS=12.0')
  178. end
  179. elsif xcode_version.start_with?('9.4')
  180. t.add_build_setting('SWIFT_VERSION', '4.1')
  181. if platform == 'iphonesimulator'
  182. t.add_destination('name=iPhone 7,OS=11.4')
  183. elsif platform == 'watchsimulator'
  184. t.add_destination('name=Apple Watch Series 3 - 42mm,OS=4.3')
  185. elsif platform == 'appletvsimulator'
  186. t.add_destination('name=Apple TV 4K,OS=11.4')
  187. end
  188. elsif xcode_version.start_with?('9.3')
  189. t.add_build_setting('SWIFT_VERSION', '4.1')
  190. if platform == 'iphonesimulator'
  191. t.add_destination('name=iPhone 7,OS=11.3')
  192. elsif platform == 'watchsimulator'
  193. t.add_destination('name=Apple Watch - 42mm,OS=4.3')
  194. elsif platform == 'appletvsimulator'
  195. t.add_destination('name=Apple TV 4K,OS=11.3')
  196. end
  197. elsif xcode_version.start_with?('9.2')
  198. t.add_build_setting('SWIFT_VERSION', '4.0')
  199. if platform == 'iphonesimulator'
  200. t.add_destination('name=iPhone 7,OS=11.2')
  201. elsif platform == 'watchsimulator'
  202. t.add_destination('name=Apple Watch - 42mm,OS=4.2')
  203. elsif platform == 'appletvsimulator'
  204. t.add_destination('name=Apple TV 4K,OS=11.2')
  205. end
  206. elsif xcode_version.start_with?('9.1')
  207. t.add_build_setting('SWIFT_VERSION', '4.0')
  208. if platform == 'iphonesimulator'
  209. t.add_destination('name=iPhone 7,OS=11.1')
  210. elsif platform == 'watchsimulator'
  211. t.add_destination('name=Apple Watch - 42mm,OS=4.1')
  212. elsif platform == 'appletvsimulator'
  213. t.add_destination('name=Apple TV 4K,OS=11.1')
  214. end
  215. elsif xcode_version.start_with?('9')
  216. t.add_build_setting('SWIFT_VERSION', '4.0')
  217. if platform == 'iphonesimulator'
  218. t.add_destination('name=iPhone 7,OS=11.0')
  219. elsif platform == 'watchsimulator'
  220. t.add_destination('name=Apple Watch - 42mm,OS=4.0')
  221. elsif platform == 'appletvsimulator'
  222. t.add_destination('name=Apple TV 1080p,OS=11.0')
  223. end
  224. else
  225. t.add_build_setting('SWIFT_VERSION', '3.0')
  226. if platform == 'iphonesimulator'
  227. t.add_destination('name=iPhone 7,OS=10.3.1')
  228. elsif platform == 'watchsimulator'
  229. t.add_destination('name=Apple Watch - 42mm,OS=3.2')
  230. elsif platform == 'appletvsimulator'
  231. t.add_destination('name=Apple TV 1080p,OS=10.0')
  232. end
  233. end
  234. end
  235. end
  236. task :carthage do
  237. sh %[echo 'github \"kishikawakatsumi/KeychainAccess\"' > Cartfile]
  238. if xcode_version.start_with?('10')
  239. sh %[echo SWIFT_VERSION=\"4.2\" > swift.xcconfig]
  240. elsif xcode_version.start_with?('9.4')
  241. sh %[echo SWIFT_VERSION=\"4.1\" > swift.xcconfig]
  242. elsif xcode_version.start_with?('9.3')
  243. sh %[echo SWIFT_VERSION=\"4.1\" > swift.xcconfig]
  244. elsif xcode_version.start_with?('9')
  245. sh %[echo SWIFT_VERSION=\"4.0\" > swift.xcconfig]
  246. else
  247. sh %[echo SWIFT_VERSION=\"3.0\" > swift.xcconfig]
  248. end
  249. sh %[XCODE_XCCONFIG_FILE=`pwd`/swift.xcconfig carthage update --no-use-binaries]
  250. sh %[find . -name '*.bcsymbolmap' | xargs grep swiftlang]
  251. end
  252. end
  253. namespace :test do
  254. supportedPlatforms
  255. .select { |platform| platform == 'macosx' || platform == 'iphonesimulator' || platform == 'appletvsimulator' }
  256. .each do |platform|
  257. task platform do |t|
  258. configurations.each do |configuration|
  259. destinations(platform: platform)
  260. .map { |destination| Rake::Task["test:#{platform}:#{configuration.downcase}:#{destination}"] }
  261. .map(&:invoke)
  262. end
  263. end
  264. end
  265. end
  266. namespace :test do
  267. supportedPlatforms
  268. .select { |platform| platform == 'macosx' || platform == 'iphonesimulator' || platform == 'appletvsimulator' }
  269. .product(configurations)
  270. .each do |platform, configuration|
  271. destinations(platform: platform).each do |destination|
  272. XCJobs::Test.new("#{platform}:#{configuration.downcase}:#{destination}") do |t|
  273. t.project = 'KeychainAccess'
  274. t.scheme = 'KeychainAccess'
  275. t.sdk = platform
  276. t.configuration = configuration
  277. t.add_destination(destination)
  278. t.coverage = true
  279. t.build_dir = 'build'
  280. t.hide_shell_script_environment = true
  281. if xcode_version.start_with?('10')
  282. t.add_build_setting('SWIFT_VERSION', '4.2')
  283. elsif xcode_version.start_with?('9.4')
  284. t.add_build_setting('SWIFT_VERSION', '4.1')
  285. elsif xcode_version.start_with?('9.3')
  286. t.add_build_setting('SWIFT_VERSION', '4.1')
  287. elsif xcode_version.start_with?('9')
  288. t.add_build_setting('SWIFT_VERSION', '4.0')
  289. else
  290. t.add_build_setting('SWIFT_VERSION', '3.0')
  291. end
  292. t.after_action do
  293. build_coverage_reports()
  294. puts `curl -L https://codecov.io/bash | bash -s -- -f 'coverage.txt'`
  295. end
  296. end
  297. end
  298. end
  299. end
  300. def build_coverage_reports()
  301. project_name = 'KeychainAccess'
  302. profdata = Dir.glob(File.join('build', '/**/Coverage.profdata')).first
  303. Dir.glob(File.join('build', "/**/#{project_name}")) do |target|
  304. output = `xcrun llvm-cov report -instr-profile "#{profdata}" "#{target}" -arch=x86_64`
  305. if $?.success?
  306. puts output
  307. `xcrun llvm-cov show -instr-profile "#{profdata}" "#{target}" -arch=x86_64 -use-color=0 > coverage.txt`
  308. break
  309. end
  310. end
  311. end