Skip to content

Instantly share code, notes, and snippets.

@UnaNancyOwen
Last active May 10, 2019 18:59
Show Gist options
  • Save UnaNancyOwen/bb9048cfccca3905f2a6e1a9c613a08d to your computer and use it in GitHub Desktop.
Save UnaNancyOwen/bb9048cfccca3905f2a6e1a9c613a08d to your computer and use it in GitHub Desktop.
Building HarfBuzz with Visual Studio
# Build HarfBuzz with Visual Studio
macro(build_harfbuzz FREETYPE_INCLUDE_DIR FREETYPE_LIBRARY_DIR)
# Download HarfBuzz
set(HARFBUZZ "harfbuzz-1.3.4")
set(HARFBUZZ_TAR_BZ2 "${HARFBUZZ}.tar.bz2")
set(HARFBUZZ_URL "https://www.freedesktop.org/software/harfbuzz/release/${HARFBUZZ_TAR_BZ2}")
set(HARFBUZZ_MD5 065843caf247687b94126773285bc70f)
file(
DOWNLOAD ${HARFBUZZ_URL} "${CMAKE_CURRENT_BINARY_DIR}/${HARFBUZZ_TAR_BZ2}"
STATUS _harfbuzz_download_status LOG _harfbuzz_download_log
EXPECTED_MD5 ${HARFBUZZ_MD5}
)
list(GET _harfbuzz_download_status 0 _download_error_code)
list(GET _harfbuzz_download_status 1 _download_error_message)
if(_download_error_code)
message(WARNING "failed download. ${_download_error_code}:${_download_error_message}")
endif()
# Extract HarfBuzz
execute_process(
COMMAND ${CMAKE_COMMAND} -E tar -xzf ${HARFBUZZ_TAR_BZ2}
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
RESULT_VARIABLE _extract_error_code
ERROR_VARIABLE _extract_error_message
)
if(_extract_error_code)
message(WARNING "failed extract. ${_extract_error_code}:${_extract_error_message}")
endif()
# Set Variables for Build HarfBuzz
if(CMAKE_CL_64)
# Build Tools Directory
get_filename_component(MSVC_COMPILER_DIR ${CMAKE_CXX_COMPILER} PATH)
get_filename_component(MSVC_COMPILER_DIR ${MSVC_COMPILER_DIR} PATH)
set(MSVC_COMPILER_DIR ${MSVC_COMPILER_DIR}/amd64)
# Batch File for Setting the Path and Environment Variables for Command-Line Builds
set(MSVC_VCVARS "vcvars64.bat")
# Specify Target Platform
set(MSVC_MACHINE "x64")
# OBJ Files Directory (release/${HARFBUZZ_OBJ}/harfbuzz)
set(HARFBUZZ_OBJ "x64")
else()
# Build Tools Directory
get_filename_component(MSVC_COMPILER_DIR ${CMAKE_CXX_COMPILER} PATH)
# Batch File for Setting the Path and Environment Variables for Command-Line Builds
set(MSVC_VCVARS "vcvars32.bat")
# Specify Target Platform
set(MSVC_MACHINE "x86")
# OBJ Files Directory (release/${HARFBUZZ_OBJ}/harfbuzz)
set(HARFBUZZ_OBJ "Win32")
endif()
# Find Build Tools
find_program(NMAKE nmake PATHS ${MSVC_COMPILER_DIR})
find_program(LIB lib PATHS ${MSVC_COMPILER_DIR})
# Build and Install HarfBuzz
if(NMAKE AND LIB)
# Set HarfBuzz Build Commands
set(HARFBUZZ_BUILD_COMMAND
${MSVC_COMPILER_DIR}/${MSVC_VCVARS} &
${NMAKE} /f Makefile.vc CFG=release FREETYPE=1 FREETYPE_DIR=${FREETYPE_INCLUDE_DIR} ADDITIONAL_LIB_DIR=${FREETYPE_LIBRARY_DIR} RPREFIX=harfbuzz install &
cd release/${HARFBUZZ_OBJ}/harfbuzz &
${LIB} /LTCG /machine:${MSVC_MACHINE} /out:harfbuzz_s.lib *.obj
)
# Execute Build Commands
execute_process(
COMMAND ${HARFBUZZ_BUILD_COMMAND}
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/${HARFBUZZ}/win32"
RESULT_VARIABLE _build_error_code
OUTPUT_FILE "${CMAKE_BINARY_DIR}/${HARFBUZZ}/win32/${HARFBUZZ}_output.log"
ERROR_FILE "${CMAKE_BINARY_DIR}/${HARFBUZZ}/win32/${HARFBUZZ}_error.log"
)
if(_build_error_code)
message(WARNING "failed build. ${_build_error_code}")
endif()
# Copy Static Library
file(
COPY "${CMAKE_BINARY_DIR}/${HARFBUZZ}/win32/release/${HARFBUZZ_OBJ}/harfbuzz/harfbuzz_s.lib"
DESTINATION "${CMAKE_BINARY_DIR}/${HARFBUZZ}/win32/harfbuzz/lib"
)
# Set HarfBuzz Directory
set(HARFBUZZ_DIR "${CMAKE_BINARY_DIR}/${HARFBUZZ}/win32/harfbuzz")
else()
message(WARNING "failed could not find nmake and lib.")
endif()
endmacro()

