Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

macOSでOpenJDK(amber)ビルドするとエラーになってたのをクリアしてビルドした

OpenJDKのビルド方法そのものはきしださんのブログをご覧ください。

d.hatena.ne.jp

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++初めてだけど)あわよくばパッチ出せるんじゃないかと思い、調べたらコードを変えることなくビルドできてしまいました。環境の問題です。

結論

C++コンパイラバージョンを変えましょう。

  • XCodeを8.3.3にする(こちらを実施)
  • gccのバージョンを変える(試していない)

環境

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 が関数または配列型、あるいは デフォルト引数プロモーションのアプリケーションの後で生じる 型と互換性がない型と一緒にレジスターとして宣言 された場合には、動作は未定義です。という記述がありました。

IBM Knowledge Center

もう一度エラーメッセージを見てみます。

passing an object that undergoes default argument promotion to 'va_start' has undefined behavior [-Werror,-Wvarargs]

訳すと上記の文面と一致します。boolであるexact_matchをva_startの引数variable_nameに渡すと、おそらくデフォルト引数プロモーションのアプリケーションの後で生じる 型と互換性がない型なのでしょうね。これでエラーになっているようです。

しかし、それがなぜバージョンを変えると解消できたのかは、私にはわかっていません。

他のOSSでも同様のことが起こっていました。

github.com

こちらには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)によってガードされているそうです。

qiita.com

所感

やはり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

またがんばってみます。