задний план
Так как я недавно хотел проанализировать несколькоnative
метод, поэтому вам нужно иметь под рукой тот, который можетdebug
изJDK
, Поэтому за последние два дня я накидал, наступил на 10+ ям, прочитал 10+ статей, попробовал 10+ раз и наконец-то получил.JDK
Я скомпилировал это, когда сам скомпилировалJDK
запускать наjavac -version
После вывода знакомого текста я чувствуюуже старые слезыВсе еще очень успешно.
Предварительная подготовка
-
Узнать об OpenJDK: то, что мы хотим скомпилировать,
Open JDK 9u
- Установить
Homebrew
(по желанию) - Фаню Тусуй: Потому что если при компиляции возникает ошибка, нужно искать неправильное решение через несуществующий сайт.
- Получите хороший редактор исходного кода: потому что, если повезет [забавно], нам может понадобиться изменить
JDK
Myaa в исходном коде (использую mscode) - установить один
Boot JDK
: так какJDK
Много кодаJava
Написано, так что хочу собратьJDK
нужно использовать другойJDK
Чтобы помочь (куриные яйца, яйца и цыплята/дергать себя за волосы и подтягиваться), я установил официальный OracleJDK
- Установить
freetype
: это зависимостьbrew install freetype
- Установить
Xcode
Описание среды
- Операционная система:
macOS High Sierra Version: 10.13.3 (17D47)
-
Boot JDK
:1.8.0_161
-
freetype
:2.9
-
Xcode
:Version 9.2 (9C40b)
-
Open JDK
Исходный код:jdk9u-2e265b4b8622
corba-2ef36e70f490
hotspot-bb73b31e70e3
jaxp-95a71f690b44
jaxws-f4f878b5f01c
jdk-a779673ab57d
langtools-e2bf77b3f002
nashorn-fb3f7ae74bf6
Яма, через которую прошли мои предшественники / Яма, через которую прошел я
- не компилировать
JDK 8
: потому что для компиляции 8 требуетсяXcode 4
в настоящее времяXcode
Версия гораздо выше 4 (эту яму обнаружили предшественники, я конечно не верю в зло, а потом сам прошел через нее, и обнаружил, что это действительно яма) - попробуй не использовать
Mercurial
спустисьOpen JDK
, и используйте браузер для прямой загрузки упакованного исходного кода: потому что вам нужно использоватьMercurial
загруженOpen JDK
После проекта верхнего уровня вам также необходимо выполнитьget_source.sh
Для скачивания исходников своих подпроектов этот процесс долгий и процент отказов высокий (ключ еще не реализовал процентную подсказку, сухой и т.д.), гораздо быстрее скачать сжатые пакеты всех подпроектов -проекты самостоятельно с помощью браузера, и вероятность успеха100%
(Я вышел сам, и все предыдущие статьи говорили мне использоватьMercurial
, результат яма) - компилировать
JDK 9u
вместоJDK 9
потому что я собирал9
Есть много ошибок, когда я хочу принестиu
Будет ли лучше, конечно, это во многом мои догадки, возьму позже9u
делал, не пробовал9
, если вам интересно, вы можете посетить это самостоятельно -
configure
обязательно принесите--disable-warnings-as-errors
этот параметр, иначеwarning
также прервет процесс компиляции, на самом деле этиwarning
Не влияет на скомпилированную цельJDK
бегать
идти процесс
Если за несколько часов доТы готов,Также следует обратить внимание, затем начните компилировать с процессом.Если вы сообщаете об ошибке (есть большая вероятность этого), не роняйте клавиатуру, используйте не упомянутое выше.можно описатьСуществующие веб-сайты пришли, чтобы найти ответ. Я пересек реку, ощупывая камни, и пробовал это неоднократно в течение 2 дней. Господин Лу Синь хорошо сказал:"пока ты очень стараешься, ты можешь добиться чего угодно",удачи! !
step0
Все вышеперечисленные препараты
step1
Загрузите пакет исходного кода
Разархивируйте загруженный пакет исходного кода и поместите его в соответствии с кодом уровня официальной библиотеки исходного кода.step2
Выполнить в каталоге верхнего уровня исходного кодаsh configure --with-debug-level=slowdebug --disable-warnings-as-errors --with-freetype-include=/usr/local/Cellar/freetype/2.9/include/freetype2 --with-freetype-lib=/usr/local/Cellar/freetype/2.9/lib
(Место с номером версии должно быть изменено в соответствии с реальной ситуацией.) Если на этом шаге нет проблем, вы должны увидеть этот вывод:
step3
Если ваша среда сборки и версия исходного кода точно такие же, как у меня, то неmake all
, давайте сначала исправим одинbug:(патч здесь)
Эта ошибка вызоветmake
Сообщить об этом:error: ordered comparison between pointer and zero ('char *' and 'int') 。。。此处省略
Открытымhotspot
в каталоге
-
src/share/vm/memory/virtualspace.cpp
искать средиif (base() > 0) {
изменить наif (base() != NULL) {
-
src/share/vm/opto/lcm.cpp
искать средиif (Universe::narrow_oop_base() > 0) {
изменить наif (Universe::narrow_oop_base() != NULL) {
-
src/share/vm/opto/loopPredicate.cpp
искать средиassert(rng->Opcode() == Op_LoadRange || _igvn.type(rng)->is_int() >= 0, "must be");
изменить наassert(rng->Opcode() == Op_LoadRange || iff->is_RangeCheck() || _igvn.type(rng)->is_int()->_lo >= 0, "must be");
step4
make all
Время компиляции немного больше.Моя машина MacBook Pro 2017 года, и это заняло около 20+ минут (не считал внимательно), и вентилятор во время процесса компиляции работал бешено.Для ноутбуков обратите внимание на оставшуюся мощность и тепловыделение.Если компиляция прошла успешно, укажитеjavac
Пройти полный путьjavac -version
Взгляни
Если сообщается об ошибке, конкретная ошибка будет подробно проанализирована. Поскольку среда компиляции отличается, ошибка также может быть другой. Перейдите на несуществующий веб-сайт, чтобы найти решение, и вы добьетесь успеха, проявив терпение и удача.
Суммировать
Я думал сделать одинJDK
Как это ни сложно, оказывается: это не сложно, но много ям и заморочек.Я пробовал более 10 раз до и после, и в общей сложности это заняло два дня.От попыток собратьJDK 8
снова9
В середине были различные проблемы, и я хотел сдаться в какой-то момент, но, поскольку я хотел использовать его для достижения более дальней цели, я все же настаивал на том, чтобы получить его, и, наконец, преуспел с помощью поисковой системы и предшественников. , так что это все та же фраза: «Пока кунг-фу глубоко и железный пестик переткнут в иглу», следуйте правильному направлению, повторяйте попытки и, наконец, добейтесь успеха.
использованная литература
Building OpenJDK 8 on Mac OS X Mavericks
Building and Packaging OpenJDK9 for OSX
Compilation errors with clang-4.0
OpenJDK / jdk10 / jdk10 / hotspot changeset 13502:316854ef2fa2
Ordered comparison between pointer and zero ('char *' and 'int') error #5
openjdk code compilation/ IDE setup
Используйте Clion (GDB) для отладки небольшого исходного кода JVM.
Решите проблему, из-за которой GDB не может быть отлажен под Mac
xcode-select active developer directory error
Mac OsX Sierra - Stuck on binaryTreeDictionary.hpp compilation