问题描述
|
我有一个使用自动工具在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的印象越来越深刻,我每天都越来越在乎。
祝好运!