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.