2011-05-24 56 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越来越印象深刻。

祝你好运!