11# Cross-compiling  
22
3+ Generally scikit-build-core will try to account for environment variables that
4+ specify to CMake directly how to cross-compile. Alternatively, you can define
5+ manually how to cross-compile as detailed in [ manual cross compilation]  section.
6+ 
37## macOS  
48
59Unlike the other platforms, macOS has the ability to target older operating
@@ -50,10 +54,7 @@ correct suffix. These values are set by cibuildwheel when cross-compiling.
5054
5155## Linux  
5256
53- It should be possible to cross-compile to Linux, but due to the challenges of
54- getting the manylinux RHEL devtoolkit compilers, this is currently a TODO. See
55- ` py-build-cmake <https://tttapa.github.io/py-build-cmake/Cross-compilation.html> ` \_ 
56- for an alternative package's usage of toolchain files.
57+ See [ manual cross compilation]  section for the general approach.
5758
5859### Intel to Emscripten (Pyodide)  
5960
@@ -64,3 +65,71 @@ by setting `_PYTHON_SYSCONFIGDATA_NAME`. This causes values like `SOABI` and
6465This is unfortunately incorrectly stripped from the cmake wrapper pyodide uses,
6566so FindPython will report the wrong values, but pyodide-build will rename the
6667.so's afterwards.
68+ 
69+ ## Manual cross compilation  
70+ 
71+ The manual cross compilation assumes you have [ toolchain file]  prepared defining
72+ the cross-compilers and where to search for the target development files,
73+ including the python library. A simple setup of this is to use the clang
74+ compiler and point ` CMAKE_SYSROOT `  to a mounted copy of the target system's root
75+ 
76+ ``` cmake 
77+ set(CMAKE_SYSTEM_NAME Linux) 
78+ set(CMAKE_SYSTEM_PROCESSOR aarch64) 
79+ 
80+ set(triple aarch64-linux-gnu) 
81+ 
82+ set(CMAKE_C_COMPILER clang) 
83+ set(CMAKE_CXX_COMPILER clang++) 
84+ set(CMAKE_C_COMPILER_TARGET ${triple}) 
85+ set(CMAKE_CXX_COMPILER_TARGET ${triple}) 
86+ 
87+ set(CMAKE_SYSROOT "/path/to/aarch64/mount/") 
88+ ``` 
89+ 
90+ For more complex environments such as embedded devices, Android or iOS see
91+ CMake's guide on how to write the [ toolchain file] .
92+ 
93+ You can pass the toolchain file using the environment variable
94+ ` CMAKE_TOOLCHAIN_FILE ` , or the ` cmake.toolchain-file `  pyproject option. You may
95+ also need to use ` wheel.tags `  to manually specify the wheel tags to use for the
96+ file and ` cmake.no-python-hints `  if the target python should be detected using
97+ the toolchain file instead.
98+ 
99+ :::{note}
100+ 
101+ Because most of the logic in [ ` FindPython ` ]  is gated by the
102+ ` CMAKE_CROSSCOMPILING ` , you generally should _ not_  include the ` Interpreter ` 
103+ component in the ` find_package `  command or use the ` Python_ARTIFACTS_PREFIX ` 
104+ feature to distinguish the system and target components.
105+ 
106+ :::
107+ 
108+ :::{versionadded} 0.11
109+ 
110+ :::
111+ 
112+ ### Crossenv  
113+ 
114+ [ Crossenv]  cross compilation is supported in scikit-build-core. This tool
115+ creates a fake virtual environment where configuration hints such as
116+ ` EXT_SUFFIX `  are overwritten with the target's values. This should work without
117+ specifying ` wheel.tags `  overwrites manually.
118+ 
119+ :::{note}
120+ 
121+ Because the target Python executable is being faked, the usage of
122+ ` CMAKE_CROSSCOMPILING_EMULATOR `  for the ` Interpreter `  would not be correct in
123+ this case.
124+ 
125+ :::
126+ 
127+ :::{versionadded} 0.11
128+ 
129+ :::
130+ 
131+ [ manual cross compilation ] : #manual-cross-compilation 
132+ [ toolchain file] :
133+   https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling 
134+ [ crossenv ] : https://crossenv.readthedocs.io/en/latest/ 
135+ [ `FindPython` ] : https://cmake.org/cmake/help/git-master/module/FindPython.html 
0 commit comments