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.