Swiften 是一个 XMPP 客户端库,我的目标是为运行 Linux 的 ARM 嵌入式目标构建它。
在对 SCons 知之甚少的情况下,我成功地进行了交叉编译。我将在这里列出我的技巧,希望有人能指出我使用这两个制造文件的可维护解决方案,SConscript.boot
并且SConstruct
.
我有两个任务(都没有令人满意地完成):
- 成功将工具链从原生编译切换到交叉编译
- 确保 OpenSSL 库已成功链接(不是由swiftim项目提供的;它们必须安装并构建在
3rdParty
文件夹中)。
将工具链从本机编译切换到 ARM 的交叉编译
我的 ARM 跨工具链组件、gcc、g++、ld 等位于此处。
/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/arm-linux-gnueabihf/bin/
我找不到一种方法来告诉scons
使用交叉工具链(从上面的位置)而不是本机工具(在通常的位置,/usr/bin
)。在调用 ( ./scons Swiften
) 前加上环境变量的完全限定值,CC 和 CXX 不起作用(虽然不推荐,但它在一个地方提到过)。
即使在对制造商进行了许多临时更改之后,Scons 也只会选择本地工具链。
所以,作为一个黑客,我不得不改变原生工具链指向交叉工具链。
/usr/bin/gcc -> /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/bin/arm-linux-gnueabihf-gcc-4.7.3*
/usr/bin/g++ -> /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/bin/arm-linux-gnueabihf-g++*
通过将下面的行添加到构建脚本的默认部分来修复 ARM 的第一个编译中断,SConscript.boot
.
env.Append(CPPDEFINES = ["_LITTLE_ENDIAN"])
下一个编译中断与未找到 OpenSSL 头文件有关。为了解决位置问题,我不得不将下面的行引入 SConscript.boot
vars.Add(PackageVariable("openssl", "OpenSSL location", "/home/auro-tripathy/swiftim/swift/3rdParty/OpenSSL/openssl-1.0.1c/"))
与 OpenSSL 链接
对于与 OpenSSL 库链接的示例 Switften 程序,我必须像这样移动libssl.a
并libcrypto.a
(单独构建)从它们构建的位置到工具链库位置。
mv ~/swiftim/swift/3rdParty/OpenSSL/openssl-1.0.1c/libcrypto.a /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/lib/gcc/arm-linux-gnueabihf/4.7.3/.
帮助
不了解 scons 的工作原理,我做了一些技巧来让它工作。
我需要一些帮助:
- 与其他目标一样,引入一个名为 ARM-embedded 的新目标;iPhone、安卓等
- 将 OpenSSL 集成到构建中的干净方式。
更新 Per dirkbaechle,重试下面的脚本,它可以工作
export CC=/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/arm-linux-gnueabihf/bin/gcc
export CXX=/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/arm-linux-gnueabihf/bin/g++
./scons Swiften