1

Swiften 是一个 XMPP 客户端库,我的目标是为运行 Linux 的 ARM 嵌入式目标构建它。

在对 SCons 知之甚少的情况下,我成功地进行了交叉编译。我将在这里列出我的技巧,希望有人能指出我使用这两个制造文件的可维护解决方案,SConscript.boot并且SConstruct.

我有两个任务(都没有令人满意地完成):

  1. 成功将工具链从原生编译切换到交叉编译
  2. 确保 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.alibcrypto.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 的工作原理,我做了一些技巧来让它工作。

我需要一些帮助:

  1. 与其他目标一样,引入一个名为 ARM-embedded 的新目标;iPhone、安卓等
  2. 将 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
4

3 回答 3

3

布雷迪的回答是正确的,关于你如何在普通的 SCons 中做到这一点。我想提一下,Swiften 的顶级 SConstruct 已经为使用本地工具链提供了诸如“ cc=”和“ ”之类的参数。cxx=您可能需要检查输出以scons -h获取可用选项的完整列表。

此外,OpenSSL 构建的 SConscript 期望源位于名为“ openssl”的相对文件夹中,而不是openssl-1.0.1c像您的情况那样位于“”。也许这就是您的构建问题的主要来源。

于 2014-06-09T09:04:13.053 回答
1

我在上面留下了关于交叉编译的评论。它已经在提供的链接中得到了回答,但基本上您只需要设置适当的构造变量:CC、CXX、LINK 等。

至于“将 OpenSSL 集成到构建中的简洁方式”,这可以简单地通过添加库并包含路径来执行,如下所示适当地替换引用的值:(无需复制/移动原始文件)

# This sets the location of the OpenSSL Include paths
env.Append(CPPPATH="path/to/openssl/includes")

# This sets the location of the OpenSSL Libraries
env.Append(LIBPATH="path/to/openssl/libraries")

# These are the OpenSSL libraries to be linked into the binary
env.Append(LIBS=["OpenSSL_lib", "OpenSSL_lib2"])
于 2014-06-09T08:46:52.030 回答
1

编译器的选择和附加标志都可以在 Swift 的 config.py 文件中设置。下面是使用自定义编译器和标志的 config.py 片段(我在我的一个开发盒上使用的片段):

cc = link = "/usr/local/llvm-git/bin/clang"
cxx = "/usr/local/llvm-git/bin/clang++"

bothflags = " -std=c++11 -stdlib=libc++ -nostdinc++"
cxxflags = bothflags + " -I/usr/local/libcxx/include -Wno-deprecated"
linkflags = bothflags + " -L/usr/local/libcxx/lib"

这应该以相同的方式进行交叉编译。

要使用捆绑的 openssl,您应该能够提取到 3rdParty/OpenSSL,然后添加openssl_force_bundled = True到您的 config.py。您不需要自己设置包含路径。可以想象,这与特定的 openssl 版本相关,因为自 1.0.0a 以来我还没有编译过捆绑的 openssl,但如果它不适用于当前版本,则可能是一个应该修复的错误。您也可以自己交叉编译 openssl 并使用openssl='/path/to/openssl',但这对您来说有点麻烦。

于 2014-08-26T16:39:38.613 回答