【问题标题】:Building llvm 6 under Linux AlpineLinux Alpine下搭建llvm 6
【发布时间】:2018-05-09 16:32:38
【问题描述】:

我正在尝试在 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++

【问题讨论】:

  • 从它的外观来看,我猜这与您的主机编译器和/或标准库有关

标签: build clang llvm alpine libc++


【解决方案1】:

在撰写本文时,有 an open pull request 将 llvm6 添加到 aports。因为它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


编辑:Dockerfile 片段

由于您的问题提到了 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 https://stackoverflow.com/questions/50258121/building-llvm-6-under-linux-alpine
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

【讨论】:

  • 好的,请稍等。我试图运行你的 dockerfile,它工作得一尘不染。但是,clang 是和其他的一起安装的吗?我还需要 clang 和 libc++,它们是否包含在 apk 中?如果有,在哪里?
  • 不在我生成的指令的 APK 中,但 PR 上存在 clanglld APKBUILD。您也可以向 dockerfile 添加更多 abuild 行来获取这些包。 (IOW,复制&& sudo -iu apk sh -xec 'cd aports/main/llvm6; abuild -r' ` line and change the cd`路径
  • 对不起,我想我仍然缺少一些东西。例如,我尝试在aports/main/clang 中cd 并运行abuild -r,但我收到以下错误消息:>>> clang: Analyzing dependencies... ERROR: unsatisfiable constraints: .makedepends-clang-0: masked in: cache satisfies: world[.makedepends-clang] >>> ERROR: clang: all failed。它缺少什么样的依赖关系?我怎样才能安装它们?对不起……!!
  • 如果我能让这个工作正常,我很乐意为这个问题添加一个赏金!
  • clang 的 makedepends 行定义为here;看起来你需要做的是首先使用这个技巧安装llvm-devllvm-staticllvm-test-utils的第6版,然后为clang做abuild。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2019-03-17
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多