用于嵌入SCons makery的ARM交叉编译Swiften库

时间:2014-06-09 01:36:04

标签: android scons swiften

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

我在没有SCons知识的情况下攻击了成功的交叉编译。我会在这里布置我的黑客,希望有人可以使用两个makery文件SConscript.bootSConstruct为我指出一个可维护的解决方案。

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

  1. 成功将工具链从本机编译切换为交叉编译
  2. 确保OpenSSL库已成功链接(不是由swiftim项目提供;必须在3rdParty文件夹中安装和构建它们。)
  3. 将工具链从本机编译切换为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不起作用(虽然不推荐,但在one place中提到)。

    即使在对makery进行了许多临时更改之后,Scons也只会 选择 native 工具链。

    因此,作为 hack ,我已经将原生工具链更改为指向跨工具链。

    /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(单独构建)从它们构建的位置移动到工具链库位置,如此。< / p>

    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,android等
    2. 将OpenSSL集成到构建中的简洁方法。
    3. 更新 每个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
      

3 个答案:

答案 0 :(得分:3)

Brady的回答是正确的,关于你如何在简单的SCons中做到这一点。我想提一下,Swiften的顶级SConstruct已经提供了类似&#34; cc=&#34;和&#34; cxx=&#34;使用本地工具链。 您可能需要检查scons -h的输出以获取可用选项的完整列表。

此外,OpenSSL构建的SConscript要求源位于名为&#34; openssl&#34;的相对文件夹中,而不是&#34; openssl-1.0.1c&#34 ;就像你的情况一样。也许你的构建问题主要来自哪里。

答案 1 :(得分: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"])

答案 2 :(得分: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,但是如果它不适用于当前版本,那么它可能是一个应该修复的bug。你也可以自己交叉编译openssl并使用openssl='/path/to/openssl',但这对你来说更麻烦。