Rakefile 13 KB

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