Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
bc3f18c
Install libpython pdb file when building shared libraries
adrianbroher Mar 21, 2016
a58bcb0
Don't export python cmake targets
adrianbroher Mar 21, 2016
39ba584
Change pathes to match current SDK layout
adrianbroher Mar 21, 2016
fecfa20
Disable MSVC specific compiler warnings
adrianbroher Sep 6, 2016
02a3b74
Add Mac OSX framework support
adrianbroher Apr 9, 2016
a1fe89f
Install binaries, libraries, headers files and auxilliary files into …
adrianbroher Sep 17, 2016
52fc644
Change PYTHONPATH and PYTHONHOME for framework builds
adrianbroher Sep 18, 2016
f06c730
Install platform library files on MacOSX
adrianbroher Sep 20, 2016
eeacc20
Install configure Makefile and pyconfig.h for sysconfig into INT dir
adrianbroher Sep 29, 2016
ce62a26
Disable generation of python compiled bytecode when calling python in…
adrianbroher Oct 19, 2016
b58086f
Populate Makefile variable with MacOSX framework variables
adrianbroher Oct 19, 2016
fc5fc99
Set INSTALL_NAME_DIR only for non-frameworks on OSX
adrianbroher Nov 15, 2016
bc5950e
Set python exe RPATH to search for libpython in Frameworks
adrianbroher Mar 23, 2017
fd1de2c
Use python<major>.<minor> as executable output name
adrianbroher Apr 15, 2018
bb96f73
Copy 3.6 patches to 3.7
o01eg May 19, 2022
844c8c9
Copy 3.7 patches to 3.8
o01eg May 25, 2022
4fea5a0
Copy 3.8 patches to 3.9
o01eg Apr 10, 2023
6ae664a
Copy patches 3.10
o01eg Feb 22, 2025
6750c8c
Fix 3.10 patches
o01eg Feb 22, 2025
bc5207e
Fix 3.10 patches again
o01eg Feb 22, 2025
959dc28
Copy patches 3.11
o01eg Feb 23, 2025
dbf1fc5
Fix Windows build
o01eg May 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 56 additions & 28 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,25 @@ else()
set(BUILD_WININST_ALWAYS OFF)
endif()

if(APPLE)
option(BUILD_FRAMEWORK "Build a Mac OSX Framework" OFF)
if(BUILD_FRAMEWORK)
set(BUILD_LIBPYTHON_SHARED ON CACHE BOOL "Forced to ON because of BUILD_FRAMEWORK=ON" FORCE)
endif()
else()
set(BUILD_FRAMEWORK OFF)
endif()
if(BUILD_FRAMEWORK)
set(FRAMEWORK_NAME Python)
set(FRAMEWORK_PREFIX ${CMAKE_INSTALL_PREFIX})
set(FRAMEWORK_DIR_ROOT ${FRAMEWORK_NAME}.framework)
set(FRAMEWORK_DIR_PREFIX ${FRAMEWORK_DIR_ROOT}/Versions/${PY_VERSION_MAJOR}.${PY_VERSION_MINOR})
else()
set(FRAMEWORK_NAME "")
set(FRAMEWORK_PREFIX "")
set(FRAMEWORK_DIR_ROOT "no-framework")
set(FRAMEWORK_DIR_PREFIX "")
endif()
option(INSTALL_DEVELOPMENT "Install files required to develop C extensions" ON)
option(INSTALL_MANUAL "Install man files" ON)
option(INSTALL_TEST "Install test files" ON)
Expand Down Expand Up @@ -524,18 +543,25 @@ if(USE_LIB64)
set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ON)
set(LIBDIR "lib64")
endif()
set(PYTHONHOME "${LIBDIR}")
if(UNIX)
set(PYTHONHOME "${PYTHONHOME}/${LIBPYTHON}")
if(BUILD_FRAMEWORK)
set(LIBDIR ${FRAMEWORK_DIR_PREFIX}/lib)
endif()
set(PYTHONHOME "${LIBDIR}/${LIBPYTHON}")

