OpenJDKのビルド方法そのものはきしださんのブログをご覧ください。
JavaOneから帰国後、僕も最新のOpenJDKビルドするぞ!とmakeしてたのですが、エラーが出てちょっと挫折していました。
/Users/jyukutyo/code/amber/src/hotspot/share/logging/logConfiguration.cpp:303:16: error: passing an object that undergoes default argument promotion to 'va_start' has undefined behavior [-Werror,-Wvarargs]
va_start(ap, exact_match);
^
/Users/jyukutyo/code/amber/src/hotspot/share/logging/logConfiguration.cpp:299:66: note: parameter of type 'bool' is declared here
void LogConfiguration::configure_stdout(LogLevelType level, bool exact_match, ...) {
^
1 error generated.
make[3]: *** [/Users/jyukutyo/code/amber/build/macosx-x86_64-normal-server-release/hotspot/variant-server/libjvm/objs/logConfiguration.o] Error 1
make[3]: *** Waiting for unfinished jobs....
make[2]: *** [hotspot-server-libs] Error 2
ERROR: Build failed for target 'default (exploded-image)' in configuration 'macosx-x86_64-normal-server-release' (exit code 2)
Stopping sjavac server
=== Output from failing command(s) repeated here ===
* For target hotspot_variant-server_libjvm_objs_logConfiguration.o:
/Users/jyukutyo/code/amber/src/hotspot/share/logging/logConfiguration.cpp:303:16: error: passing an object that undergoes default argument promotion to 'va_start' has undefined behavior [-Werror,-Wvarargs]
va_start(ap, exact_match);
^
/Users/jyukutyo/code/amber/src/hotspot/share/logging/logConfiguration.cpp:299:66: note: parameter of type 'bool' is declared here
void LogConfiguration::configure_stdout(LogLevelType level, bool exact_match, ...) {
^
1 error generated.
* All command lines available in /Users/jyukutyo/code/amber/build/macosx-x86_64-normal-server-release/make-support/failure-logs.
=== End of repeated output ===
No indication of failed target found.
Hint: Try searching the build log for '] Error'.
Hint: See common/doc/building.html#troubleshooting for assistance.
make[1]: *** [main] Error 2
make: *** [default] Error 2
cpp…C++のコードかーと検索していたら、JBS(JDK Bug System)にも課題が登録されていました。
[JDK-8187791] Undefined behavior in LogConfiguration::configure_stdout. - Java Bug System
そうか、なら仕方ない、待とうとしばらく待ったのですが、よく考えるとたいしたことないエラーだし、(C++初めてだけど)あわよくばパッチ出せるんじゃないかと思い、調べたらコードを変えることなくビルドできてしまいました。環境の問題です。
結論
環境
macOS 10.12.6です。デフォルトではこうです。
$ clang --version Apple LLVM version 9.0.0 (clang-900.0.38) Target: x86_64-apple-darwin16.7.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
XCode 8.3.3を入れます。以下からダウンロードできます。
https://developer.apple.com/download/more/
8.3.3をインストールしたら一度XCodeを起動しておきました。その後こうなります。
$ clang --version Apple LLVM version 8.1.0 (clang-802.0.42) Target: x86_64-apple-darwin16.7.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
それからmakeします。
Finished building target 'default (exploded-image)' in configuration 'macosx-x86_64-normal-server-release' $ export JAVA_HOME=[OPENJDK]/build/macosx-x86_64-normal-server-release/jdk $ java -version openjdk version "10-internal" OpenJDK Runtime Environment (build 10-internal+0-adhoc.koichisakata.amber) OpenJDK 64-Bit Server VM (build 10-internal+0-adhoc.koichisakata.amber, mixed mode) $ jshell | JShellへようこそ -- バージョン10-internal | 概要については、次を入力してください: /help intro jshell> var i = 1; i ==> 1
ヒャッハー!varが使えます。
エラー詳細
そもそもこのエラーは何なのか?も解決に至るまで調べてました。
va_start()はマクロであり、可変長引数を扱うときに型安全性を確保するために使う。IBMのサイトにvoid va_start(va_list arg_ptr, variable_name); variable_name が関数または配列型、あるいは デフォルト引数プロモーションのアプリケーションの後で生じる 型と互換性がない型と一緒にレジスターとして宣言 された場合には、動作は未定義です。という記述がありました。
もう一度エラーメッセージを見てみます。
passing an object that undergoes default argument promotion to 'va_start' has undefined behavior [-Werror,-Wvarargs]
訳すと上記の文面と一致します。boolであるexact_matchをva_startの引数variable_nameに渡すと、おそらくデフォルト引数プロモーションのアプリケーションの後で生じる 型と互換性がない型なのでしょうね。これでエラーになっているようです。
しかし、それがなぜバージョンを変えると解消できたのかは、私にはわかっていません。
他のOSSでも同様のことが起こっていました。
こちらにはyou can try building with CFLAGS="-Wno-error=varargs"とあるので、このフラグでいける可能性もあります(未検証)。
gcc入れ替え
$ gcc --version Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 9.0.0 (clang-900.0.38) Target: x86_64-apple-darwin16.7.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
XCodeをダウンロードする前に、gccのバージョンを変えてみようとしました。HomeBrewでgcc 7.2を入れたものの、/usr/bin/gccが入れ替えられない!?
$ sudo ln -sf /usr/local/bin/gcc-7 /usr/bin/gcc ln: /usr/bin/gcc: Operation not permitted
なんと、macOSではSIP(System Integrity Protection)によってガードされているそうです。
所感
やはりOpenJDKはLinuxでビルドする方がいいのでしょうね。
panama
しかしpanamaはまだエラーです。
In file included from /Users/jyukutyo/code/panama/hotspot/src/share/vm/gc/cms/compactibleFreeListSpace.cpp:1:
In file included from /Users/jyukutyo/code/panama/hotspot/src/share/vm/precompiled/precompiled.hpp:296:
In file included from /Users/jyukutyo/code/panama/hotspot/src/share/vm/gc/cms/compactibleFreeListSpace.hpp:33:
/Users/jyukutyo/code/panama/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp:167:12: error: instantiation of variable 'TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::_min_tree_chunk_size' required here, but no definition is available [-Werror,-Wundefined-var-template]
return _min_tree_chunk_size;
^
/Users/jyukutyo/code/panama/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp:293:44: note: in instantiation of member function 'TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::min_size' requested here
return TreeChunk<Chunk_t, FreeList_t>::min_size();
^
/Users/jyukutyo/code/panama/hotspot/src/share/vm/gc/cms/compactibleFreeListSpace.cpp:2681:67: note: in instantiation of member function 'BinaryTreeDictionary<FreeChunk, AdaptiveFreeList<FreeChunk> >::min_size' requested here
fc = dictionary()->get_chunk(MAX2(n * word_sz, _dictionary->min_size()),
^
/Users/jyukutyo/code/panama/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp:148:17: note: forward declaration of template entity is here
static size_t _min_tree_chunk_size;
^
1 error generated.
make[3]: *** [/Users/jyukutyo/code/panama/build/macosx-x86_64-normal-server-release/hotspot/variant-server/libjvm/objs/compactibleFreeListSpace.o] Error 1
make[3]: *** Waiting for unfinished jobs....
Compiling 18 files for java.datatransfer
Compiling 118 files for java.compiler
Compiling 34 files for java.logging
make[2]: *** [hotspot-server-libs] Error 2
make[2]: *** Waiting for unfinished jobs....
ERROR: Build failed for target 'default (exploded-image)' in configuration 'macosx-x86_64-normal-server-release' (exit code 2)
Stopping sjavac server
=== Output from failing command(s) repeated here ===
* For target hotspot_variant-server_libjvm_objs_compactibleFreeListSpace.o:
In file included from /Users/jyukutyo/code/panama/hotspot/src/share/vm/gc/cms/compactibleFreeListSpace.cpp:1:
In file included from /Users/jyukutyo/code/panama/hotspot/src/share/vm/precompiled/precompiled.hpp:296:
In file included from /Users/jyukutyo/code/panama/hotspot/src/share/vm/gc/cms/compactibleFreeListSpace.hpp:33:
/Users/jyukutyo/code/panama/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp:167:12: error: instantiation of variable 'TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::_min_tree_chunk_size' required here, but no definition is available [-Werror,-Wundefined-var-template]
return _min_tree_chunk_size;
^
/Users/jyukutyo/code/panama/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp:293:44: note: in instantiation of member function 'TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::min_size' requested here
return TreeChunk<Chunk_t, FreeList_t>::min_size();
^
/Users/jyukutyo/code/panama/hotspot/src/share/vm/gc/cms/compactibleFreeListSpace.cpp:2681:67: note: in instantiation of member function 'BinaryTreeDictionary<FreeChunk, AdaptiveFreeList<FreeChunk> >::min_size' requested here
fc = dictionary()->get_chunk(MAX2(n * word_sz, _dictionary->min_size()),
^
... (rest of output omitted)
* All command lines available in /Users/jyukutyo/code/panama/build/macosx-x86_64-normal-server-release/make-support/failure-logs.
=== End of repeated output ===
No indication of failed target found.
Hint: Try searching the build log for '] Error'.
Hint: See common/doc/building.html#troubleshooting for assistance.
make[1]: *** [main] Error 2
make: *** [default] Error 2
またがんばってみます。