在 Linux Alpine 下构建 llvm 6

Building llvm 6 under Linux Alpine

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

以下是我所做的 these instructions:

(所有 svn 调用都在适当的文件夹中,显然)

但是,当我到达 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++ 的工作?

在撰写本文时,有 an open pull request to add llvm6 to aports. Because it involves 很多补丁和调整,似乎在 alpine 上从源代码构建并不容易搞清楚。

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

安装依赖项

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

apk add alpine-sdk

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

apk add diffutils

停止成为root

abuild 拒绝 运行 作为 root,所以如果您还没有,请创建一个用户帐户。我正在使用用户名 apk:

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

克隆 PR 并编译

git clone --depth=1 -b pr-llvm-6 https://github.com/xentec/aports
cd aports/main/llvm6
abuild -r

abuild -r确实会花很长时间,所以如果您继续跟进,现在可能是午休的好时机。

安装生成的包

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

cp /home/apk/.abuild/*.rsa.pub /etc/apk/keys
apk add /home/apk/packages/main/$(uname -m)/*.apk

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


编辑:Docker文件片段

既然你的问题提到了 Docker,这里有一个你可以插入的 RUN 命令:

# Temporary workaround for there not being an llvm6 apk yet
# Open PR for llvm6 package: https://github.com/alpinelinux/aports/pull/3583
# See 
RUN export BUILD_DEPS='alpine-sdk git diffutils' \
 && apk update \
 && apk add $BUILD_DEPS \
 && adduser -D apk \
 && adduser apk abuild \
 && sudo -iu apk abuild-keygen -a \
 && sudo -iu apk git clone --depth=1 -b pr-llvm-6 https://github.com/xentec/aports \
 && sudo -iu apk sh -xec 'cd aports/main/llvm6; abuild -r' \
 && cp /home/apk/.abuild/*.rsa.pub /etc/apk/keys \
 && apk add /home/apk/packages/main/$(uname -m)/*.apk \
 && deluser --remove-home apk \
 && rm -rf /var/cache/apk/APKINDEX* \
 && apk del --no-cache $BUILD_DEPS

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