# Install tree directory
set(BIN_INSTALL_DIR bin) # Contains the python executable
if(INSTALL_WINDOWS_TRADITIONAL)
set(BIN_INSTALL_DIR .) # Contains the python executable
endif()
if(BUILD_FRAMEWORK)
set(BIN_INSTALL_DIR ${FRAMEWORK_DIR_PREFIX}/bin)
endif()
set(SHARE_INSTALL_DIR share)
if(BUILD_FRAMEWORK)
set(SHARE_INSTALL_DIR ${FRAMEWORK_DIR_PREFIX}/share)
endif()
set(LD_VERSION ${LIBPYTHON_VERSION}${ABIFLAGS})
set(CONFIG_INSTALL_DIR share/${LIBPYTHON})
set(CONFIG_INSTALL_DIR ${SHARE_INSTALL_DIR}/${LIBPYTHON})
set(EXTENSION_INSTALL_DIR ${PYTHONHOME}/lib-dynload)

if (${LIBPYTHON_VERSION} GREATER 3.1)
Expand All @@ -549,15 +575,19 @@ if(INSTALL_WINDOWS_TRADITIONAL)
endif()
set(INCLUDE_INSTALL_DIR include/python${LD_VERSION})
if(MSVC)
set(INCLUDE_INSTALL_DIR include)
set(INCLUDE_INSTALL_DIR include/python${PY_VERSION_MAJOR}.${PY_VERSION_MINOR})
endif()
if(BUILD_FRAMEWORK)
set(REL_INCLUDE_INSTALL_DIR include/python${PY_VERSION_MAJOR}.${PY_VERSION_MINOR})
set(INCLUDE_INSTALL_DIR ${FRAMEWORK_DIR_PREFIX}/include/python${PY_VERSION_MAJOR}.${PY_VERSION_MINOR})
endif()
# Build tree directory
set(BIN_BUILD_DIR ${PROJECT_BINARY_DIR}/bin)
set(CONFIG_BUILD_DIR ${PROJECT_BINARY_DIR}/${CONFIG_INSTALL_DIR})
set(EXTENSION_BUILD_DIR ${PROJECT_BINARY_DIR}/${PYTHONHOME}/lib-dynload)
set(INCLUDE_BUILD_DIR ${SRC_DIR}/Include)

set(ARCHIVEDIR "libs") # Contains the static (*.a) and import libraries (*.lib)
set(ARCHIVEDIR "lib") # Contains the static (*.a) and import libraries (*.lib)

# Directories specific to 'libpython'
set(LIBPYTHON_LIBDIR ${LIBDIR})
Expand All @@ -577,6 +607,9 @@ if(UNIX)
set(PYCONFIG_BUILD_DIR ${BIN_BUILD_DIR})
configure_file(cmake/config-unix/pyconfig.h.in
${PYCONFIG_BUILD_DIR}/pyconfig.h)
file(GENERATE
OUTPUT $<TARGET_FILE_DIR:python>/pyconfig.h
INPUT ${PYCONFIG_BUILD_DIR}/pyconfig.h)
elseif(WIN32)
set(PYCONFIG_BUILD_DIR ${SRC_DIR}/PC) # In a windows build tree, 'pyconfig.h' is NOT required to
# live along side the python executable.
Expand Down Expand Up @@ -647,7 +680,11 @@ if(BUILD_LIBPYTHON_SHARED AND UNIX)
if(APPLE)
set(_envvar DYLD_LIBRARY_PATH)
endif()
set(PYTHON_WRAPPER_COMMAND env ${_envvar}=${PROJECT_BINARY_DIR}/${LIBPYTHON_LIBDIR})
set(PYTHON_HOME_PATH )
if(BUILD_FRAMEWORK)
set(PYTHON_HOME_PATH PYTHONHOME=${PROJECT_BINARY_DIR}/${PYTHONHOME} PYTHONPATH=${PROJECT_BINARY_DIR}/${PYTHONHOME})
endif()
set(PYTHON_WRAPPER_COMMAND env ${_envvar}=${PROJECT_BINARY_DIR}/${LIBPYTHON_LIBDIR} ${PYTHON_HOME_PATH})
endif()

# Add extension modules
Expand Down Expand Up @@ -680,7 +717,7 @@ endif()

