xcake 0.7.1 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +11 -3
  3. data/CHANGELOG.md +15 -0
  4. data/README.md +3 -1
  5. data/bin/xcake +0 -1
  6. data/docs/Cakefile.md +82 -1
  7. data/docs/Xcode Project Support.md +5 -0
  8. data/example/app/CakeMania/CakeMania.xcodeproj/project.pbxproj +973 -0
  9. data/example/app/CakeMania/CakeMania.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  10. data/example/app/CakeMania/CakeMania.xcodeproj/project.xcworkspace/xcuserdata/maxim.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  11. data/example/app/CakeMania/CakeMania.xcodeproj/xcshareddata/xcschemes/CakeMania-AppStore.xcscheme +91 -0
  12. data/example/app/CakeMania/CakeMania.xcodeproj/xcshareddata/xcschemes/CakeMania-Debug.xcscheme +91 -0
  13. data/example/app/CakeMania/CakeMania.xcodeproj/xcshareddata/xcschemes/CakeMania-Production.xcscheme +91 -0
  14. data/example/app/CakeMania/CakeMania.xcodeproj/xcshareddata/xcschemes/CakeMania-RC.xcscheme +91 -0
  15. data/example/app/CakeMania/CakeMania.xcodeproj/xcshareddata/xcschemes/CakeMania-Staging.xcscheme +91 -0
  16. data/example/app/CakeMania/CakeMania.xcodeproj/xcuserdata/maxim.xcuserdatad/xcschemes/CakeManiaTst.xcscheme +56 -0
  17. data/example/app/CakeMania/CakeMania.xcodeproj/xcuserdata/maxim.xcuserdatad/xcschemes/CakeManiaUITst.xcscheme +56 -0
  18. data/example/app/CakeMania/CakeMania.xcodeproj/xcuserdata/maxim.xcuserdatad/xcschemes/xcschememanagement.plist +72 -0
  19. data/{docs/Sample → example/app/CakeMania}/Cakefile +80 -47
  20. data/example/app/CakeMania/Info/CakeMania.plist +38 -0
  21. data/example/app/CakeMania/Info/CakeManiaTst.plist +22 -0
  22. data/example/app/CakeMania/Info/CakeManiaUITst.plist +22 -0
  23. data/example/app/CakeMania/Res/CakeMania-test.entitlements +10 -0
  24. data/example/app/CakeMania/Res/CakeMania.entitlements +10 -0
  25. data/example/app/CakeMania/Res/CakeMania.xcassets/AppIcon.appiconset/Contents.json +48 -0
  26. data/example/app/CakeMania/Src/AppDelegate.swift +46 -0
  27. data/example/app/CakeMania/Src/Base.lproj/LaunchScreen.storyboard +27 -0
  28. data/example/app/CakeMania/Src/Base.lproj/Main.storyboard +26 -0
  29. data/example/app/CakeMania/Src/ObjC/CakeMania-Bridging-Header.h +3 -0
  30. data/example/app/CakeMania/Src/ObjC/Prefix.pch +14 -0
  31. data/example/app/CakeMania/Src/ViewController.swift +25 -0
  32. data/example/app/CakeMania/Tst/Main.swift +36 -0
  33. data/example/app/CakeMania/UITst/Main.swift +36 -0
  34. data/example/framework/Cakefile +133 -0
  35. data/gemfiles/Gemfile.xcodeproj-1.3.x +5 -0
  36. data/gemfiles/Gemfile.xcodeproj-1.4.x +5 -0
  37. data/gemfiles/Gemfile.xcodeproj-edge +5 -0
  38. data/lib/xcake/build_phase/headers_build_phase.rb +47 -0
  39. data/lib/xcake/build_phase/shell_script_build_phase.rb +24 -0
  40. data/lib/xcake/build_phase.rb +36 -0
  41. data/lib/xcake/constants.rb +82 -0
  42. data/lib/xcake/context/xcodeproj_context.rb +10 -0
  43. data/lib/xcake/context.rb +24 -0
  44. data/lib/xcake/generator/scheme_generator.rb +13 -2
  45. data/lib/xcake/generator/target_build_phase_generator.rb +11 -3
  46. data/lib/xcake/generator/target_dependency_generator.rb +1 -1
  47. data/lib/xcake/generator/target_file_reference_generator.rb +4 -5
  48. data/lib/xcake/generator/target_link_generator.rb +25 -0
  49. data/lib/xcake/informative.rb +0 -1
  50. data/lib/xcake/path_classifier.rb +5 -5
  51. data/lib/xcake/project/sugar.rb +7 -5
  52. data/lib/xcake/project.rb +0 -1
  53. data/lib/xcake/target/configurable.rb +2 -6
  54. data/lib/xcake/target/sugar.rb +28 -3
  55. data/lib/xcake/target.rb +34 -18
  56. data/lib/xcake/ui.rb +1 -4
  57. data/lib/xcake/version.rb +1 -1
  58. data/lib/xcake/xcode/project.rb +25 -13
  59. data/lib/xcake/xcode/scheme.rb +3 -0
  60. data/lib/xcake/xcode/scheme_list.rb +0 -23
  61. data/lib/xcake/xcodeproj_ext/PBXGroup.rb +3 -3
  62. data/lib/xcake/xcodeproj_ext/PBXNativeTarget.rb +0 -1
  63. data/lib/xcake.rb +10 -5
  64. data/rubocop.yml +0 -4
  65. data/xcake.gemspec +8 -7
  66. metadata +112 -80
  67. data/lib/xcake/generator/target_custom_build_phase_generator.rb +0 -16
  68. data/lib/xcake/shell_script_build_phase.rb +0 -15
