2013-11-03 113 views
1

我正在構建一個新的Xcode項目模板,我想包含一個非ARC的庫。但是我的整個項目是ARC,因此如何構建項目的唯一方法是在該庫的文件中指定一個編譯器標誌(-fno-objc-arc)。Xcode項目模板中的每個文件編譯器標誌

如何在Xcode項目模板中執行此操作?
我試圖在Definitions字典中的特定文件上將它設置爲COMPILER_FLAG和CompilerFlag。它們都不起作用。

我已經發現絕對沒有這方面的文件,但我很確定它可以完成。

UPDATE:
蘋果回答我的支持請求,說明沒有這樣做,現在的方式。很不幸,我們運氣不佳,直到他們終於對模板及其文檔做了些什麼。

更新2:
我有一個想法如何使用編階段腳本,將檢查Xcode項目並添加所需的標誌破解這一點。我會很快發佈答案。

回答

1

好了,即使我從蘋果公司消極應對(他們不支持這個在他們的模板解析器),我已經找到了如何做到這一點。

我基本上將新的構建階段添加到模板運行腳本。這個腳本會用-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" 

然後,取下構建階段(用腳本),所以它不會在每次運行。

我會盡快用完整的代碼更新這個答案。

+0

你如何在編譯器之前運行它?我的編譯失敗是因爲在運行實際運行腳本之前編譯會檢查我的「編譯源」。我也嘗試將腳本拖動到「編譯源代碼」之前的行中。 – kevinl

+0

我之前就把它拖過去了,就這些。它應該工作。 –

+0

你是怎麼最終用腳本去除構建階段的? – kevinl

0

您可以將此標誌添加到項目構建階段>編譯源代碼中,如下面的屏幕截圖所示。將這個標誌在這個庫中的所有.m文件:

enter image description here

+0

對不起,我已經知道了。我在問如何在創建Xcode項目模板時這麼做。 –

+0

那麼你的問題的答案是否定的,除了一些解決方法http://stackoverflow.com/questions/8691921/can-a-custom-xcode-template-partially-and-selectively-enable-arc-automatic-refe –

+0

我現在已經得到蘋果證實。這真的不可能。 –

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標誌,並且不再需要此腳本。這使我能夠在不刪除實際腳本的情況下運行構建。

+1

好主意。 +1。如果你不介意有一個額外的構建階段,那麼這將是要走的路。您也可以在if條件之後移動回顯,因此只有在實際添加編譯器標誌時纔打印出來。 –

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 

剛剛更新與適當的.m文件陣列REQUIRE_ARC和REQUIRE_NO_ARC(內容用空格隔開)。 同時更新測試用例STR_TEST_CASE

應該將此腳本添加到xcode項目(位於編譯源之上)的構建階段(編輯器>添加構建階段>添加運行腳本構建階段)。

非常感謝各位的幫助,導致了這個腳本。

- 丹