Xcode项目模板中的每个文件编译器标志

时间:2013-11-03 08:20:49

标签: xcode templates plist

我正在构建一个新的Xcode项目模板,我想要包含一个非ARC的库。但是我的整个项目都是ARC,所以如何构建项目的唯一方法是在该库的文件上指定编译器标志(-fno-objc-arc)。

如何在Xcode项目模板中执行此操作? 我尝试在Definitions字典中的特定文件上设置它,包括COMPILER_FLAG和CompilerFlag。它们都不起作用。

我发现绝对没有关于此的文档,但我很确定它可以完成。

更新
Apple回复了我的支持请求,声称现在无法做到这一点。所以不幸的是,我们运气不好,直到他们最终对模板及其文档做了些什么。

更新2:
我已经知道如何使用构建阶段脚本来破解这一点,这将检查Xcode项目并添加所需的标志。我很快就会回答。

4 个答案:

答案 0 :(得分:2)

我知道这个页面已经老了,但我想提供我对所提供脚本的看法:

echo "Checking compiler flags."
PROJ_FILE="${PROJECT_FILE_PATH}/project.pbxproj"

REQUIRE_ARC=("File1ThatNeedsARC.m" "File2ThatNeedsARC.m")
REQUIRE_NO_ARC=("File1ThatNeedsARC.m" "File2ThatNeedsARC.m")

STR_TEST_CASE="File1ThatNeedsARC.m \*/; };"

if grep "${STR_TEST_CASE}" "$PROJ_FILE"
then
echo "Adding compiler flags."
for file in ${REQUIRE_ARC[@]}
do
STR_SRCH_ARC=$file" \*/; };"
STR_RPLC_ARC=$file" \*/; settings = {COMPILER_FLAGS = \"-fobjc-arc\"; }; };"
if grep "${STR_SRCH_ARC}" "$PROJ_FILE"
then
sed -i "" "s|${STR_SRCH_ARC}|${STR_RPLC_ARC}|g" "$PROJ_FILE"
fi
done
for file in ${REQUIRE_NO_ARC[@]}
do
STR_SRCH_NOARC=$file" \*/; };"
STR_RPLC_NOARC=$file" \*/; settings = {COMPILER_FLAGS = \"-fno-objc-arc\"; }; };"
if grep "${STR_SRCH_NOARC}" "$PROJ_FILE"
then
sed -i "" "s|${STR_SRCH_NOARC}|${STR_RPLC_NOARC}|g" "$PROJ_FILE"
fi
done
else
echo "Compiler flags already added."
exit 0
fi

只需适当地更新数组REQUIRE_ARC和REQUIRE_NO_ARC(用空格分隔的内容)和.m文件。 还更新测试用例STR_TEST_CASE

此脚本应添加到xcode项目的构建阶段(编辑器>添加构建阶段>添加运行脚本构建阶段)中(编译源代码上方)。

感谢每一个人为此提供了帮助,以便制作此脚本。

- 丹

答案 1 :(得分:1)

好的,即使我得到Apple的否定回复(他们在模板解析器中不支持这个),我找到了一种方法。

我基本上会在模板中添加新的构建阶段 - 运行脚本。这个脚本woudl用-fno-objc-arc标志标记所需的文件,然后从项目中删除它自己。

这是你可以添加标志的方法:

PROJ_FILE="${PROJECT_FILE_PATH}/project.pbxproj"
STR_SRCH="\* Class.m \*\/"
STR_RPLC="\* Class.m *\/; settings = {COMPILER_FLAGS = \"-fno-objc-arc\"; };"
sed -i "" "s|${STR_SRCH};|${STR_RPLC}|g" "$PROJ_FILE"

然后以类似的方式扫描项目文件并删除构建阶段(使用脚本),因此每次都不会运行。

我很快就会用完整的代码更新这个答案。

答案 2 :(得分:1)

尝试确保我的脚本在初始构建后没有运行后,我已完成以下操作:

 echo "Adding compiler flags"
PROJ_FILE="${PROJECT_FILE_PATH}/project.pbxproj"

STR_SRCH="SomeClass.m \*/; };"
STR_RPLC="SomeClass.m \*/; settings = {COMPILER_FLAGS = \"-fobjc-arc\"; }; };"

if grep "${STR_SRCH}" "$PROJ_FILE"
then
    sed -i "" "s|${STR_SRCH}|${STR_RPLC}|g" "$PROJ_FILE"
else
    exit 0
fi

grep将确保我有要更换的确切字符串。否则,我假设已经添加了fobjc-arc标志,我不再需要这个脚本。这使我可以在不删除实际脚本的情况下运行构建。

答案 3 :(得分:0)

您可以在项目Build Phases> Compile sources中添加此标志,如下面的屏幕截图所示。将此标志放在此库的所有.m文件中:

enter image description here