@@ -0,0 +1,133 @@
1
+ # https://github.com/jcampbell05/xcake
2
+ # http://www.rubydoc.info/github/jcampbell05/xcake/master/file/docs/Cakefile.md
3
+
4
+ iOSdeploymentTarget = "8.0"
5
+ currentSwiftVersion = "3.0.1" # to set "Use Legacy Swift ..." to "No"
6
+ companyIdentifier = "com.CakeMania"
7
+ developmentTeamId = "XYZXYZ" # for automatic debug signing in Xcode 8
8
+ testSuffix = "Tst"
9
+
10
+ #===
11
+
12
+ project.name = "CakeFamework"
13
+ project.class_prefix = "CFW"
14
+ project.organization = "CakeMania Inc."
15
+
16
+ #=== DEFAULT target settings
17
+
18
+ project.all_configurations.each do |configuration|
19
+
20
+ # for all configurations
21
+
22
+ configuration.settings["SDKROOT"] = "iphoneos"
23
+ configuration.settings["DEBUG_INFORMATION_FORMAT"] = "dwarf"
24
+ configuration.settings["CODE_SIGN_IDENTITY[sdk=iphoneos*]"] = "iPhone Developer"
25
+ configuration.settings["TARGETED_DEVICE_FAMILY"] = "1,2"
26
+ configuration.settings["IPHONEOS_DEPLOYMENT_TARGET"] = iOSdeploymentTarget
27
+ configuration.settings["VERSIONING_SYSTEM"] = "apple-generic"
28
+
29
+ configuration.settings["GCC_NO_COMMON_BLOCKS"] = "YES"
30
+ configuration.settings["GCC_WARN_ABOUT_RETURN_TYPE"] = "YES_ERROR"
31
+ configuration.settings["GCC_WARN_UNINITIALIZED_AUTOS"] = "YES_AGGRESSIVE"
32
+ configuration.settings["CLANG_WARN_DIRECT_OBJC_ISA_USAGE"] = "YES_ERROR"
33
+ configuration.settings["CLANG_WARN_OBJC_ROOT_CLASS"] = "YES_ERROR"
34
+
35
+ configuration.settings["SWIFT_OPTIMIZATION_LEVEL"] = "-Onone"
36
+
37
+ configuration.settings["CURRENT_PROJECT_VERSION"] = "1" # just default non-empty value
38
+
39
+ configuration.settings["CLANG_WARN_INFINITE_RECURSION"] = "YES" # Xcode 8
40
+ configuration.settings["CLANG_WARN_SUSPICIOUS_MOVE"] = "YES" # Xcode 8
41
+ configuration.settings["ENABLE_STRICT_OBJC_MSGSEND"] = "YES" # Xcode 8
42
+
43
+ #===
44
+
45
+ if configuration.name == "Release"
46
+
47
+ configuration.settings["DEBUG_INFORMATION_FORMAT"] = "dwarf-with-dsym"
48
+ configuration.settings["SWIFT_OPTIMIZATION_LEVEL"] = "-Owholemodule" # Xcode 8
49
+
50
+ end
51
+
52
+ end
53
+
54
+ #===
55
+
56
+ # Imagine we have project folder structure like this:
57
+ #
58
+ # - Cakefile
59
+ # - Info/
60
+ # | - CakeFamework.plist
61
+ # | - CakeFameworkTst.plist
62
+ # - Src/
63
+ # | - ...
64
+ # - Tst/
65
+ # | - ...
66
+ #
67
+
68
+ #=== TARGETS
69
+
70
+ target do |target|
71
+
72
+ target.name = project.name
73
+ target.type = :framework
74
+ target.language = :swift
75
+ target.platform = :ios
76
+ target.deployment_target = iOSdeploymentTarget
77
+
78
+ #=== CUSTOM settings for the target
79
+
80
+ target.all_configurations.each do |configuration|
81
+
82
+ #=== Build Settings - Core
83
+
84
+ configuration.product_bundle_identifier = companyIdentifier + "." + target.name
85
+
86
+ configuration.settings["INFOPLIST_FILE"] = "Info/" + target.name + ".plist"
87
+
88
+ configuration.settings["PRODUCT_NAME"] = "$(TARGET_NAME)"
89
+
90
+ # Xcode 8 automati c signing support
91
+ configuration.settings["CODE_SIGN_IDENTITY[sdk=iphoneos*]"] = "iPhone Developer"
92
+ configuration.settings["DEVELOPMENT_TEAM"] = developmentTeamId
93
+
94
+ configuration.settings["SWIFT_VERSION"] = currentSwiftVersion # Xcode 8
95
+
96
+ end
97
+
98
+ #=== Source Files
99
+
100
+ # assume all source files are located inside "/Src" folder and its subfolders
101
+
102
+ target.include_files = ["Src/**/*.*"]
103
+
104
+ #=== TEST TARGETS
105
+
106
+ unit_tests_for target do |test_target|
107
+
108
+ test_target.name = target.name + testSuffix
109
+ test_target.deployment_target = iOSdeploymentTarget
110
+
111
+ test_target.all_configurations.each do |configuration|
112
+
113
+ configuration.product_bundle_identifier = companyIdentifier + "." + test_target.name
114
+
115
+ configuration.settings["INFOPLIST_FILE"] = "Info/" + test_target.name + ".plist"
116
+
117
+ configuration.settings["LD_RUNPATH_SEARCH_PATHS"] = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"
118
+
119
+ # Xcode 8 automati c signing support
120
+ configuration.settings["CODE_SIGN_IDENTITY[sdk=iphoneos*]"] = "iPhone Developer"
121
+ configuration.settings["DEVELOPMENT_TEAM"] = developmentTeamId
122
+
123
+ configuration.settings["SWIFT_VERSION"] = currentSwiftVersion # Xcode 8
124
+
125
+ end
126
+
127
+ #=== Source Files
128
+
129
+ test_target.include_files = [testSuffix + "/**/*.*"]
130
+
131
+ end
132
+
133
+ end
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in xcake.gemspec
4
+ gemspec :path => '..'
5
+ gem "xcodeproj", "~> 1.3.0"
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in xcake.gemspec
4
+ gemspec :path => '..'
5
+ gem "xcodeproj", "~> 1.4.0"
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in xcake.gemspec
4
+ gemspec :path => '..'
5
+ gem "xcodeproj", :git => 'https://github.com/CocoaPods/Xcodeproj'
@@ -0,0 +1,47 @@
1
+ module Xcake
2
+ PUBLIC_HEADER_ATTRIBUTE = { 'ATTRIBUTES' => ['Public'] }.freeze
3
+ PRIVATE_HEADER_ATTRIBUTE = { 'ATTRIBUTES' => ['Private'] }.freeze
4
+
5
+ # This class is used to represent a copy headers build phase
6
+ #
7
+ class HeadersBuildPhase < BuildPhase
8
+ attr_accessor :public
9
+ attr_accessor :private
10
+ attr_accessor :project
11
+
12
+ def initialize
13
+ @public = []
14
+ @private = []
15
+ @project = []
16
+
17
+ yield(self) if block_given?
18
+ end
19
+
20
+ def build_phase_type
21
+ Xcodeproj::Project::Object::PBXHeadersBuildPhase
22
+ end
23
+
24
+ def configure_native_build_phase(native_build_phase, context)
25
+ @public.each do |file|
26
+ file_reference = context.file_reference_for_path(file)
27
+ build_file = native_build_phase.add_file_reference(file_reference)
28
+ build_file.settings = PUBLIC_HEADER_ATTRIBUTE
29
+ end
30
+
31
+ @private.each do |file|
32
+ file_reference = context.file_reference_for_path(file)
33
+ build_file = native_build_phase.add_file_reference(file_reference)
34
+ build_file.settings = PRIVATE_HEADER_ATTRIBUTE
35
+ end
36
+
37
+ @project.each do |file|
38
+ file_reference = context.file_reference_for_path(file)
39
+ native_build_phase.add_file_reference(file_reference)
40
+ end
41
+ end
42
+
43
+ def to_s
44
+ 'BuildPhase<Copy Headers>'
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,24 @@
1
+ module Xcake
2
+ # This class is used to represent a shell script build phase
3
+ #
4
+ class ShellScriptBuildPhase < BuildPhase
5
+ # The name of the build phase as shown in Xcode
6
+ attr_accessor :name
7
+
8
+ # String coataining the contents of the script to run
9
+ attr_accessor :script
10
+
11
+ def build_phase_type
12
+ Xcodeproj::Project::Object::PBXShellScriptBuildPhase
13
+ end
14
+
15
+ def configure_native_build_phase(native_build_phase, _context)
16
+ native_build_phase.name = name
17
+ native_build_phase.shell_script = script.strip_heredoc
18
+ end
19
+
20
+ def to_s
21
+ "BuildPhase<#{name}>"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,36 @@
1
+ module Xcake
2
+ # This class is used to describe a build phase for a
3
+ # Xcode project; This forms part of the DSL
4
+ # and is usually stored in files named `Cakefile`.
5
+ #
6
+ class BuildPhase
7
+ # @param [Proc] block
8
+ # an optional block that configures the build phase through the DSL.
9
+ #
10
+ # @example Creating a Build Phase.
11
+ #
12
+ # BuildPhase.new do |p|
13
+ # p.name "test"
14
+ # end
15
+ #
16
+ def initialize
17
+ yield(self) if block_given?
18
+ end
19
+
20
+ # This method is called when generating the build phases
21
+ # subclasses should implement this to allow xcake to know
22
+ # what native build phase type this DSL Object represents
23
+ #
24
+ def build_phase_type
25
+ raise 'build_phase_type not implemented'
26
+ end
27
+
28
+ # This method is called when generating the build phases
29
+ # subclasses should implement this to handle the
30
+ # configuration of the build phase
31
+ #
32
+ def configure_native_build_phase(_native_build_phase, _context)
33
+ raise 'configure_native_build_phase not implemented'
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,82 @@
1
+ module Xcake
2
+ module Constants
3
+ COMMON_BUILD_SETTINGS = Xcodeproj::Constants::COMMON_BUILD_SETTINGS.deep_merge(
4
+ [:ios, :unit_test_bundle] => {
5
+ 'LD_RUNPATH_SEARCH_PATHS' => [
6
+ '$(inherited)',
7
+ '@executable_path/Frameworks',
8
+ '@loader_path/Frameworks'
9
+ ]
10
+ }.freeze,
11
+ [:osx, :unit_test_bundle] => {
12
+ 'LD_RUNPATH_SEARCH_PATHS' => [
13
+ '$(inherited)',
14
+ '@executable_path/../Frameworks',
15
+ '@loader_path/../Frameworks'
16
+ ]
17
+ }.freeze
18
+ ).freeze
19
+
20
+ PRODUCT_TYPE_UTI = Xcodeproj::Constants::PRODUCT_TYPE_UTI
21
+
22
+ # Returns the common build settings for a given platform and configuration
23
+ # name.
24
+ #
25
+ # @param [Symbol] type
26
+ # the type of the build configuration, can be `:release` or
27
+ # `:debug`.
28
+ #
29
+ # @param [Symbol] platform
30
+ # the platform for the build settings, can be `:ios` or `:osx`.
31
+ #
32
+ # @param [String] deployment_target
33
+ # the deployment target for the platform.
34
+ #
35
+ # @param [Symbol] target_product_type
36
+ # the product type of the target, can be any of
37
+ # `Constants::PRODUCT_TYPE_UTI.values`
38
+ # or `Constants::PRODUCT_TYPE_UTI.keys`. Default is :application.
39
+ #
40
+ # @param [Symbol] language
41
+ # the primary language of the target, can be `:objc` or `:swift`.
42
+ #
43
+ # @return [Hash] The common build settings
44
+ #
45
+ def self.common_build_settings(type, platform = nil, deployment_target = nil, target_product_type = nil, language = :objc)
46
+ target_product_type = (PRODUCT_TYPE_UTI.find { |_, v| v == target_product_type } || [target_product_type || :application])[0]
47
+ common_settings = COMMON_BUILD_SETTINGS
48
+
49
+ # Use intersecting settings for all key sets as base
50
+ settings = deep_dup(common_settings[:all])
51
+
52
+ # Match further common settings by key sets
53
+ keys = [type, platform, target_product_type, language].compact
54
+ key_combinations = (1..keys.length).flat_map { |n| keys.combination(n).to_a }
55
+ key_combinations.each do |key_combination|
56
+ settings.merge!(deep_dup(common_settings[key_combination] || {}))
57
+ end
58
+
59
+ if deployment_target
60
+ case platform
61
+ when :ios then settings['IPHONEOS_DEPLOYMENT_TARGET'] = deployment_target
62
+ when :osx then settings['MACOSX_DEPLOYMENT_TARGET'] = deployment_target
63
+ when :tvos then settings['TVOS_DEPLOYMENT_TARGET'] = deployment_target
64
+ when :watchos then settings['WATCHOS_DEPLOYMENT_TARGET'] = deployment_target
65
+ end
66
+ end
67
+
68
+ settings
69
+ end
70
+
71
+ # Creates a deep copy of the given object
72
+ #
73
+ # @param [Object] object
74
+ # the object to copy.
75
+ #
76
+ # @return [Object] The deeply copy of the obejct object.
77
+ #
78
+ def self.deep_dup(object)
79
+ Xcodeproj::Project::ProjectHelper.deep_dup(object)
80
+ end
81
+ end
82
+ end
@@ -9,6 +9,8 @@ module Xcake
9
9
 
