LoginSignup
0
0

More than 3 years have passed since last update.

pybind11 アプリを Windows 向けに cross-compile するメモ

Posted at

python.org では .h/.lib だけのパッケージは配布されていないので, Wine で (Windows の) Python をインストールしているものとします.

Wine での Python のありかのメモ(Python 使う app の cross-compile 用)
https://qiita.com/syoyo/items/2c537d8b0f81be1ce4e1

ホストは Linux(WSL 含む)とします.

llvm-mingw

msvcrt と ucrt 版があります. ucrt 版のほうがいいのかしら?
(cross-compile とかで VC 依存性減らしたい場合だと ucrt が推奨という理解でいいのかしら...?)

Cmake 設定

SET(CMAKE_SYSTEM_NAME Windows)

IF (DEFINED ENV{LLVM_MINGW_DIR})
  SET(LLVM_MINGW_ROOT "$ENV{LLVM_MINGW_DIR}")
ELSE ()
  SET(LLVM_MINGW_ROOT "C:/ProgramData/llvm-mingw")
ENDIF()

SET(CMAKE_C_COMPILER ${LLVM_MINGW_ROOT}/bin/x86_64-w64-mingw32-clang)
SET(CMAKE_CXX_COMPILER ${LLVM_MINGW_ROOT}/bin/x86_64-w64-mingw32-clang++)
SET(CMAKE_RC_COMPILER ${LLVM_MINGW_ROOT}/bin/x86_64-w64-mingw32-windres)

#SET(CMAKE_C_LINK_EXECUTABLE x86_64-w64-mingw32-gcc)
#SET(CMAKE_CXX_LINK_EXECUTABLE x86_64-w64-mingw32-g++)

SET(CMAKE_FIND_ROOT_PATH ${LLVM_MINGW_ROOT}/x86_64-w64-mingw32)

# We need some advanced thread APIs, so use 0x601(Win7)
# Python 3.9 だと Windows 7 対応は打ち切られたようなので, WINNT のバージョン上げたほうがいいかもです!
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x601")

SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

こんな感じの toolchain ファイルを用意して,

Python 関連の設定を cmake bootstrap で明示的に指定します.

PYTHONLIBS_FOUND=On PYTHON_MODULE_EXTENSION を設定にすると, find_package(Python) 相当の処理では Python が見つかったとして find 処理をスキップしてくれます.
(pybind11 の tools/FindPythonLibsNew.cmake 参照)

curdir=`pwd`

# Set path to llvm-mingw in env var.
export LLVM_MINGW_DIR=$HOME/local/llvm-mingw-20210423-ucrt-ubuntu-18.04-x86_64/

builddir=${curdir}/build-llvm-mingw

rm -rf ${builddir}
mkdir ${builddir}

# Manually set python include dir path and lib path.
cd ${builddir} && cmake \
  -DCMAKE_TOOLCHAIN_FILE=${curdir}/cmake/llvm-mingw-cross.cmake \
  -DPYTHONLIBS_FOUND=On \
  -DPYTHON_MODULE_EXTENSION=pyd \
  -DPYBIND11_PYTHON_VERSION=3.9 \
  -DPYTHON_INCLUDE_DIRS="$HOME/.wine/drive_c/users/$USER/Local Settings/Application Data/Programs/Python/Python39/include" \
  -DPYTHON_LIBRARIES="$HOME/.wine/drive_c/users/$USER/Local Settings/Application Data/Programs/Python/Python39/libs/python39.lib" \
  -G "Ninja" \
  -DCMAKE_VERBOSE_MAKEFILE=1 \
  ..

これでいけるはずです!

clang-cl or MSVC(cl.exe)

T.B.W.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0