framework-x-xcodeprojgen 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. data/README.markdown +12 -0
  2. data/Rakefile +45 -0
  3. data/TODO +8 -0
  4. data/bin/xcodeprojgen +14 -0
  5. data/lib/xcode.rb +56 -0
  6. data/lib/xcode/frameworks.rb +100 -0
  7. data/lib/xcode/iphone.rb +29 -0
  8. data/lib/xcode/iphone_build_configurations.rb +48 -0
  9. data/lib/xcode/pbx_build_file.rb +25 -0
  10. data/lib/xcode/pbx_build_phase.rb +25 -0
  11. data/lib/xcode/pbx_copy_files_build_phase.rb +7 -0
  12. data/lib/xcode/pbx_file_reference.rb +66 -0
  13. data/lib/xcode/pbx_formatter.rb +52 -0
  14. data/lib/xcode/pbx_frameworks_build_phase.rb +7 -0
  15. data/lib/xcode/pbx_group.rb +47 -0
  16. data/lib/xcode/pbx_native_target.rb +24 -0
  17. data/lib/xcode/pbx_proj.rb +21 -0
  18. data/lib/xcode/pbx_project.rb +29 -0
  19. data/lib/xcode/pbx_resources_build_phase.rb +7 -0
  20. data/lib/xcode/pbx_sources_build_phase.rb +7 -0
  21. data/lib/xcode/xc_build_configuration.rb +20 -0
  22. data/lib/xcode/xc_configuration_list.rb +20 -0
  23. data/lib/xcodeproj_gen.rb +140 -0
  24. data/test/acceptance/command_line_foundation_test.rb +33 -0
  25. data/test/acceptance/command_line_in_c_test.rb +33 -0
  26. data/test/acceptance/test_helper.rb +18 -0
  27. data/test/unit/test_helper.rb +13 -0
  28. data/test/unit/xcode/pbx_build_file_test.rb +18 -0
  29. data/test/unit/xcode/pbx_build_phase_test.rb +27 -0
  30. data/test/unit/xcode/pbx_file_reference_test.rb +74 -0
  31. data/test/unit/xcode/pbx_formatter_test.rb +35 -0
  32. data/test/unit/xcode/pbx_group_test.rb +25 -0
  33. data/test/unit/xcode/pbx_native_target_test.rb +13 -0
  34. data/test/unit/xcode/pbx_project_test.rb +21 -0
  35. data/test/unit/xcode/xc_build_configuration_test.rb +15 -0
  36. data/test/unit/xcode/xc_configuration_list_test.rb +21 -0
  37. data/test/unit/xcode_test.rb +7 -0
  38. metadata +89 -0
