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
またがんばってみます。