10
10
  def create_object_for(dsl_object)
11
11
  case dsl_object
12
+ when BuildPhase
13
+ create_object_for_build_phase(dsl_object)
12
14
  when Project
13
15
  create_object_for_project(dsl_object)
14
16
  when Target
@@ -20,6 +22,10 @@ module Xcake
20
22
  end
21
23
  end
22
24
 
25
+ def create_object_for_build_phase(build_phase)
26
+ @project.new(build_phase.build_phase_type)
27
+ end
28
+
23
29
  def create_object_for_project(project)
24
30
  @project = Xcode::Project.new("./#{project.name}.xcodeproj", true)
25
31
  @project.setup_for_xcake
@@ -42,5 +48,9 @@ module Xcake
42
48
  pathname = Pathname.new path
43
49
  @project.file_reference_for_path(pathname)
44
50
  end
51
+
52
+ def scheme_list
53
+ @scheme_list ||= Xcode::SchemeList.new(@project)
54
+ end
45
55
  end
46
56
  end
data/lib/xcake/context.rb CHANGED
@@ -1,18 +1,42 @@
1
1
  require 'xcodeproj'
2
2
 
3
3
  module Xcake
4
+ # The Context is an object that tracking of native objects in the project
5
+ # format.
6
+ #
7
+ # It allows components of the Xcake generator system to retrieve the
8
+ # native representation of a DSL object which is useful for operations
9
+ # which require multiple steps.
10
+ #
11
+ # See XcodeprojContext and the Genrators for how this is used.
12
+ #
4
13
  module Context
