- クロス開発環境はNetBSDが好き(個人的な意見です)
- NetBSDは自前のビルドシステム上で LLVM-3.6 をビルドするMakefileが用意されている(古い)
- LLVMがCMake使うようになってメンテが大変なのかしら?
- FreeBSDはカーネルもLLVMでビルドしてるだけあって、LLVM-3.8をサポート(いいなー)
- yacto とか crochet もいいんだけど、今回は見送り
-
[llvm] r203419 - Work around FreeBSD rtld rpath $ORIGIN limitation http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20140303/207795.html
-
BSDファミリーに入れたげて
*** dist/llvm/CMakeLists.txt.org 2016-10-21 17:36:00.682109043 +0900
--- dist/llvm/CMakeLists.txt 2016-10-21 17:35:18.761512845 +0900
*************** if (APPLE)
*** 623,629 ****
else(UNIX)
if(NOT DEFINED CMAKE_INSTALL_RPATH)
set(CMAKE_INSTALL_RPATH "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}")
! if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,origin")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,origin")
endif()
--- 623,629 ----
else(UNIX)
if(NOT DEFINED CMAKE_INSTALL_RPATH)
set(CMAKE_INSTALL_RPATH "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}")
! if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly|NetBSD)")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,origin")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,origin")
endif()
$ man -s 1 ld.elf_so
(snip)
$ORIGIN The directory of the main object. Implemented in ld.elf_so
but the kernel support is currently disabled.
$ strings /libexec/ld.elf_so | grep AUX
Bad pAUX_base
execname not specified in AUX vector
bad execname `%s' in AUX vector
$ grep -n "execname not specified in AUX vector" /usr/src/libexec/ld.elf_so/*
/usr/src/libexec/ld.elf_so/expand.c:86: xerr(1, "execname not specified in AUX vector");
$ORIGINを展開しようとしているけど、kernelが対応してないのでエラーになるのですと。
cmake(1)
と make(1)
を行ったり来たりするので、どっちのコンテキストにいるのか意識する。
[ 4%] Built target LLVMSupport
[ 4%] Built target LLVMTableGen
$ /vagrant/cmake-3.6.2/bin/cmake --build . --target LLVMTableGen -- -n
/vagrant/cmake-3.6.2/bin/cmake -H/vagrant/llvm/dist/llvm -B/vagrant/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/make -f CMakeFiles/Makefile2 LLVMTableGen
$ /usr/bin/make -n -f CMakeFiles/Makefile2 LLVMTableGen
/vagrant/cmake-3.6.2/bin/cmake -H/vagrant/llvm/dist/llvm -B/vagrant/build --check-build-system CMakeFiles/Makefile.cmake 0
/vagrant/cmake-3.6.2/bin/cmake -E cmake_progress_start /vagrant/build/CMakeFiles 0
/usr/bin/make -f CMakeFiles/Makefile2 lib/TableGen/CMakeFiles/LLVMTableGen.dir/all
/vagrant/cmake-3.6.2/bin/cmake -E cmake_progress_start /vagrant/build/CMakeFiles 0
$ /usr/bin/make -n -f CMakeFiles/Makefile2 lib/TableGen/CMakeFiles/LLVMTableGen.dir/all
/usr/bin/make -f lib/TableGen/CMakeFiles/LLVMTableGen.dir/build.make lib/TableGen/CMakeFiles/LLVMTableGen.dir/depend
/usr/bin/make -f lib/TableGen/CMakeFiles/LLVMTableGen.dir/build.make lib/TableGen/CMakeFiles/LLVMTableGen.dir/build
/vagrant/cmake-3.6.2/bin/cmake -E cmake_echo_color --switch= --progress-dir=/vagrant/build/CMakeFiles --progress-num= "Built target LLVMTableGen"
[ 6%] Built target obj.llvm-tblgen
[ 6%] Built target llvm-tblgen
$ (cd /vagrant/build; /vagrant/cmake-3.6.2/bin/cmake --build . --target llvm-tblgen -- -n)
/vagrant/cmake-3.6.2/bin/cmake -H/vagrant/llvm/dist/llvm -B/vagrant/build --check-build-system CMakeFiles/Makefile.cmake 0
$ (cd /vagrant/build; /usr/bin/make -f CMakeFiles/Makefile2 llvm-tblgen)
$ (cd /vagrant/build/; /usr/bin/make -f CMakeFiles/Makefile2 utils/TableGen/CMakeFiles/llvm-tblgen.dir/all)
/usr/bin/make -f lib/TableGen/CMakeFiles/LLVMTableGen.dir/build.make lib/TableGen/CMakeFiles/LLVMTableGen.dir/depend
/usr/bin/make -f lib/TableGen/CMakeFiles/LLVMTableGen.dir/build.make lib/TableGen/CMakeFiles/LLVMTableGen.dir/build
/vagrant/cmake-3.6.2/bin/cmake -E cmake_echo_color --switch= --progress-dir=/vagrant/build/CMakeFiles --progress-num= "Built target LLVMTableGen"
/usr/bin/make -f utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/build.make utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/depend
/usr/bin/make -f utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/build.make utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/build
/vagrant/cmake-3.6.2/bin/cmake -E cmake_echo_color --switch= --progress-dir=/vagrant/build/CMakeFiles --progress-num=98 "Built target obj.llvm-tblgen"
/usr/bin/make -f utils/TableGen/CMakeFiles/llvm-tblgen.dir/build.make utils/TableGen/CMakeFiles/llvm-tblgen.dir/depend
/usr/bin/make -f utils/TableGen/CMakeFiles/llvm-tblgen.dir/build.make utils/TableGen/CMakeFiles/llvm-tblgen.dir/build
/vagrant/cmake-3.6.2/bin/cmake -E cmake_echo_color --switch= --progress-dir=/vagrant/build/CMakeFiles --progress-num= "Built target llvm-tblgen"
[ 75%] Built target LLVMSupport
[ 75%] Built target LLVMTableGen
[100%] Built target obj.llvm-tblgen
[100%] Built target llvm-tblgen
[ 6%] Building Attributes.inc...
execname not specified in AUX vector: No such file or directory
*** Error code 1
/usr/bin/make -f include/llvm/IR/CMakeFiles/intrinsics_gen.dir/build.make include/llvm/IR/Attributes.inc
include/llvm/IR/CMakeFiles/intrinsics_gen.dir/build.make
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/vagrant/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building Attributes.inc..."
include/llvm/IR/CMakeFiles/intrinsics_gen.dir/build.make
56:include/llvm/IR/CMakeFiles/intrinsics_gen: include/llvm/IR/Attributes.inc
60:include/llvm/IR/Attributes.inc: include/llvm/IR/Attributes.inc.tmp
cd /vagrant/build/include/llvm/IR && ../../../bin/llvm-tblgen -gen-intrinsic -I /vagrant/llvm/dist/llvm/include/llvm/IR -I /vagrant/llvm/dist/llvm/lib/Target -I /vagrant/llvm/dist/llvm/include /vagrant/llvm/dist/llvm/include/llvm/IR/Intrinsics.td -o /vagrant/build/include/llvm/IR/Intrinsics.gen.tmp
cd /vagrant/build/include/llvm/IR && ../../../bin/llvm-tblgen -gen-attrs -I /vagrant/llvm/dist/llvm/include/llvm/IR -I /vagrant/llvm/dist/llvm/lib/Target -I /vagrant/llvm/dist/llvm/include /vagrant/llvm/dist/llvm/include/llvm/IR/Attributes.td -o /vagrant/build/include/llvm/IR/Attributes.inc.tmp
ここまで来てどうやらビルド上の問題ではないなと気づいて、冒頭のFreeBSD開発者レポートに行きついた。
感のいい人だとtblgen
実行時に動的リンクしようとして問題が起きているとことからld.elf_so(1)
との関連を疑うんでしょうな。