ラベル GCC の投稿を表示しています。 すべての投稿を表示
ラベル GCC の投稿を表示しています。 すべての投稿を表示

2019年1月24日木曜日

Firefox (nightly)をclang 8 + libc++でbuildする

Firefox (nightly)をmercurialのsource treeからbuildしているのだが、先日Debian experimentalに入ったGCC 9をinstallした時に入ったlibstdc++が原因でbuildできない。ただし、これがlibrary側のbugなのか、それともFirefox側の記述に問題があるのかは切り分けていないため不明。

以前から薄々気付いてはいたのだが、error messageを見るに、LLVM/Clangでbuildした場合でもC/C++ standard libraryとしてGCCに付属するlibstdc++が使われている。GCC 9付属のlibstdc++がだめでも、LLVM/Clangに付属するlibc++なら大丈夫なのでは?と思い実験してみた所無事にbuildできた。

なお、GCC 9とLLVM/Clang 8ではdevelopment stageが異なるのでcodeのmature具合が違っていて当然な点、更にはexperimental packagesにtroubleがつきものなのは当然なので予め申し述べておく。Firefox nightlyのbuildもGCC 8に付属のlibstdc++なら正常にできる。


software environment


* Firefox nightly (Mercurial) → cset 454868:c60e6c0c2e23
* llvm-8:amd64/experimental 1:8~svn351401-1~exp1
* llvm-8-runtime:amd64/experimental 1:8~svn351401-1~exp1
* clang-8:amd64/experimental 1:8~svn351401-1~exp1
* lld-8:amd64/experimental 1:8~svn351401-1~exp1
* libc++-8-dev:amd64/experimental 1:8~svn351401-1~exp1
* libc++1-8:amd64/experimental 1:8~svn351401-1~exp1


build instruction


.mozconfigに以下の記述を行う:

export CC='clang-8 -stdlib=libc++'
export CXX='clang++-8 -stdlib=libc++'
ac_add_options --with-clang-path='/usr/lib/llvm-8/bin/clang'
ac_add_options --with-libclang-path='/usr/lib/llvm-8/lib'
ac_add_options --enable-linker=lld-8
ac_add_options --with-ccache=/usr/bin/ccache

今回の肝は、compilerを指定する最初の2行の"-stdlib=libc++"というoption (ただし、これをclang-8の側 (C++ではなくてC)に適用して良いのか、意味があるのかは不明)。Debian packageのclangはdefaultでlibstdc++ (GCC由来)を使うため、-stdlib optionでlibc++ (LLVM/Clang由来)を使うよう明示する。

また、standard libraryの変更とは直接関係ないが、ついでにFirefoxが用いるlibclangなどのpathを指定し、更にlinkerをbinutilsのldではなくLLVM/Clang由来のlldを用いるよう明示する (ほとんど気分の問題)。

あとはいつも通り:

./mach build

で暫く待つ。


2017年2月27日月曜日

Debian sid/experimentalのgcc-6/gcc-7でLinux kernelがbuildできない問題とその対応

Linux kernel 4.10.1がreleaseされたのでbuildしようとしたら……

>   LD      vmlinux
> kernel/built-in.o: In function `update_wall_time':
> (.text+0x5fa0a): undefined reference to `____ilog2_NaN'
> Makefile:969: recipe for target 'vmlinux' failed
> make[1]: *** [vmlinux] Error 1

つい数日前 (2/20)はbuildできた4.10.0もダメだった (@gcc-6, gcc-7)。

`/var/log/aptitude`を確認してみた所、Sidのgcc-6 (6.3.0-8)を2/22に、experimentalのgcc-7 (7-20170221-1)を2/24にそれぞれ更新していた。

"linux ____ilog2_nan"でGoogle検索したら、次のpageを発見:

詳しくはよく分からないが、Linux kernel内部で利用されている`ilog2()`をcompileする際にGCCのtree-optimizationで問題が発生している模様 (cf. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72785)。どうやらkernel側のbugっぽい。

既にworkaroundがあり`include/linux/log2.h`へのpatch (cf. http://lists.infradead.org/pipermail/linux-arm-kernel/2016-October/462224.html)を当てた所buildできた。

2016年10月23日日曜日

Debian unstableのgcc-6 6.2.0-7以降でLinux kernelなどのbuildができない件への対処 (2016-12-03更新)

Debian unstableのgcc-6は、6.2.0-7から--enable-default-pieというflag付きでbuildされており、これがあちこちで問題を引き起こしている。

cf. https://bugs.debian.org/cgi-bin/pkgreport.cgi?package=gcc-6

影響を受けているのはLinux kernelやSeaBIOSなど。

今の所backoutされる予定はなさそうなので、upstream (kernel側)で対応する迄は以下のworkaroundで我慢するか、自前でgcc-6 (6.2.0-6)をbuildするしかない。

Linux kernelのbuild

(2016-12-03追記)

Linux kernel 4.8.11でDebianのGCCで行われた変更に対応した。よって、それ以降のversionを利用する場合以下のworkaroundは不要。

stack protectorをenableにしていると:

> -fstack-protector not supported by compiler

と出てbuildが止まったり、そうでなくても:

> error: code model kernel does not support PIC mode

と出てbuildが止まったりする。

何れも、KCPPFLAGS=-fno-picをmake-kpkgあたりに渡してbuildするというworkaroundが紹介されている (cf. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=841533)。

著者の環境ではworkaroundによりmake-kpkgでkernelがbuildできた。

ccache userへ


FirefoxやEmacsのbuildにも影響が出た。

一旦、ccache -C -zでcacheを破棄してrebuildすると良い。


ZoL (ZFS on Linux)

(2016-10-28追記)

ZoLはkernel modulesとしてbuildする関係から、もろにこの変更の影響を受ける。しかも、KCPPFLAGS=-fno-picを渡しても./configure scriptが途中でコケる。

(2016-12-03追記)

SPLもZFSも正常にbuildできるようになった。

それがGCC側の変更なのか、kernel sourceのupgradeの結果なのかは切り分けられなかった。

2016年9月9日金曜日

GCC 5.x → GCC 6.xへ完全移行 @Debian Sid

Debian GNU/Linux Sidではしばらく前にdefaultのGCCが5→6になったのだが、Firefoxのbuildに不具合がありGCC 5.xを残してあった。

今日、Firefox 49 (release)をbuildしてみた所、mach packageがうまくいかない不具合が解消されていたので、晴れてGCC 5 seriesをuninstallした。