14
+ # The internal hash of native objects reference by their
15
+ # related DSL object
16
+ #
5
17
  attr_accessor :object_hash
6
18
 
7
19
  def object_hash
8
20
  @object_hash ||= {}
9
21
  end
10
22
 
23
+ # This method returns or creates a native object
24
+ # for a DSL object
25
+ #
11
26
  def native_object_for(dsl_object)
12
27
  object_hash[dsl_object] ||= create_object_for(dsl_object)
13
28
  end
14
29
 
30
+ # This method returns or creates a file reference
31
+ # for a path
32
+ #
15
33
  def file_reference_for_path(path)
16
34
  end
35
+
36
+ # This method returns or creates a scheme list for
37
+ # the project
38
+ #
39
+ def scheme_list
40
+ end
17
41
  end
18
42
  end
@@ -4,11 +4,22 @@ module Xcake
4
4
  [TargetGenerator, ConfigurationGenerator]
5
5
  end
6
6
 
7
- def visit_project(project)
7
+ def visit_project(_project)
8
8
  EventHooks.run_hook :before_adding_user_schemes
9
+ end
10
+
11
+ def visit_target(target)
12
+ scheme_list = @context.scheme_list
13
+ native_target = @context.native_object_for(target)
9
14
 
15
+ scheme_list.create_schemes_for_target(native_target) unless native_target.test_target_type?
16
+ end
17
+
18
+ def leave_project(project)
19
+ scheme_list = @context.scheme_list
10
20
  native_project = @context.native_object_for(project)
