Статьи

Сборка OpenJDK на Windows

Проведя некоторые эксперименты, я обнаружил, что часто полезно иметь в наличии исходный код JDK, чтобы вносить некоторые изменения, играть с ним и т. Д. Поэтому я решил скачать и скомпилировать этого зверя. По-видимому, это заняло у меня некоторое время, хотя изначально я думал, что это должно быть так же просто, как запустить команду make :). Как вы можете догадаться, я обнаружил, что это не тривиальная задача, и чтобы упростить мою жизнь в будущем, было бы полезно вести некоторые записи о том, что я делал.

Ниже приведены шаги, которые я должен был сделать, чтобы это произошло. Я предполагаю, что на машине уже установлена ​​Visual Studio 2010. У меня такое ощущение, что Express-версия должна работать просто отлично, но я не пробовал.

  1. Установите Cygwin. Убедитесь, что вы установили все перечисленные здесь пакеты, некоторые из них не установлены по умолчанию. На всякий случай, вот копия этой таблицы, но рекомендуется проверить с основным источником :
    Двоичное имя категория пакет Описание
    ar.exe Devel Binutils GNU ассемблер, компоновщик и бинарные утилиты
    make.exe Devel делать Версия утилиты make для GNU, созданная для CYGWIN.
    m4.exe интерпретаторы m4 GNU реализация традиционного макропроцессора Unix
    cpio.exe Utils CPIO Программа для управления архивами файлов
    gawk.exe Utils AWK Шаблонно-ориентированный язык сканирования и обработки
    file.exe Utils файл Определяет тип файла, используя «магические» числа
    zip.exe Архив застежка-молния Упаковать и сжать (архивировать) файлы
    unzip.exe Архив расстегнуть молнию Извлечение сжатых файлов в ZIP-архив
    free.exe система Procps Отображение количества свободной и использованной памяти в системе

    Не забудьте добавить папку bin в cygwin в PATH.

  2. Установите Mercurial отсюда и добавьте ‘hg’ в PATH.
  3. Установите Microsoft Windows SDK для Windows 7 и .NET Framework 4 .
  4. Установите DirectX SDK . JDK требует v9.0, но я не мог найти это легко. Поэтому я решил не беспокоить и установил последнюю. Похоже, это работает просто отлично.
  5. Для сборки требуется Bootstrap JDK. Случилось так, что я использовал JDK6, но, предположим, любая версия> JDK6 будет работать без пробников.
  6. Скачайте и установите Ant . Я использовал версию 1.8.2. Добавьте муравья в ПУТЬ.
  7. Оформить заказ источников. По ряду причин это была самая сложная часть. ‘hg’ не особенно стабилен, поэтому некоторые вещи, которые должны быть выполнены в моих скриптах, должны были быть выполнены вручную.

    Итак, для начала запустите это в командной строке:

    1
    hg clone --verbose --pull http://hg.openjdk.java.net/jdk7u/jdk7u <some_folder>\openjdk7'

    Это должно загрузить корневую папку с некоторыми вспомогательными скриптами.

    Затем в cygwin перейдите в только что созданную папку «openjdk7» и запустите «get_source.sh». ‘get_source.sh’ может потерпеть неудачу или просто зависнуть (и это именно то, что случилось со мной). Если это так, то вы можете попытаться использовать флаг «–pull» (протокол извлечения метаданных). Я не совсем уверен, почему, но это помогло мне. К сожалению, сценарии написаны не очень дружелюбно, и невозможно передать какие-либо аргументы ‘hg’ в сценарий поиска источников. Поэтому вам нужно перейти к «make \ scripts \ hgforest.sh» и добавить «–pull» к каждому вызову «hg clone».

    И если даже после добавления ‘-pull’ все равно не получится, ну … просто откажитесь и выполните эти команды вручную:

    1
    2
    3
    4
    5
    6
    hg clone --verbose --pull http://hg.openjdk.java.net/jdk7u/jdk7u/corba corba
    hg clone --verbose --pull http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot hotspot
    hg clone --verbose --pull http://hg.openjdk.java.net/jdk7u/jdk7u/jaxp jaxp
    hg clone --verbose --pull http://hg.openjdk.java.net/jdk7u/jdk7u/jaxws jaxws
    hg clone --verbose --pull http://hg.openjdk.java.net/jdk7u/jdk7u/jdk jdk
    hg clone --verbose --pull http://hg.openjdk.java.net/jdk7u/jdk7u/langtools langtools

    Надеюсь, теперь у вас есть источники и можете продолжить 🙂

  8. Для сборки требуется несколько внешних двоичных файлов и версия make.exe, которая работает под Windows. ‘make’, которая поставляется с cygwin, на самом деле не работает, потому что имеет некоторые проблемы с буквами дисков в именах путей.

    Далее нам нужно скомпилировать пару файлов. Одна из них — фиксированная версия make.exe. Другой является библиотека FreeType, которая доступна только для загрузки в качестве источника.

    Если вы не заинтересованы в компиляции всего этого и хотите просто скомпилировать JDK с меньшими трудностями, я бы порекомендовал скачать бинарные файлы отсюда (это мой диск). Распакуйте make.exe в openjdk7 / bin. Обратите внимание, что ‘make.exe’ из пакета довольно старый и требует cygintl-3.dll, который не поставляется с текущим cygwin. Чтобы это исправить, просто скопируйте cygintl-8.dll -> cygintl-3.dll.
    Freetype lib и dll должны быть помещены в папку, на которую ссылается переменная conf ‘ALT_FREETYPE_LIB_PATH’ (см. Шаг 13). Кроме того, некоторые заголовки Freetype по-прежнему требуются и находятся в make через переменную ALT_FREETYPE_HEADERS_PATH (см. Шаг 13). Это означает, что вам также необходимо скачать исходный код.

    Если вы не ищете простое решение и хотите скомпилировать эти двоичные файлы самостоятельно, выполните следующие инструкции:

    1. Загрузите make 3.82 и распакуйте его. Найдите «config.h.W32» и раскомментируйте строку с определением «HAVE_CYGWIN_SHELL». Откройте решение make_msvc_net2003.sln в Visual Studio, выберите конфигурацию Release и выполните сборку. В папке «Release» вы получите «make_msvc.net2003.exe», переименуйте его в «make.exe».
    2. Теперь скомпилируйте FreeType:
      1. Загрузите исходный код FreeType v.2.4.7 здесь .
      2. Распакуйте его куда-нибудь и откройте ‘\ builds \ win32 \ vc2010 \ freetype.sln’ в Visual Studio.
      3. Перейдите в свойства проекта (щелкните правой кнопкой мыши проект в дереве проекта) и в «Свойства конфигурации / Общие / Тип конфигурации» выберите «Динамическая библиотека (.ddl)» и переименуйте вывод в «freetype».
      4. Обновите ftoption.h, добавьте следующие две строки:
        #define FT_EXPORT (x) __declspec (dllexport) x
        #define FT_BASE (x) __declspec (dllexport) x
      5. Сделайте сборку, и вы получите dll & lib в ‘objs \ win32 \ vc2010’.
      6. Не забудьте назначить соответствующие значения переменным «ALT_FREETYPE_LIB_PATH» и «ALT_FREETYPE_HEADERS_PATH» (см. Шаг 13).
  9. У меня были некоторые проблемы с генерацией Javadoc, который не удался с OutOfMemory. Чтобы это исправить, мне пришлось изменить ‘openjdk7 \ jdk \ make \ docs \ Makefile’.
    Этот код:

    1
    2
    3
    4
    5
    6
    7
    ifeq ($(ARCH_DATA_MODEL),64)
      MAX_VM_MEMORY = 1024
    else ifeq ($(ARCH),universal)
      MAX_VM_MEMORY = 1024
    else
      MAX_VM_MEMORY = 512
    endif

    должен быть заменен этим:

    1
    2
    3
    4
    5
    6
    7
    ifeq ($(ARCH_DATA_MODEL),64)
      MAX_VM_MEMORY = 1024
    else ifeq ($(ARCH),universal)
      MAX_VM_MEMORY = 1024
    else
      MAX_VM_MEMORY = 1024
    endif
  10. Нужно скопировать файл msvcr100.dll в капли:
    1
    cp /cygdrive/c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio\ 10.0/Common7/Packages/Debugger/X64/msvcr100.dll ./drops/
  11. Убедитесь, что cygwin ‘find.exe’ в ПУТИ перед Windows ‘. Самый простой способ сделать это — скопировать его в ‘openjdk7 / bin’, который затем устанавливается в начале текущей переменной PATH.
  12. Создайте командный файл, подобный следующему. Не забывайте обновлять пути подходящим образом:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ALT_BOOTDIR=C:/Stuff/java_libs/jdk1.6.0_25
    ANT_HOME=C:/Stuff/java_libs/apache-ant-1.8.2
    JAVA_HOME=
    CLASSPATH=
    PATH=C:/Stuff/openjdk7/bin;%PATH%
    ALLOW_DOWNLOADS=true
    ALT_MSVCRNN_DLL_PATH=C:/Stuff/java_libs/openjdk7/drops
     
    C:\WINDOWS\system32\cmd.exe /E:ON /V:ON /K 'C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd' /Release /xp /x86
  13. Запустить пакетный файл. Теперь у вас полностью настроенная среда, которая готова к сборке. Запустите ‘bash’ и из оболочки выполните ‘make’:
    1
    make ARCH_DATA_MODEL=32 ALT_OUTPUTDIR=C:/Users/Stas/Stuff/java_libs/openjdk7/output_32 ALT_FREETYPE_LIB_PATH=C:/Users/Stas/Stuff/java_libs/openjdk7/freetype-2.4.7/objs/win32/vc2010 ALT_FREETYPE_HEADERS_PATH=C:/Users/Stas/Stuff/java_libs/openjdk7/freetype-2.4.7/include ALT_BOOTDIR=C:/Users/Stas/Stuff/java_libs/jdk1.6.0_25 ALT_DROPS_DIR=c:/OpenJDK/ALT_DROPS_DIR ALT_DROPS_DIR=C:/Users/Stas/Stuff/java_libs/openjdk7/drops HOTSPOT_BUILD_JOBS=4 PARALLEL_COMPILE_JOBS=4 2>&1 | tee C:/Stuff/java_libs/openjdk7/output_32.log

    Начнется сборка 32-битного JDK.

  14. Выпейте кофе, чай или еще что-нибудь по вкусу, а затем примерно через час вы увидите что-то вроде этого:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    #-- Build times ----------
    Target all_product_build
    Start 2012-09-01 23:08:55
    End   2012-09-01 23:55:48
    00:02:35 corba
    00:06:46 hotspot
    00:00:30 jaxp
    00:00:51 jaxws
    00:35:30 jdk
    00:00:37 langtools
    00:46:53 TOTAL
    -------------------------

Ссылка: Сборка OpenJDK для Windows от нашего партнера по JCG Станислава Кобылянского в блоге Стаса .