Automatically adding generated source files to an xcode project
I also spent a couple of days writing a solution for this problem. Here is a ruby script that you can add to your project's target as a run script build phase. This was tested with XCode 3.2.4 and ruby 1.8.7.
For this to work you will need to install rb-appscript ruby gem. ( eg: sudo gem install rb-appscript )
There is little setup to do:
- First it needs a list of compile targets for added files.
- Second it expects a project group name which it will synchronize with it's associated disk folder ('objc' in my case) . Obviously this group needs to exist and to point to a real folder.
Here is the script:
require 'rubygems'require 'appscript'target_names = ['MinitSample'] # Put your target names heregroup_name = 'objc' # Name of Xcode project group where to add the generated filesproject_name = ENV["PROJECT_NAME"]project_dir = ENV["PROJECT_DIR"]xcode = Appscript.app('Xcode')project = xcode.projects[project_name]group = project.groups[group_name]group_path = group.real_path.getgenerated_files = Dir.glob(group_path+"/*.m")missing_files = Array.new(generated_files)group.item_references.get.each {|item| item_path = item.real_path.get missing_files.delete(item_path) if ! generated_files.include?(item_path) then group.file_references[item.name.get].delete puts "Deleting #{File.basename(item_path)} from group #{group_name}, as it is not in generated files list" end}if missing_files.empty? then puts "There are no new files to add. " exitend# holds the compile targets for generated filestargets = []project.targets.get.each{ |target| targets << target if target_names.include?(target.name.get)}if targets.empty? then puts "Unable to find #{target_names.inspect} in project targets ! Aborting" exitendmissing_files.each{ |path| file_name = File.basename(path) msg = "Adding #{file_name} to group #{group_name} and to targets: " item = xcode.make(:new => :file_reference, :at => group.item_references.after, :with_properties => {:full_path => path, :name => file_name}) targets.each {|target| xcode.add(item,{:to=>target}) msg += target.name.get } puts msg}
A good idea can be found here: https://stackoverflow.com/a/17894337/354018
Basically, you import the generated .m
files into a known source file that is added to the compile phase.
I've added a radar (details at http://www.openradar.me/radar?id=4885314376040448) asking for support for this.