11
- native_project.recreate_user_schemes
21
+
22
+ scheme_list.save(native_project.path)
12
23
  end
13
24
  end
14
25
  end
@@ -1,7 +1,7 @@
1
1
  module Xcake
2
- # TODO: In future this should just infer extra targets and add it to the DSL
3
- # we should then implement a 2nd pass generator which turns that DSL into
4
- # build phases
2
+ # This generator generates the build phases for each target
3
+ # in the project
4
+ #
5
5
  class TargetBuildPhaseGenerator < Generator
6
6
  def self.dependencies
7
7
  [TargetGenerator, TargetDependencyGenerator]
@@ -12,6 +12,14 @@ module Xcake
12
12
 
13
13
  native_target = @context.native_object_for(target)
14
14
 
15
+ target.build_phases.each do |phase|
16
+ EventHooks.run_hook :before_adding_custom_build_phase, phase, target
17
+
18
+ native_build_phase = @context.native_object_for(phase)
19
+ phase.configure_native_build_phase(native_build_phase, @context)
20
+ native_target.build_phases << native_build_phase
21
+ end
22
+
15
23
  target.target_dependencies.each do |dep|
16
24
  native_dep = @context.native_object_for(dep)
17
25
 
@@ -1,7 +1,7 @@
1
1
  module Xcake
