在Linux Alpine下构建llvm 6

时间:2018-05-09 16:32:39

标签: build clang llvm alpine libc++

我正在尝试在llvm 6 Docker容器上构建Linux Alpine

以下是我在these instructions之后所做的事情:

  • apk add build-base
  • apk add python
  • apk add zlib
  • svn co http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_600/final/ llvm
  • svn co http://llvm.org/svn/llvm-project/cfe/tags/RELEASE_600/final/ clang
  • svn co http://llvm.org/svn/llvm-project/libcxx/tags/RELEASE_600/final/ libcxx

(相应文件夹中的所有svn次来电,显然)

  • 然后我创建build文件夹并执行cmake -G "Unix Makefiles" ../llvm

然而,当我到达make时,稍后它会死于以下内容:

    [ 11%] Building CXX object projects/libcxx/lib/CMakeFiles/cxx_objects.dir/__/src/algorithm.cpp.o
In file included from /root/llvm/projects/libcxx/include/ostream:140:0,
                 from /root/llvm/projects/libcxx/include/istream:163,
                 from /root/llvm/projects/libcxx/include/random:1646,
                 from /root/llvm/projects/libcxx/src/algorithm.cpp:11:
/root/llvm/projects/libcxx/include/locale: In function '_Tp std::__1::__num_get_signed_integral(const char*, const char*, std::__1::ios_base::iostate&, int)':
/root/llvm/projects/libcxx/include/locale:739:76: error: there are no arguments to 'strtoll_l' that depend on a template parameter, so a declaration of 'strtoll_l' must be available [-fpermissive]
         long long __ll = strtoll_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE);
                                                                            ^
/root/llvm/projects/libcxx/include/locale:739:76: note: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
/root/llvm/projects/libcxx/include/locale: In function '_Tp std::__1::__num_get_unsigned_integral(const char*, const char*, std::__1::ios_base::iostate&, int)':
/root/llvm/projects/libcxx/include/locale:779:86: error: there are no arguments to 'strtoull_l' that depend on a template parameter, so a declaration of 'strtoull_l' must be available [-fpermissive]
         unsigned long long __ll = strtoull_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE);
                                                                                      ^
At global scope:
cc1plus: warning: unrecognized command line option '-Wno-noexcept-type'
make[2]: *** [projects/libcxx/lib/CMakeFiles/cxx_objects.dir/build.make:63: projects/libcxx/lib/CMakeFiles/cxx_objects.dir/__/src/algorithm.cpp.o] Error 1

我错过了什么,比如依赖?或者这是一个需要修复的已知错误?我应该怎样做才能在Linux Alpine上获得最新的llvm + clang + libc++

2 个答案:

答案 0 :(得分:4)

在撰写本文时,有an open pull request将llvm6添加到aports。因为它involves有很多补丁和调整,所以从阿尔卑斯山的源头构建起来似乎并不容易理解。

所以,我们完全有理由相信很快就会出现official llvm6 package,但在出现之前,您可以使用该PR中的APKBUILD从源代码构建llvm。

安装依赖关系

abuild是Alpine用于编译其包的实用程序。

npm install rxjs@6 rxjs-compat@6 --save

abuild 将自动安装您需要的大部分依赖项,但PR中的依赖项列表中缺少apk add alpine-sdk

diffutils

停止 root

abuild 拒绝以 root 身份运行,因此如果您还没有,请创建一个用户帐户。我正在使用用户名 apk

apk add diffutils

克隆PR并编译​​

adduser apk
adduser apk abuild
su - apk
abuild-keygen -a

git clone --depth=1 -b pr-llvm-6 https://github.com/xentec/aports cd aports/main/llvm6 abuild -r 确实需要很长时间,所以如果你一直跟进,现在可能是午休的好时机。

安装生成的软件包

如果一切顺利, abuild 将在$ HOME / packages / main中放置一堆.apk文件。再次假设用户帐户名为 apk ,其主文件夹为 / home / apk ,然后以root身份

abuild -r

感谢并感谢PR的作者:https://github.com/xentec

编辑:Dockerfile代码段

由于你的问题提到了Docker,这里有一个cp /home/apk/.abuild/*.rsa.pub /etc/apk/keys apk add /home/apk/packages/main/$(uname -m)/*.apk 命令你可以插入:

RUN

答案 1 :(得分:0)

我使用了Dan的代码并将其推送到DockerHub。
由于在本地构建需要花费一些时间,因此预构建的映像可能对某些用户有用:)
py36-alpine-llvm6(DockerHub)