Swiften是一个XMPP客户端库,我的目标是为运行Linux的ARM嵌入式目标构建它。
我在没有SCons知识的情况下攻击了成功的交叉编译。我会在这里布置我的黑客,希望有人可以使用两个makery文件SConscript.boot
和SConstruct
为我指出一个可维护的解决方案。
我有两项任务(既没有令人满意地完成):
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不起作用(虽然不推荐,但在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.a
和libcrypto.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的工作情况,我已经做了一些破解工作。
我想要一些帮助:
更新 每个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
答案 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'
,但这对你来说更麻烦。