2
2
  class TargetDependencyGenerator < Generator
3
3
  def self.dependencies
4
- [TargetGenerator]
4
+ [TargetGenerator, TargetLinkGenerator]
5
5
  end
6
6
 
7
7
  def visit_target(target)
@@ -14,13 +14,12 @@ module Xcake
14
14
  end
15
15
 
16
16
  def visit_target(target)
17
-
18
- paths_to_include = Dir.glob(target.include_files).map { |f|
17
+ paths_to_include = Dir.glob(target.include_files).map do |f|
19
18
  Pathname.new(f).cleanpath.to_s
20
- }
21
- paths_to_exclude = Dir.glob(target.exclude_files).map { |f|
19
+ end
20
+ paths_to_exclude = Dir.glob(target.exclude_files).map do |f|
22
21
  Pathname.new(f).cleanpath.to_s
23
- }
22
+ end
24
23
 
25
24
  paths = paths_to_include - paths_to_exclude
26
25
  paths.each do |p|
@@ -0,0 +1,25 @@
1
+ module Xcake
2
+ # This generator handles linking targets
3
+ # specified as being linked in the Cakefile
4
+ #
5
+ class TargetLinkGenerator < Generator
6
+ def self.dependencies
7
+ [TargetGenerator]
8
+ end
9
+
10
+ def visit_target(target)
11
+ return if target.linked_targets.empty?
12
+
13
+ native_target = @context.native_object_for(target)
14
+ frameworks_build_phase = native_target.frameworks_build_phase
15
+
16
+ target.linked_targets.each do |linked_target|
17
+ native_linked_target = @context.native_object_for(linked_target)
18
+ target.target_dependencies << linked_target
19
+
20
+ linked_product = native_linked_target.product_reference
21
+ frameworks_build_phase.add_file_reference(linked_product)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,6 +1,5 @@
1
1
  require 'claide'
