有没有办法让XCode构建设置根据构建ACTION(例如,清理,重建)而变化?

时间:2013-04-15 02:10:40

标签: xcode scons xcodebuild

我正在努力弄清schemes xcodescons中的确切运作方式以及它们的用途。我有一个使用外部构建系统(Xcode)在OS X上构建的跨平台产品。我希望能够从eclipse CDT 构建/调试,主要是因为符号搜索和调试器。我一直在使用$(TARGET),这种方法效果很好,但有一些怪癖。

我可以通过创建一个空项目并添加'外部构建系统'目标来实现这一点。然后,作为目标的'信息'的一部分,我将'构建工具'指定为 / usr / local / bin / scons 'Arguments'是我发送给scons的构建参数。基本上我有以下构建变量$(BUILD_TYPE)Menu->Project->Clean,这些变量根据构建是调试还是发布而有所不同,因此可以将它们指定为条件'构建设置'

问题是我希望Xcode/xcodebuilder能够正常工作。看起来$(ACTION)使用$(ACTTION)变量来传递此信息 - 其中scons -c'build''clean'或其他一些构建操作。见xcodebuild ACTION。 Scons有点不同 - 它有一个内置的干净动作,在ACTION的命令行上调用。所以我的第一个想法是使用条件'构建设置'来传递此参数,但事实证明条件'构建设置'似乎不会因此而异构建Xcode/xcodebuilder - 只是构建体系结构和SDK。

是否可以在Xcode中为'构建设置'添加表达式?还有另一种好方法,我可以使用'清洁'在{{1}}中使用scons吗?

4 个答案:

答案 0 :(得分:5)

SCons编写一个包装脚本,并将其放入您的项目中。例如:

外部构建工具配置

  • 构建工具:$(PROJECT_DIR)/scons-xcode-wrapper.sh
  • 参数:$(ACTION)

包装脚本

从实验中看,$(ACTION)在构建时显示为空,在清理时设置为clean

#!/bin/sh
cd "$PROJECT_DIR"
case $1 in
  clean)
    scons -c
    ;;
  *)
    scons
    ;;
esac

不要忘记chmod +x你的剧本。

答案 1 :(得分:1)

使用SCons,您可以以编程方式设置构建以使用SetOption()函数执行清理。 clean选项和其他可以设置的选项列在here

问题是SCons将命令行选项视为“--option”或“option = value”形式的目标。所以它不可能导致scons clean之类的东西执行干净。我使用Alias()函数进行了测试,无法使其工作。

如果您可以选择将xcode用于$(ACTION)的字符串更改为clean=1之类的字符,那么您可以使用以下内容来以编程方式执行清理:< / p>

env = Environment()

if ARGUMENTS.get('clean') == '1':
    print "Setting clean"
    env.SetOption('clean', True)

print env.GetOption('clean')
...

这会导致干净:

scons clean=1

你也可以考虑AddOption(),但这只允许--前置的选项

答案 2 :(得分:1)

将'Arguments'参数设置为以:

结束
--$(ACTION)

这将转换为:

scons [all your arguments] --clean

如果您查看scons here的文档,则可以看到--clean-c

一样有效

Clean是唯一有效的,其他构建操作总是空白。

答案 3 :(得分:0)

您可以结合使用上述答案,即:

  1. 将您的参数设置为--xcode-action=$(ACTION)

  2. 将代码放入SConstruct中,如下所示:

    env.AddOption('--xcode-action',
                  dest='xcode_action',
                  type='string',
                  action='store',
                  default='',
                  help='The action Xcode wishes to perform')
    
    if GetOption('xcode_action') == 'clean':
        SetOption('clean', True)
    
  3. 这基本上是我在scons-xcode中使用的解决方案。