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

Android 用于嵌入SCons makery的ARM的交叉编译Swiften库,android,scons,swiften,Android,Scons,Swiften,Swiften是一个XMPP客户端库,我的目标是为运行Linux的ARM嵌入式目标构建它 我在不了解SCON的情况下成功地进行了交叉编译。我将在这里展示我的技巧,希望有人能给我指出一个使用两个makery文件的可维护解决方案,SConscript.boot和SConstruct 我有两项任务(都没有圆满完成): 成功地将工具链从本机编译切换到交叉编译 确保OpenSSL库成功链接(不是由项目提供的;它们必须安装并构建在3rdParty文件夹中) 为ARM将工具链从本机编译切换到交叉编译 我的手臂

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

我在不了解SCON的情况下成功地进行了交叉编译。我将在这里展示我的技巧,希望有人能给我指出一个使用两个makery文件的可维护解决方案,
SConscript.boot
SConstruct

我有两项任务(都没有圆满完成):

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

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

    因此,作为一名黑客,我不得不将本机工具链更改为指向交叉工具链

    /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链接

    为了让示例Switften程序与OpenSSL库链接,我必须将
    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、android等
  • 将OpenSSL集成到构建中的干净方法 更新 根据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
    

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

    至于“将OpenSSL集成到构建中的干净方法”,这可以通过添加库和适当地包括路径来实现,如下所示,适当地替换引用的值: (无需复制/移动原始文件)


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

    至于“将OpenSSL集成到构建中的干净方法”,这可以通过添加库和适当地包括路径来实现,如下所示,适当地替换引用的值: (无需复制/移动原始文件)


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


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

    Brady的答案是正确的,关于如何在普通的烤饼中实现它。我只想提到Swiften的顶级SCOnstucture已经提供了诸如“
    cc=
    ”和“
    cxx=
    ”之类的参数来使用本地工具链。 您可能需要检查
    scons-h
    的输出,以获得可用选项的完整列表


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

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

    这应该以同样的方式用于交叉编译


    要使用捆绑的openssl,您应该能够提取到第三方/openssl,并将
    openssl\u force\u bundled=True
    添加到config.py。您不需要自己去摆弄设置include路径。可以想象,这与特定的openssl版本有关,因为我从1.0.0a开始就没有编译过捆绑的openssl,但是如果它不能与当前版本一起工作,那么可能是一个应该修复的bug。您也可以自己交叉编译openssl并使用
    openssl='/path/to/openssl'
    ,但这对您来说有点麻烦。

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

    这应该以同样的方式用于交叉编译

    要使用捆绑的openssl,您应该能够提取到第三方/openssl,并将
    openssl\u force\u bundled=True
    添加到config.py。您不需要自己去摆弄设置include路径。可以想象的是,这是t
    # 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"])
    
    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"