2
2
 
3
- # TODO: Hook into UI Class somehow.
4
3
  module Xcake
5
4
  class Informative < StandardError
6
5
  include CLAide::InformativeError
@@ -5,10 +5,10 @@ module Xcake
5
5
  #
6
6
  class PathClassifier
7
7
  EXTENSION_MAPPINGS = {
8
- PBXFrameworksBuildPhase: %w{.a .dylib .so .framework}.freeze,
9
- PBXHeadersBuildPhase: %w{.h .hpp}.freeze,
10
- PBXSourcesBuildPhase: %w{.c .m .mm .cpp .swift .xcdatamodeld}.freeze,
11
- PBXResourcesBuildPhase: %w{.xcassets}.freeze
8
+ PBXFrameworksBuildPhase: %w(.a .dylib .so .framework).freeze,
9
+ PBXHeadersBuildPhase: %w(.h .hpp).freeze,
10
+ PBXSourcesBuildPhase: %w(.c .m .mm .cpp .swift .xcdatamodeld).freeze,
11
+ PBXResourcesBuildPhase: %w(.xcassets).freeze
12
12
  }.freeze
13
13
 
14
14
  # @note This should be overidden
@@ -27,7 +27,7 @@ module Xcake
27
27
 
28
28
  def self.classification_for_path(path)
29
29
  classification = EXTENSION_MAPPINGS.detect do |_key, ext_group|
