2011-05-24 57 views
1

我有一個使用自動工具在OS X上構建的項目。我想構建一個通用二進制文件,但OBJCFLAGS中的多個-arch選項與gcc的-M(automake用於依賴關係跟蹤)衝突。我可以看到一些解決方法,但沒有一個看起來很直接。使用自動工具構建通用二進制文件的麻煩

有沒有辦法迫使預處理是由編譯獨立(所以-M給予CPP,而-arch被交給OBJC)?

我可以看到,automake的支持禁用依賴跟蹤,並啓用它時,它不能作爲一個副作用進行選擇。即使基於副作用的跟蹤可用,是否有強制使用舊式跟蹤的方法?

我沒有與任何lipo經驗。有沒有一種很好的方式將其與自動工具工作流程聯繫起來?

回答

2

Apple Technical Note看起來很有希望,但它的東西我沒有做過。我認爲你只需要在準備發佈時做一個通用構建,那麼也許你可以不依賴於跟蹤?

+0

技術筆記是一個很好的資源,但最終它告訴我我所知道的(可以使用lipo或禁用依賴關係跟蹤)。儘管如此,您可以針對特定的版本啓用跟蹤。 – 2011-05-28 14:08:25

2

這裏有幾個解決方案;並可能是一個逃避我的人。

  1. 最簡單和最快的方法是將--disable-dependency-tracking添加到您運行的./configure中。

    這會告訴它不要生成依賴關係。依賴階段是什麼在殺死你,因爲在代碼生成期間正在使用-M依賴項選項;如果存在多個架構,則無法完成。

    因此,這是「精」,如果你正在做一個乾淨的構建在別人的包;或者你不介意在每次構建之前做一次「清潔」。如果你對源代碼進行黑客攻擊,特別是頭文件,這可能不好,因爲make可能不知道要重建什麼,並且會留下過時的二進制文件。

  2. 更好,但更危險的是做這樣的事情:

    CC=clang CXX=clang++ ./configure

    這將使編譯器鐺,而不是GCC。如果你有最近的Xcode,你會有鐺聲。配置會意識到,鐺滿足編譯要求,但也會決定它是不安全的自動依賴生成。它不會禁用自動依賴項生成,而會執行舊式的2代生成。

    警告:這可能是我這取決於你如何設置你的架構標誌描述或可能無法正常工作。如果您想要傳遞給所有編譯器調用的標誌(即:-I爲包含路徑),則應設置CPPFLAGS。對於代碼生成,請爲C和C++設置CFLAGS和CXXFLAGS(我假設爲ObjC使用COBJFLAGS)。通常你會爲這些添加$ CPPFLAGS。我通常鞭打一個shell腳本,如:

    #!/bin/bash 
    
    export CC=clang 
    export CXX=clang 
    
    export CPPFLAGS="-isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5 -fvisibility=hidden" 
    export CFLAGS="-arch i386 -arch x86_64 -O3 -fomit-frame-pointer -momit-leaf-frame-pointer -ffast-math $CPPFLAGS" 
    export CXXFLAGS=$CFLAGS 
    
    ./configure 
    

    你可能不想要這些確切的標誌,但它應該讓你的想法。

  3. lipo。聽起來像你走過這條路。我發現最好的方法是如下:

    一個。製作頂級目錄,如.X86_64.i386。注意'。'前面。如果您將構建目標定位到源代碼目錄中,通常需要以點開頭,以避免稍後造成「乾淨」。

    b。使用如下命令運行./configure:--prefix =`pwd`/.i386`,然後設置體系結構(在本例中爲i386)。

    c。做化妝,和make install,並假設它一切順利make clean並確保東西仍然在.i386重複每個架構。每個階段結束時的make clean非常重要,因爲重新配置可能會改變清理的內容,並且確實要確保不會污染具有舊體系結構文件的體系結構。 d)。假設你的所有構建方式都是你想要的,我通常會創建一個外觀腳本,看起來和感覺像這樣,最後運行,這會讓你感到厭倦。

    # move the working builds for posterity and debugging 
    mv .i386 ./Build/i386 
    mv .x86_64 ./Build/x86_64 
    
    for path in ./Build/i386/lib/* 
    do 
        file=${path##*/} 
        # only convert 'real' files                         
        if [ -f "$file" -a ! -L "$file" ]; then 
         partner="./Build/x86_64/Lib/$file" 
         if [ -f $partner -a ! -L $partner ]; then 
          target="./Build/Lib/$file" 
          lipo -create "$file" "$partner" -output "$target" || { echo "Lipo failed to get phat"; exit 5; } 
          echo Universal Binary Created: $target 
         else 
          echo Skipping: $file, no valid architecture pairing at: $partner 
         fi 
        else 
         # this is a pretty common case, openssl creates symlinks                 
         # echo Skipping: $file, NOT a regular file                     
         true 
        fi 
    done 
    
  4. 我還沒有想出是它可以讓我用gcc的魔力,和老同學2通DEP根。坦率地說,我越來越不在乎每一天,因爲我對clang/llvm越來越印象深刻。

祝你好運!