在 Linux Alpine 下构建 llvm 6
Building llvm 6 under Linux Alpine
我正在尝试在 Linux Alpine
Docker 容器上构建 llvm 6
。
以下是我所做的 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++
的工作?
在撰写本文时,有 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)
我正在尝试在 Linux Alpine
Docker 容器上构建 llvm 6
。
以下是我所做的 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++
的工作?
在撰写本文时,有 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)