A tool for SCons to enable the generation of Xcode project files. Unlike CMake, the idea here is to get Xcode to run scons
, so that the SConstruct
file is still the master project file.
To use the tool, copy __init__.py
in this directory to a directory xcode
in your tool path. See the SCons documentation for more information on where you can install the file.
You can also clone the repository directly into your site_tools
directory with:
hg clone https://bitbucket.org/al45tair/scons-xcode xcode
Next, add the tool to your environment with something like the following:
env = Environment(tools=['default', 'xcode'])
Note
You need to include default
so that the built-in tools remain available.
To generate an Xcode project file, simply add a call to env.XCodeProject
to your SConstruct
file:
env = Environment(tools=['default', 'xcode'])
myprog = env.Program('build/MyProg', ['src/main.cc'])
env.XcodeProject('MyProject.xcodeproj',
products=myprog)
The resulting Xcode project file will contain only a single group, "Products", in which you will see the MyProg
program. It will also contain two legacy build system targets named "Everything" and "MyProg"; the former will run scons
without specifying a target, while the latter will explicitly specify MyProg
. The Xcode project will also have a shared build scheme defined for MyProg
that will cause it to run MyProg
if asked to run/debug (this only happens for env.Program
at present).
Obviously that project file is very minimal; you will probably want to include your own groups and source files in practice, which you can do by passing a dictionary into the XcodeProject
builder, e.g.:
env.XcodeProject('MyProject.xcodeproj',
groups={ 'Headers': [ 'src/MyProg.h' ],
'Sources': [ 'src/main.cc', 'src/utils.cc' ],
'Documentation': [ 'doc/README.rst' ] },
products=myprog)
Note also that products
accepts a list, so you can provide multiple products, in which case you will end up with additional targets in your Xcode project file.
Using the XcodeProject
builder also adds a couple of options to your SConstruct file, namely
- --xcode-action=ACTION Specifies the action Xcode was trying to take when it
ran
scons
- --xcode-variant=VARIANT Specifies the build configuration Xcode was using
when it ran
scons
These options are used by the legacy build targets automatically.
The Clean
action is handled automatically by the builder; if you wish to use variants, you can do so, for instance:
variant = 'Debug'
if GetOption('xcode_variant') == 'Release':
variant = 'Release'
if variant == 'Debug':
env.Append(CCFLAGS=['-g'])
else:
env.Append(CCFLAGS=['-Os'])
...
env.XcodeProject(...,
variants=['Debug', 'Release'],
...)
Take care if you do something like this:
myprog = env.Program(os.path.join('build', variant, 'MyProg'),
['src/main.cc'])
as you will find that the automatically generated build scheme will use the setting of variant
that was active when you generated the Xcode project file (in this case, most likely the default in your scons
file). You probably want to make sure the default is "Debug", or at least make sure it has some symbols.