麻烦用自动工具构建通用二进制文件

| 我有一个使用自动工具在OS X上构建的项目。我想构建一个通用二进制文件,但是在
OBJCFLAGS
中放置多个
-arch
选项会与gcc的
-M
(automake用于依赖跟踪)冲突。我可以看到一些解决方法,但似乎没有一个简单明了。 有没有办法使预处理与编译分开(因此-M赋予
CPP
,而-arch赋予
OBJC
)? 我可以看到automake支持禁用依赖项跟踪的选项,并在无法完成时将其启用作为副作用。即使有基于副作用的跟踪可用,有没有办法强制使用较旧的跟踪方式? 我没有5英镑的经验。有没有什么好的方法可以将其绑定到自动工具工作流程中?     
已邀请:
这份Apple技术说明看起来很有希望,但是我还没有做过。我认为您只需要在准备发布时进行通用构建,那么也许可以在没有依赖项跟踪的情况下进行?     
这里有一些解决方案。而且很可能使我回避。 最简单,最快的方法是在./configure中添加ѭ6。 这将告诉它根本不生成依赖项。依赖阶段是杀死您的原因,因为在代码生成期间使用了-M依赖选项。如果有多个目标架构,则无法完成。 因此,如果您要在别人的程序包上进行干净的构建,这是“很好”。或您不介意在每次构建之前进行“清理”。如果您要在源代码上进行黑客攻击,尤其是头文件,那么这样做就不好了,因为make可能不知道要重建什么内容,并且会留下陈旧的二进制文件。 更好,但更危险的做法是:
CC=clang CXX=clang++ ./configure
这将使编译器变成clang而不是gcc。如果您有最新的Xcode,则可以使用clang。 Configure将认识到clang符合编译要求,但还将决定它对于自动依赖项生成是不安全的。而不是禁用自动依赖项生成,它将执行旧式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
您可能不希望使用这些确切的标志,但这应该可以使您了解。 脂。听起来您走这条路。我发现最好的方法如下: 一种。制作顶级目录,例如
.X86_64
和top10ѭ。注意前面的“。”。如果将构建目标定位到源目录中,通常需要以点开头,以免日后搞砸“ make clean”。 b。使用以下命令运行./configure:--prefix =`pwd` / .i386`,但是您要设置体系结构(在本例中为i386)。 C。进行make和
make install
,并假设一切都在
make clean
中顺利进行,并确保材料仍在ѭ10for中。对每种体系结构重复此操作。每个阶段末尾的ѭ12非常重要,因为重新配置可能会更改要清除的内容,并且您确实想确保您不会污染具有旧体系结构文件的体系结构。 d。假定您按照自己的方式构建了所有构建,我通常会制作一个外观看起来像这样的shell脚本,最后运行该脚本,这将为您带来很多好处。
# 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
我还没有弄清楚的是让我使用gcc和老式2通道dep gen的魔力。坦白说,随着对clang / llvm的印象越来越深刻,我每天都越来越在乎。 祝好运!     

要回复问题请先登录注册