data/README.markdown ADDED
@@ -0,0 +1,12 @@
1
+ xcodeprojgen
2
+ ============
3
+
4
+ Installing
5
+ ----------
6
+
7
+ Running
8
+ -------
9
+
10
+ Examples
11
+ --------
12
+
data/Rakefile ADDED
@@ -0,0 +1,45 @@
1
+ require "rake/testtask"
2
+
3
+ task :default => :test
4
+ task :pc => %w[test gemspec:generate]
5
+
6
+ task :test => %w[test:unit test:acceptance]
7
+ namespace :test do
8
+ Rake::TestTask.new(:acceptance) do |t|
9
+ t.pattern = "test/acceptance/**/*_test.rb"
10
+ end
11
+
12
+ Rake::TestTask.new(:unit) do |t|
13
+ t.pattern = "test/unit/**/*_test.rb"
14
+ end
15
+ end
16
+
17
+ gem_spec = Gem::Specification.new do |s|
18
+ s.name = "xcodeprojgen"
19
+ s.summary = "generates xcodeproj files"
20
+ s.version = "0.1.0"
21
+ s.author = "Dan Manges"
22
+ s.description = s.summary
23
+ s.email = "daniel.manges@gmail.com"
24
+ s.homepage = "http://github.com/framework-x/xcodeprojgen"
25
+ # s.rubyforge_project = "xcodeprojgen"
26
+
27
+ s.has_rdoc = false
28
+
29
+ s.executables = %w[xcodeprojgen]
30
+ s.files = FileList['{bin,lib,test}/**/*.rb', 'TODO', 'README.markdown', 'Rakefile'].to_a
31
+ end
32
+
33
+ task :gem => %w[test] do
34
+ Gem::Builder.new(gem_spec).build
35
+ end
36
+
37
+ namespace :gemspec do
38
+ desc "generates xcodeprojgen.gemspec"
39
+ task :generate do
40
+ File.open("xcodeprojgen.gemspec", "w") do |f|
41
+ f.puts "# this file is generated by rake gemspec:generate for github"
42
+ f.write gem_spec.to_ruby
43
+ end
44
+ end
45
+ end
data/TODO ADDED
@@ -0,0 +1,8 @@
1
+ * provide a way to add new frameworks
2
+ * clearer separation between xcodeprojgen options and xcode merge options
3
+ * including default project configurations for various project/target types
4
+ * more high-level acceptance tests and examples
5
+ * find or write an xcodeproj parser for better testing
6
+ * remove destructive parsing from xcodeprojgen
7
+ * make ignores configurable
8
+ * removing hard coding of FrameworksGroup
data/bin/xcodeprojgen ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ Object.class_eval do
4
+ # TODO: consider removing this, only here to help debug
5
+ undef_method :id
6
+ end
7
+
8
+ require "fileutils"
9
+ require "yaml"
10
+
11
+ require "xcode"
12
+ require "xcodeproj_gen"
13
+
14
+ XcodeprojGen.generate
data/lib/xcode.rb ADDED
@@ -0,0 +1,56 @@
1
+ require "digest/md5"
2
+
3
+ module Xcode
4
+ def self.objects
5
+ @objects ||= {}
6
+ end
7
+
8
+ def self.register(object)
9
+ id = Digest::MD5.hexdigest(rand.to_s + Time.now.usec.to_s).upcase[0,24]
10
+ objects[id] = object
11
+ id
12
+ end
13
+ end
14
+
15
+ Symbol.class_eval do
16
+ def to_proc
17
+ Proc.new { |o| o.send(self) }
18
+ end
19
+ end
20
+
21
+ $LOAD_PATH << File.dirname(__FILE__)
22
+ require "xcode/pbx_formatter"
23
+
24
+ require "xcode/pbx_build_file"
25
+ require "xcode/pbx_file_reference"
26
+ require "xcode/pbx_group"
27
+ require "xcode/pbx_proj"
28
+ require "xcode/pbx_project"
29
+ require "xcode/pbx_native_target"
30
+ require "xcode/pbx_build_phase"
31
+ require "xcode/pbx_resources_build_phase"
32
+ require "xcode/pbx_copy_files_build_phase"
33
+ require "xcode/pbx_sources_build_phase"
34
+ require "xcode/pbx_frameworks_build_phase"
35
+ require "xcode/xc_configuration_list"
36
+ require "xcode/xc_build_configuration"
37
+
38
+ require "xcode/frameworks"
39
+ require "xcode/iphone"
40
+ __END__
41
+ PBXBuildFile
42
+ PBXFileReference
43
+ PBXGroup
44
+
45
+ PBXProject
46
+ - PBXNativeTarget
47
+ -- PBXFrameworksBuildPhase
48
+ -- PBXResourcesBuildPhase
49
+ -- PBXSourcesBuildPhase
50
+ -- XCConfigurationList
51
+ --- XCBuildConfiguration
52
+
53
+ target has_many :build_phases
54
+ project has_many :targets
55
+ configuration_list has_many :build_configurations
56
+ target has_ony :buildConfigurationList
@@ -0,0 +1,100 @@
1
+ module Xcode
2
+ module Frameworks
3
+ AddressBook = Xcode::PBXFileReference.new(
4
+ "lastKnownFileType" => "wrapper.framework",
5
+ "name" => "AddressBook.framework",
6
+ "path" => "System/Library/Frameworks/AddressBook.framework",
7
+ "sourceTree" => "SDKROOT"
8
+ )
9
+ AddressBookUI = Xcode::PBXFileReference.new(
10
+ "lastKnownFileType" => "wrapper.framework",
11
+ "name" => "AddressBookUI.framework",
12
+ "path" => "System/Library/Frameworks/AddressBookUI.framework",
13
+ "sourceTree" => "SDKROOT"
14
+ )
15
+ AudioToolbox = Xcode::PBXFileReference.new(
16
+ "lastKnownFileType" => "wrapper.framework",
17
+ "name" => "AudioToolbox.framework",
18
+ "path" => "System/Library/Frameworks/AudioToolbox.framework",
19
+ "sourceTree" => "SDKROOT"
20
+ )
21
+ CoreGraphics = Xcode::PBXFileReference.new(
22
+ "lastKnownFileType" => "wrapper.framework",
23
+ "name" => "XCoreGraphics.framework",
24
+ "path" => "System/Library/Frameworks/CoreGraphics.framework",
25
+ "sourceTree" => "SDKROOT"
26
+ )
27
+ CoreLocation = Xcode::PBXFileReference.new(
28
+ "lastKnownFileType" => "wrapper.framework",
29
+ "name" => "CoreLocation.framework",
30
+ "path" => "System/Library/Frameworks/CoreLocation.framework",
31
+ "sourceTree" => "SDKROOT"
32
+ )
33
+ Foundation = Xcode::PBXFileReference.new(
34
+ "lastKnownFileType" => "wrapper.framework",
35
+ "name" => "Foundation.framework",
36
+ "path" => "System/Library/Frameworks/Foundation.framework",
37
+ "sourceTree" => "SDKROOT"
38
+ )
39
+ FrameworkX = Xcode::PBXFileReference.new(
40
+ "lastKnownFileType" => "wrapper.framework",
41
+ "name" => "FrameworkX.framework",
42
+ "path" => "frameworks/FrameworkX.framework",
43
+ "sourceTree" => "<group>"
44
+ )
45
+ FrameworkXCore = Xcode::PBXFileReference.new(
46
+ "lastKnownFileType" => "wrapper.framework",
47
+ "name" => "FrameworkXCore.framework",
48
+ "path" => "frameworks/FrameworkXCore.framework",
49
+ "sourceTree" => "<group>"
50
+ )
51
+ LibICU = Xcode::PBXFileReference.new(
52
+ "lastKnownFileType" => "wrapper.dylib",
53
+ "name" => "libicucore.dylib",
54
+ "path" => "usr/lib/libicucore.dylib",
55
+ "sourceTree" => "SDKROOT"
56
+ )
57
+ LibSQLite = Xcode::PBXFileReference.new(
58
+ "lastKnownFileType" => "wrapper.dylib",
59
+ "name" => "libsqlite3.0.dylib",
60
+ "path" => "/usr/lib/libsqlite3.0.dylib",
61
+ "sourceTree" => "SDKROOT"
62
+ )
63
+ LibXML = Xcode::PBXFileReference.new(
64
+ "lastKnownFileType" => "wrapper.dylib",
65
+ "name" => "libxml2.2.dylib",
66
+ "path" => "usr/lib/libxml2.2.dylib",
67
+ "sourceTree" => "SDKROOT"
68
+ )
69
+ OpenGLES = Xcode::PBXFileReference.new(
70
+ "lastKnownFileType" => "wrapper.framework",
71
+ "name" => "OpenGLES.framework",
72
+ "path" => "System/Library/Frameworks/OpenGLES.framework",
73
+ "sourceTree" => "SDKROOT"
74
+ )
75
+ Security = Xcode::PBXFileReference.new(
76
+ "lastKnownFileType" => "wrapper.framework",
77
+ "name" => "Foundation.framework",
78
+ "path" => "System/Library/Frameworks/Security.framework",
79
+ "sourceTree" => "SDKROOT"
80
+ )
81
+ SenTestingKit = Xcode::PBXFileReference.new(
82
+ "lastKnownFileType" => "wrapper.framework",
83
+ "name" => "SenTestingKit.framework",
84
+ "path" => "/Developer/Library/Frameworks/SenTestingKit.framework",
85
+ "sourceTree" => "<absolute>"
86
+ )
87
+ QuartzCore = Xcode::PBXFileReference.new(
88
+ "lastKnownFileType" => "wrapper.framework",
89
+ "name" => "QuartzCore.framework",
90
+ "path" => "System/Library/Frameworks/QuartzCore.framework",
91
+ "sourceTree" => "SDKROOT"
92
+ )
93
+ UIKit = Xcode::PBXFileReference.new(
94
+ "lastKnownFileType" => "wrapper.framework",
95
+ "name" => "UIKit.framework",
96
+ "path" => "System/Library/Frameworks/UIKit.framework",
97
+ "sourceTree" => "SDKROOT"
98
+ )
99
+ end
100
+ end
@@ -0,0 +1,29 @@
1
+ module Xcode
2
+ module IPhone
3
+ LinkedFrameworksGroup = Xcode::PBXGroup.new(
4
+ "name" => "Linked Frameworks",
5
+ "children" => [
6
+ # ::Xcode::Frameworks::AddressBook,
7
+ # ::Xcode::Frameworks::AddressBookUI,
8
+ # ::Xcode::Frameworks::AudioToolbox,
9
+ # ::Xcode::Frameworks::CoreGraphics,
10
+ # ::Xcode::Frameworks::CoreLocation,
11
+ ::Xcode::Frameworks::Foundation,
12
+ # ::Xcode::Frameworks::FrameworkX,
13
+ # ::Xcode::Frameworks::FrameworkXCore,
14
+ ::Xcode::Frameworks::LibICU,
15
+ # ::Xcode::Frameworks::LibSQLite,
16
+ # ::Xcode::Frameworks::LibXML,
17
+ # ::Xcode::Frameworks::OpenGLES,
18
+ # ::Xcode::Frameworks::QuartzCore,
19
+ # ::Xcode::Frameworks::Security,
20
+ # ::Xcode::Frameworks::SenTestingKit,
21
+ # ::Xcode::Frameworks::UIKit
22
+ ].map(&:id)
23
+ )
24
+ FrameworksGroup = Xcode::PBXGroup.new(
25
+ "name" => "Frameworks",
26
+ "children" => [LinkedFrameworksGroup].map(&:id)
27
+ )
28
+ end
29
+ end
@@ -0,0 +1,48 @@
1
+ module Xcode
2
+ module IPhoneBuildConfigurations
3
+ TargetDebug = {
4
+ "COPY_PHASE_STRIP" => "NO",
5
+ "FRAMEWORK_SEARCH_PATHS" => [%Q("$(inherited)"), %("\\"$(SRCROOT)/frameworks\\"")],
6
+ "GCC_DYNAMIC_NO_PIC" => "NO",
7
+ "GCC_ENABLE_FIX_AND_CONTINUE" => "NO",
8
+ "GCC_OPTIMIZATION_LEVEL" => "0",
9
+ "GCC_PRECOMPILE_PREFIX_HEADER" => "YES",
10
+ "GCC_PREFIX_HEADER" => "Prefix.pch",
11
+ # "GCC_WARN_INHIBIT_ALL_WARNINGS" => "YES",
12
+ "GCC_WARN_INHIBIT_ALL_WARNINGS" => "NO",
13
+ "HEADER_SEARCH_PATHS" => "/usr/include/libxml2",
14
+ "INFOPLIST_FILE" => "Info.plist"
15
+ }
16
+ TargetRelease = {
17
+ "COPY_PHASE_STRIP" => "YES",
18
+ "FRAMEWORK_SEARCH_PATHS" => [%Q("$(inherited)"), %("\\"$(SRCROOT)/frameworks\\"")],
19
+ "GCC_PRECOMPILE_PREFIX_HEADER" => "YES",
20
+ "GCC_PREFIX_HEADER" => "Prefix.pch",
21
+ "HEADER_SEARCH_PATHS" => "/usr/include/libxml2",
22
+ "INFOPLIST_FILE" => "Info.plist"
23
+ }
24
+ ProjectDebug = {
25
+ "ALWAYS_SEARCH_USER_PATHS" => "NO",
26
+ "ARCHS" => %q("$(ARCHS_STANDARD_32_BIT)"),
27
+ "FRAMEWORK_SEARCH_PATHS" => [%Q("$(inherited)"), %("\\"$(SRCROOT)/frameworks\\""), "/Developer/Library/Frameworks"],
28
+ "GCC_C_LANGUAGE_STANDARD" => "gnu99",
29
+ "GCC_WARN_ABOUT_RETURN_TYPE" => "YES",
30
+ "GCC_WARN_UNUSED_VARIABLE" => "YES",
31
+ # "GCC_WARN_INHIBIT_ALL_WARNINGS" => "YES",
32
+ "GCC_WARN_INHIBIT_ALL_WARNINGS" => "NO",
33
+ "LIBRARY_SEARCH_PATHS" => [%Q("$(inherited)")],
34
+ "ONLY_ACTIVE_ARCH" => "YES",
35
+ "PREBINDING" => "NO",
36
+ "HEADER_SEARCH_PATHS" => "/usr/include/libxml2",
37
+ "SDKROOT" => "iphoneos2.0"
38
+ }
39
+ ProjectRelease = {
40
+ "ARCHS" => %q("$(ARCHS_STANDARD_32_BIT)"),
41
+ "GCC_C_LANGUAGE_STANDARD" => "gnu99",
42
+ "FRAMEWORK_SEARCH_PATHS" => [%Q("$(inherited)"), %("\\"$(SRCROOT)/frameworks\\""), "/Developer/Library/Frameworks"],
43
+ "PREBINDING" => "NO",
44
+ "HEADER_SEARCH_PATHS" => "/usr/include/libxml2",
45
+ "SDKROOT" => "iphoneos2.0"
46
+ }
47
+ end
48
+ end
@@ -0,0 +1,25 @@
1
+ module Xcode
2
+ class PBXBuildFile
3
+ include PBXFormatter
4
+ attr_reader :id, :file_ref
5
+
6
+ def self.new_from_file(file, file_type = nil)
7
+ file_ref = Xcode::PBXFileReference.new_from_file(file, file_type)
8
+ new file_ref, file_type
9
+ end
10
+
11
+ def initialize(file_ref, file_type = nil)
12
+ @id = Xcode.register(self)
13
+ @file_ref = file_ref
14
+ @file_type = file_type
15
+ end
16
+
17
+ def attributes
18
+ {"fileRef" => @file_ref.id, "isa" => isa}
19
+ end
20
+
21
+ def isa
22
+ "PBXBuildFile"
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ module Xcode
2
+ class PBXBuildPhase
3
+ include PBXFormatter
4
+ attr_reader :id, :files
5
+
6
+ def initialize(files = [], attributes = {})
7
+ @id = Xcode.register(self)
8
+ @files = files
9
+ @attributes = attributes
10
+ end
11
+
12
+ def attributes
13
+ {
14
+ "isa" => isa,
15
+ "buildActionMask" => "2147483647",
16
+ "runOnlyForDeploymentPostprocesssing" => "0",
17
+ "files" => files.map(&:id)
18
+ }.merge(@attributes)
19
+ end
20
+
21
+ def isa
22
+ raise NotImplementedError, "subclasses must implement isa"
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ module Xcode
2
+ class PBXCopyFilesBuildPhase < PBXBuildPhase
3
+ def isa
4
+ "PBXCopyFilesBuildPhase"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,66 @@
1
+ module Xcode
2
+ class PBXFileReference
3
+ include Xcode::PBXFormatter
4
+ attr_reader :id
5
+
6
+ def self.file_reference_for_file(file)
7
+ @file_references ||= {}
8
+ @file_references[File.expand_path(file)] || raise("cannot find file ref for #{file}")
9
+ end
10
+
11
+ def self.new_from_file(file, file_type = nil)
12
+ attributes = {}
13
+ attributes["path"] = File.basename(file)
14
+ case File.extname(file)
15
+ when ".h"
16
+ attributes.merge! "lastKnownFileType" => "sourcecode.c.h", "fileEncoding" => "4"
17
+ when ".m"
18
+ attributes.merge! "lastKnownFileType" => "sourcecode.c.objc", "fileEncoding" => "4"
19
+ when ".a"
20
+ attributes.merge! "lastKnownFileType" => "archive.ar", "fileEncoding" => "4"
21
+ when ".plist"
22
+ attributes.merge! "lastKnownFileType" => "text.plist.xml", "fileEncoding" => "4"
23
+ when ".strings"
24
+ attributes.merge! "lastKnownFileType" => "text.plist.strings", "fileEncoding" => "10"
25
+ when ".png", ".tiff", ".jpg", ".jpeg"
26
+ ext = File.extname(file)
27
+ ext = ".jpeg" if ext == ".jpg"
28
+ attributes.merge! "lastKnownFileType" => "image#{ext}"
29
+ else
30
+ attributes.merge! "lastKnownFileType" => "file"
31
+ end
32
+ instance = new attributes, file_type
33
+ @file_references ||= {}
34
+ @file_references[File.expand_path(file)] = instance
35
+ instance
36
+ end
37
+
38
+ def initialize(attributes, file_type = nil)
39
+ @file_type = file_type
40
+ @id = Xcode.register(self)
41
+ @attributes = attributes
42
+ end
43
+
44
+ def attributes
45
+ result = {
46
+ "isa" => isa,
47
+ "sourceTree" => "<group>"
48
+ }.merge @attributes
49
+ result
50
+ end
51
+
52
+ def isa
53
+ "PBXFileReference"
54
+ end
55
+
56
+ def create_pbx_build_file
57
+ Xcode::PBXBuildFile.new(self, @file_type)
58
+ end
59
+
60
+ protected
61
+
62
+ def file_extension
63
+ File.extname(attributes["path"]).gsub('"',"")
64
+ end
65
+ end
66
+ end