Automatically adding generated source files to an xcode project Automatically adding generated source files to an xcode project xcode xcode

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:

  1. First it needs a list of compile targets for added files.
  2. 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.