1- cmake_minimum_required (VERSION 3.14 FATAL_ERROR )
1+ cmake_minimum_required (VERSION 3.18 FATAL_ERROR )
22
33project (ErlangPythonNIF C )
44
@@ -51,50 +51,41 @@ endif()
5151include (FindErlang )
5252include_directories (${ERLANG_ERTS_INCLUDE_PATH} )
5353
54- # Find Python - use the PYTHON_CONFIG env variable if set
54+ # Find Python using CMake's built-in FindPython3
55+ # Use PYTHON_CONFIG env variable to hint which Python to use
5556if (DEFINED ENV{PYTHON_CONFIG})
56- set (Python3_CONFIG " $ENV{PYTHON_CONFIG} " )
57+ # Extract prefix from python-config for hinting
5758 execute_process (
58- COMMAND ${Python3_CONFIG } --prefix
59- OUTPUT_VARIABLE Python3_PREFIX
59+ COMMAND $ENV{PYTHON_CONFIG } --prefix
60+ OUTPUT_VARIABLE Python3_ROOT_DIR
6061 OUTPUT_STRIP_TRAILING_WHITESPACE
6162 )
62- execute_process (
63- COMMAND ${Python3_CONFIG} --includes
64- OUTPUT_VARIABLE Python3_INCLUDE_FLAGS
65- OUTPUT_STRIP_TRAILING_WHITESPACE
66- )
67- execute_process (
68- COMMAND ${Python3_CONFIG} --ldflags --embed
69- OUTPUT_VARIABLE Python3_LINK_FLAGS
70- OUTPUT_STRIP_TRAILING_WHITESPACE
71- RESULT_VARIABLE Python3_EMBED_RESULT
72- )
73- if (NOT Python3_EMBED_RESULT EQUAL 0)
74- execute_process (
75- COMMAND ${Python3_CONFIG} --ldflags
76- OUTPUT_VARIABLE Python3_LINK_FLAGS
77- OUTPUT_STRIP_TRAILING_WHITESPACE
78- )
79- endif ()
80-
81- # Extract include directories from flags
82- string (REGEX MATCHALL "-I[^ ]+" Python3_INCLUDE_DIRS_LIST "${Python3_INCLUDE_FLAGS} " )
83- string (REGEX REPLACE "-I" "" Python3_INCLUDE_DIRS_LIST "${Python3_INCLUDE_DIRS_LIST} " )
84-
85- message (STATUS "Using Python config: ${Python3_CONFIG} " )
86- message (STATUS "Python includes: ${Python3_INCLUDE_FLAGS} " )
87- message (STATUS "Python link flags: ${Python3_LINK_FLAGS} " )
88- else ()
89- # Use CMake's FindPython3
90- find_package (Python3 REQUIRED COMPONENTS Development )
91- set (Python3_INCLUDE_DIRS_LIST ${Python3_INCLUDE_DIRS} )
92- set (Python3_LINK_FLAGS "${Python3_LIBRARIES} " )
63+ set (Python3_FIND_STRATEGY LOCATION)
9364endif ()
9465
66+ find_package (Python3 REQUIRED COMPONENTS Interpreter Development )
67+
68+ message (STATUS "Python3 executable: ${Python3_EXECUTABLE} " )
69+ message (STATUS "Python3 version: ${Python3_VERSION} " )
70+ message (STATUS "Python3 include dirs: ${Python3_INCLUDE_DIRS} " )
71+ message (STATUS "Python3 libraries: ${Python3_LIBRARIES} " )
72+ message (STATUS "Python3 library: ${Python3_LIBRARY} " )
73+
9574# Create the NIF shared library
9675add_library (py_nif MODULE py_nif.c )
9776
77+ # Pass Python library path to NIF for dlopen
78+ # Python3_LIBRARY is the full path to the Python shared library
79+ if (Python3_LIBRARY)
80+ target_compile_definitions (py_nif PRIVATE PYTHON_LIBRARY_PATH= "${Python3_LIBRARY} " )
81+ message (STATUS "Using Python library path for dlopen: ${Python3_LIBRARY} " )
82+ elseif (Python3_LIBRARIES)
83+ # Fallback to first library in the list
84+ list (GET Python3_LIBRARIES 0 Python3_FIRST_LIB)
85+ target_compile_definitions (py_nif PRIVATE PYTHON_LIBRARY_PATH= "${Python3_FIRST_LIB} " )
86+ message (STATUS "Using Python library path for dlopen: ${Python3_FIRST_LIB} " )
87+ endif ()
88+
9889# Set output name
9990set_target_properties (py_nif PROPERTIES
10091 PREFIX ""
@@ -104,7 +95,7 @@ set_target_properties(py_nif PROPERTIES
10495# Include directories
10596target_include_directories (py_nif PRIVATE
10697 ${ERLANG_ERTS_INCLUDE_PATH}
107- ${Python3_INCLUDE_DIRS_LIST }
98+ ${Python3_INCLUDE_DIRS }
10899)
109100
110101# Compiler flags
@@ -140,13 +131,7 @@ elseif(UNIX)
140131endif ()
141132
142133# Link Python
143- if (DEFINED ENV{PYTHON_CONFIG})
144- # Parse the link flags and add them properly
145- separate_arguments (Python3_LINK_FLAGS_LIST UNIX_COMMAND "${Python3_LINK_FLAGS} " )
146- target_link_libraries (py_nif PRIVATE ${Python3_LINK_FLAGS_LIST} )
147- else ()
148- target_link_libraries (py_nif PRIVATE Python3::Python )
149- endif ()
134+ target_link_libraries (py_nif PRIVATE Python3::Python )
150135
151136# Threads
152137find_package (Threads REQUIRED )
0 commit comments