30
- ext_group.any? {|ext| File.extname(path) == ext}
30
+ ext_group.any? { |ext| File.extname(path) == ext }
31
31
  end
32
32
 
33
33
  return :PBXResourcesBuildPhase if classification.nil?
@@ -94,11 +94,13 @@ module Xcake
94
94
  test_target.language = host_target.language
95
95
 
96
96
  host_path = "#{host_target.name}.app/#{host_target.name}"
97
- test_target.all_configurations.each do |c|
98
- c.settings['TEST_HOST'] = "$(BUILT_PRODUCTS_DIR)/#{host_path}"
99
- end
100
- test_target.all_configurations.each do |c|
101
- c.settings['BUNDLE_LOADER'] = '$(TEST_HOST)'
97
+
98
+ # TODO: Custom Xcode setting constant
99
+ if host_target.type == :application
100
+ test_target.all_configurations.each do |c|
101
+ c.settings['TEST_HOST'] = "$(BUILT_PRODUCTS_DIR)/#{host_path}"
102
+ c.settings['BUNDLE_LOADER'] = '$(TEST_HOST)'
103
+ end
102
104
  end
103
105
  end
104
106
 
data/lib/xcake/project.rb CHANGED
@@ -13,7 +13,6 @@ module Xcake
13
13
 
14
14
  # @!group Configuring a project
15
15
 
16
- # TODO: Rename to name
17
16
  # @return [String] the name of the project file. This is used as
18
17
  # the filename.
19
18
  #
@@ -4,10 +4,6 @@ module Xcake
4
4
  @project
5
5
  end
6
6
 
7
- # TODO: Move this to a constant, maybe Xcodeproj ones should be brought
8
- # into here?
9
- #
10
- # Perhaps these could be made into a Gem itself?
11
7
  def default_settings
12
8
  {
13
9
  'INFOPLIST_FILE' => "#{name}/Supporting Files/Info.plist"
@@ -15,7 +11,7 @@ module Xcake
15
11
  end
16
12
 
17
13
  def default_debug_settings
18
- Xcodeproj::Project::ProjectHelper
14
+ Xcake::Constants
19
15
  .common_build_settings(:debug,
20
16
  platform,
21
17
  deployment_target.to_s,
@@ -26,7 +22,7 @@ module Xcake
26
22
  end
27
23
 
28
24
  def default_release_settings
29
- Xcodeproj::Project::ProjectHelper
25
+ Xcake::Constants
30
26
  .common_build_settings(:release,
31
27
  platform,
32
28
  deployment_target.to_s,
@@ -2,10 +2,35 @@ require 'xcodeproj'
2
2
 
3
3
  module Xcake
4
4
  class Target
5
- def shell_script_build_phase(name, script)
6
- phase = ShellScriptBuildPhase.new
5
+ # Creates a new Copy Headers build phase for the
6
+ # target
7
+ #
8
+ # @param [Proc] block
9
+ # an optional block that configures the build phase through the DSL.
10
+ #
11
+ # @return [HeadersBuildPhase] the new xcode build phase
12
+ #
13
+ def headers_build_phase(&block)
14
+ phase = HeadersBuildPhase.new(&block)
15
+ build_phases << phase
16
+ phase
17
+ end
18
+
19
+ # Creates a new Shell Script build phase for the
20
+ # target
21
+ #
22
+ # @param [String] name
23
+ # the name to use for the build phase
24
+ #
25
+ # @param [Proc] block
26
+ # an optional block that configures the build phase through the DSL.
27
+ #
28
+ # @return [ShellScriptBuildPhase] the new xcode build phase
29
+ #
30
+ def shell_script_build_phase(name, script, &block)
31
+ phase = ShellScriptBuildPhase.new(&block)
7
32
  phase.name = name
8
- phase.script = script.strip_heredoc
33
+ phase.script = script
9
34
  build_phases << phase
10
35
  phase
11
36
  end