# Add target to run "Argument Clinic" over all source files
add_custom_target(clinic
COMMAND python ${SRC_DIR}/Tools/clinic/clinic.py --make
COMMAND python -B ${SRC_DIR}/Tools/clinic/clinic.py --make
DEPENDS python
WORKING_DIRECTORY ${SRC_DIR}
COMMENT "Running 'Argument Clinic' over all source files"
Expand Down Expand Up @@ -748,7 +785,7 @@ endif()

# Add target to generate 'opcode.h' header file
add_custom_target(generate_opcode_h
COMMAND python ${SRC_DIR}/Tools/scripts/generate_opcode_h.py
COMMAND python -B ${SRC_DIR}/Tools/scripts/generate_opcode_h.py
${SRC_DIR}/Lib/opcode.py
${PROJECT_BINARY_DIR}/CMakeFiles/opcode.h
COMMAND ${CMAKE_COMMAND} -E copy_if_different
Expand All @@ -762,7 +799,7 @@ add_custom_target(generate_opcode_h

# Add target to generate 'Include/Python-ast.h' from 'Python.asdl'
add_custom_target(generate_python_ast_h
COMMAND python ${SRC_DIR}/Parser/asdl_c.py
COMMAND python -B ${SRC_DIR}/Parser/asdl_c.py
-h ${SRC_DIR}/Include
${SRC_DIR}/Parser/Python.asdl
DEPENDS python
Expand All @@ -773,7 +810,7 @@ add_custom_target(generate_python_ast_h

# Add target to generate 'Python/Python-ast.c' from 'Python.asdl'
add_custom_target(generate_python_ast_c
COMMAND python ${SRC_DIR}/Parser/asdl_c.py
COMMAND python -B ${SRC_DIR}/Parser/asdl_c.py
-c ${SRC_DIR}/Python
${SRC_DIR}/Parser/Python.asdl
DEPENDS python
Expand Down Expand Up @@ -815,7 +852,7 @@ if(UNIX)
${PROJECT_BINARY_DIR}/Misc/python-${LIBPYTHON_VERSION}.pc
${PROJECT_BINARY_DIR}/Misc/python-${PY_VERSION_MAJOR}.pc
${PROJECT_BINARY_DIR}/Misc/python.pc
DESTINATION lib/pkgconfig
DESTINATION ${LIBDIR}/pkgconfig
COMPONENT Development)
endif()

Expand All @@ -825,9 +862,12 @@ if(UNIX)
set(MAKEFILE_LDSHARED_FLAGS "-dynamiclib -headerpad_max_install_names -undefined dynamic_lookup")
endif()
configure_file(cmake/makefile-variables.in
${BIN_BUILD_DIR}/Makefile @ONLY)
${BIN_BUILD_DIR}/Makefile.in @ONLY)
file(GENERATE
OUTPUT $<TARGET_FILE_DIR:python>/Makefile
INPUT ${BIN_BUILD_DIR}/Makefile.in)
if(INSTALL_DEVELOPMENT)
install(FILES ${BIN_BUILD_DIR}/Makefile
install(FILES $<TARGET_FILE_DIR:python>/Makefile
DESTINATION ${LIB_CONFIG_INSTALL_DIR}
RENAME Makefile
COMPONENT Development)
Expand All @@ -842,7 +882,7 @@ if(UNIX)

# Install manual
if(INSTALL_MANUAL)
set(_install_man FILES ${SRC_DIR}/Misc/python.man DESTINATION share/man/man1 COMPONENT Runtime)
set(_install_man FILES ${SRC_DIR}/Misc/python.man DESTINATION ${SHARE_INSTALL_DIR}/man/man1 COMPONENT Runtime)
install(${_install_man} RENAME python${LIBPYTHON_VERSION}.1)
install(${_install_man} RENAME python${PY_VERSION_MAJOR}.1)
endif()
Expand Down Expand Up @@ -870,7 +910,7 @@ if(BUILD_TESTING)
)
set(TESTPROG ${PROJECT_BINARY_DIR}/${PYTHONHOME}/test/regrtest.py)
set(TESTPYTHONOPTS )
set(TESTPYTHON $<TARGET_FILE:python> ${TESTPYTHONOPTS})
set(TESTPYTHON $<TARGET_FILE:python> -B ${TESTPYTHONOPTS})
set(TESTPYTHON ${CMAKE_CROSSCOMPILING_EMULATOR} ${TESTPYTHON})
include(cmake/UnitTests.cmake)
foreach(unittest ${unittests})
Expand Down Expand Up @@ -941,18 +981,6 @@ write_basic_package_version_file(
COMPATIBILITY SameMajorVersion
)

if(INSTALL_DEVELOPMENT)
# Install 'PythonTargets.cmake', 'PythonConfig.cmake' and 'PythonConfigVersion.cmake
install(EXPORT PythonTargets
FILE PythonTargets.cmake
DESTINATION ${CONFIG_INSTALL_DIR} COMPONENT Development)

install(
FILES ${python_install_config} ${python_config_version}
DESTINATION ${CONFIG_INSTALL_DIR} COMPONENT Development
)
endif()

# Install License
set(license_destination ${PYTHONHOME})
if(INSTALL_WINDOWS_TRADITIONAL)
Expand Down
4 changes: 3 additions & 1 deletion cmake/ConfigureChecks.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -911,7 +911,9 @@ set(WITH_DYLD 0)
set(WITH_NEXT_FRAMEWORK 0)
if(APPLE)
set(WITH_DYLD 1)
set(WITH_NEXT_FRAMEWORK 0) # TODO: See --enable-framework option.
if(BUILD_FRAMEWORK)
set(WITH_NEXT_FRAMEWORK 1) # TODO: See --enable-framework option.
endif()
endif()
set(PYTHONFRAMEWORK "")

Expand Down
2 changes: 1 addition & 1 deletion cmake/extensions/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,7 @@ add_python_extension(_xxtestfuzz
_xxtestfuzz/fuzzer.c
)

if (NOT ANDROID)
if (NOT ANDROID AND NOT WIN32)
# Python 3.8
set(_wide_char_modifier "L")
add_python_extension(_testinternalcapi
Expand Down
18 changes: 18 additions & 0 deletions cmake/include/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,21 @@ foreach(file ${hfiles})
install(FILES ${includedir}/${file} DESTINATION ${INCLUDE_INSTALL_DIR}/${path} COMPONENT Development)
endif()
endforeach()
if(BUILD_FRAMEWORK)
install(CODE "
message(STATUS \"Creating Python header framework symlinks...\")
execute_process(
COMMAND
\${CMAKE_COMMAND} -E create_symlink Versions/Current/Headers Headers
WORKING_DIRECTORY
\"${CMAKE_INSTALL_PREFIX}/${FRAMEWORK_DIR_ROOT}\"
)

execute_process(
COMMAND
\${CMAKE_COMMAND} -E create_symlink \"${REL_INCLUDE_INSTALL_DIR}\" Headers
WORKING_DIRECTORY
\"${CMAKE_INSTALL_PREFIX}/${FRAMEWORK_DIR_PREFIX}\"
)
")
endif()
4 changes: 4 additions & 0 deletions cmake/lib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ if(UNIX)
set(plat_subdir "plat-linux")
endif()

if(APPLE)
set(plat_subdir "plat-darwin")
endif()

foreach(file ${libfiles})
# Don't install files for other platforms
string(REGEX MATCH "^plat-" is_platform_file "${file}")
Expand Down
51 changes: 49 additions & 2 deletions cmake/libpython/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,9 @@ elseif(WIN32)
PROPERTY COMPILE_DEFINITIONS
"PY3_DLLNAME=${_wide_char_modifier}\"python3$<$<CONFIG:Debug>:_d>\"" # Python 3.11
)
if(MSVC)
add_compile_options(/wd4101 /wd4018 /wd4244 /wd4996)
endif()
endif()

set(PYTHON_COMMON_SOURCES
Expand Down Expand Up @@ -895,7 +898,6 @@ function(add_libpython name type install component)
OUTPUT_NAME ${LIBPYTHON}${ABIFLAGS}
LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${LIBPYTHON_LIBDIR}
RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${LIBPYTHON_LIBDIR}
INSTALL_NAME_DIR ${CMAKE_INSTALL_PREFIX}/${LIBPYTHON_LIBDIR}
)
set_target_properties(${name} PROPERTIES
POSITION_INDEPENDENT_CODE ON
Expand All @@ -911,13 +913,41 @@ function(add_libpython name type install component)
# Export target
set_property(GLOBAL APPEND PROPERTY PYTHON_TARGETS ${name})

if(BUILD_FRAMEWORK)
set_target_properties(${name} PROPERTIES
FRAMEWORK TRUE
FRAMEWORK_VERSION "${PY_VERSION_MAJOR}.${PY_VERSION_MINOR}"
MACOSX_FRAMEWORK_IDENTIFIER org.python.python
MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${PY_VERSION_MAJOR}.${PY_VERSION_MINOR}"
MACOSX_FRAMEWORK_BUNDLE_VERSION "${PY_VERSION_MAJOR}.${PY_VERSION_MINOR}"
MACOSX_RPATH ON
OUTPUT_NAME ${FRAMEWORK_NAME}
)
else()
set_target_properties(${name} PROPERTIES
INSTALL_NAME_DIR ${CMAKE_INSTALL_PREFIX}/${LIBPYTHON_LIBDIR}
)
endif()

if(install)
install(TARGETS ${name} EXPORT PythonTargets
install(TARGETS ${name}
ARCHIVE DESTINATION ${LIBPYTHON_ARCHIVEDIR}
LIBRARY DESTINATION ${LIBPYTHON_LIBDIR}
RUNTIME DESTINATION ${LIBPYTHON_LIBDIR}
FRAMEWORK DESTINATION ${CMAKE_INSTALL_PREFIX}
COMPONENT ${component}
)
if(BUILD_FRAMEWORK)
install(CODE "
message(STATUS \"Creating Python library framework symlinks...\")
execute_process(
COMMAND
\${CMAKE_COMMAND} -E create_symlink \"../${FRAMEWORK_NAME}\" libpython${PY_VERSION_MAJOR}.${PY_VERSION_MINOR}.dylib
WORKING_DIRECTORY
\"${CMAKE_INSTALL_PREFIX}/${FRAMEWORK_DIR_PREFIX}/lib\"
)
")
endif()
endif()
endfunction()

Expand All @@ -926,6 +956,15 @@ if(BUILD_LIBPYTHON_SHARED)
set_target_properties(libpython-shared PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${LIBPYTHON_ARCHIVEDIR}
)

if((MSVC_VERSION GREATER 1500) AND (NOT CMAKE_VERSION VERSION_LESS "3.1"))
install(
FILES $<TARGET_PDB_FILE:libpython-shared>
DESTINATION ${LIBPYTHON_ARCHIVEDIR}
CONFIGURATIONS Debug RelWithDebInfo
)
endif()

if(APPLE)
# HACK For python <= 2.7.3, this fix link error related to undefined _environ symbol and
# is equivalent to solution implemented in commit http://hg.python.org/cpython/rev/864b983
Expand Down Expand Up @@ -1003,6 +1042,14 @@ if(BUILD_LIBPYTHON_SHARED)
"PYTHON_DLL_NAME=\"python${PY_VERSION_MAJOR}${PY_VERSION_MINOR}$<$<CONFIG:Debug>:_d>\""
)
endif()

if((MSVC_VERSION GREATER 1500) AND (NOT CMAKE_VERSION VERSION_LESS "3.1"))
install(
FILES $<TARGET_PDB_FILE:libpython3-shared>
DESTINATION ${LIBPYTHON_ARCHIVEDIR}
CONFIGURATIONS Debug RelWithDebInfo
)
endif()
endif()

if(UNIX AND NOT APPLE)
Expand Down
10 changes: 5 additions & 5 deletions cmake/makefile-variables.in
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,11 @@ EXE= @CMAKE_EXECUTABLE_SUFFIX@
BUILDEXE= @CMAKE_EXECUTABLE_SUFFIX@

# Short name and location for Mac OS X Python framework
UNIVERSALSDK=
PYTHONFRAMEWORK=
PYTHONFRAMEWORKDIR= no-framework
PYTHONFRAMEWORKPREFIX=
PYTHONFRAMEWORKINSTALLDIR=
UNIVERSALSDK= @CMAKE_OSX_SYSROOT@
PYTHONFRAMEWORK= @FRAMEWORK_NAME@
PYTHONFRAMEWORKDIR= @FRAMEWORK_DIR_ROOT@
PYTHONFRAMEWORKPREFIX= @FRAMEWORK_PREFIX@
PYTHONFRAMEWORKINSTALLDIR= @FRAMEWORK_DIR_PREFIX@
# Deployment target selected during configure, to be checked
# by distutils. The export statement is needed to ensure that the
# deployment target is active during build.
Expand Down
Loading
Loading