2

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

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

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

更新:
Apple 回复了我的支持请求,表示目前无法做到这一点。所以不幸的是,我们很不走运,直到他们最终对模板和他们的文档做一些事情。

更新 2:
我知道如何通过使用构建阶段脚本来破解这一点,它将检查 Xcode 项目并添加所需的标志。我会尽快发布答案。

4

4 回答 4

3

我知道这个页面很旧,但我想提供我对提供的脚本的看法:

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

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

此脚本应添加到您的 xcode 项目(在编译源之上)的构建阶段(编辑器>添加构建阶段>添加运行脚本构建阶段)。

感谢每个人的帮助,导致了这个脚本。

- 丹

于 2014-01-27T21:48:03.567 回答
2

在尝试确保我的脚本在初始构建后不会运行后,我做了以下事情:

 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 标志已经添加,我不再需要这个脚本。这允许我在不删除实际脚本的情况下运行构建。

于 2014-01-23T18:38:23.743 回答
2

好的,所以即使我得到了 Apple 的否定响应(他们在模板解析器中不支持这一点),我还是找到了一种方法。

我基本上会在模板中添加新的构建阶段 - 运行脚本。该脚本将使用该-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"

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

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

于 2013-11-08T00:30:15.687 回答
0

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

在此处输入图像描述

于 2013-11-03T08:41:09.140 回答