[TBD] Building HarfBuzz 1.3.4 with Visual Studio

ToDo: 静的リンクライブラリの生成

Dependencies

  1. FreeType2をビルドします。
    https://gist.github.com/UnaNancyOwen/133341f1d5279e20323e75ffacca4979

Download

  1. HarfBuzz 1.3.4(harfbuzz-1.3.4.tar.bz2)をダウンロードしてファイルを解凍する。(C:\harfbuzz-1.3.4)
    https://www.freedesktop.org/software/harfbuzz/release/

Build

  1. Visual Studioの開発者コマンドプロンプト("VS20XX x86 Native Tools Commond Prompt"または"VS20XX x64 Native Tools Commond Prompt")を管理者権限で起動して以下のコマンドを実行する。
      ※ 開発者コマンドプロンプトを管理者権限で起動しないとinstallが失敗する。
      ※ FreeType2が別のディレクトリにインストールされている場合、適切にパスを書き換えてください。
     

    • Win32
    cd C:\harfbuzz-1.3.4\win32
    nmake /f Makefile.vc CFG=release FREETYPE=1 FREETYPE_DIR=C:\PROGRA~2\freetype\include\freetype2 ADDITIONAL_LIB_DIR=C:\PROGRA~2\freetype\lib PREFIX=C:\PROGRA~2\harfbuzz install
    • x64
    cd C:\harfbuzz-1.3.4\win32
    nmake /f Makefile.vc CFG=release FREETYPE=1 FREETYPE_DIR=C:\PROGRA~1\freetype\include\freetype2 ADDITIONAL_LIB_DIR=C:\PROGRA~1\freetype\lib PREFIX=C:\PROGRA~1\harfbuzz install

[TBD] Create Static Library

  1. 上記の方法で動的リンクライブラリを生成する。
     この過程でオブジェクトファイル(*.obj)が生成される。

  2. Visual Studioの開発者コマンドプロンプト("VS20XX x86 Native Tools Commond Prompt"または"VS20XX x64 Native Tools Commond Prompt")を管理者権限で起動して以下のコマンドを実行する。

    • Win32
    cd C:\harfbuzz-1.3.4\win32\release\Win32\harfbuzz
    lib /LTCG /machine:x86 /out:harfbuzz.lib *.obj
    • x64
    cd C:\harfbuzz-1.3.4\win32\release\x64\harfbuzz
    lib /LTCG /machine:x64 /out:harfbuzz.lib *.obj
  3. HarfBuzzのインストールディレクトリにコピーする。

    • Win32
    copy /y C:\harfbuzz-1.3.4\win32\release\Win32\harfbuzz\harfbuzz.lib C:\PROGRA~2\harfbuzz\lib
    rd /s /q C:\PROGRA~2\harfbuzz\bin
    • x64
    copy /y C:\harfbuzz-1.3.4\win32\release\x64\harfbuzz\harfbuzz.lib C:\PROGRA~1\harfbuzz\lib
    rd /s /q C:\PROGRA~1\harfbuzz\bin

Environment Variable

  1. 環境変数HARFBUZZ_DIRを作成してHarfBuzzのパス(C:\Program Files\harfbuzz)を設定する。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment