replace recursion with iteration
[liba.git] / python / CMakeLists.txt
blobada3b4ffe47e7915913598a9733adc6b49bbec03
1 option(LIBA_OPENMP "Enable/Disable openmp" $ENV{LIBA_OPENMP})
3 if(LIBA_OPENMP)
4   find_package(OpenMP)
5 endif()
7 if(LIBA_OPENMP AND OpenMP_C_FLAGS)
8   string_append(CMAKE_C_FLAGS ${OpenMP_C_FLAGS})
9 endif()
11 if(LIBA_OPENMP AND OpenMP_CXX_FLAGS)
12   string_append(CMAKE_CXX_FLAGS ${OpenMP_CXX_FLAGS})
13 endif()
15 if(WIN32)
16   set(CMAKE_SHARED_MODULE_SUFFIX ".pyd")
17 endif()
19 if(Python_SOABI)
20   set(python_suffix ".${Python_SOABI}${CMAKE_SHARED_MODULE_SUFFIX}")
21 elseif(EXISTS ${Python_EXECUTABLE})
22   execute_process(COMMAND ${Python_EXECUTABLE} -c
23     "import sysconfig;print(sysconfig.get_config_var(\"EXT_SUFFIX\") or sysconfig.get_config_var(\"SO\"))"
24     ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE python_suffix
25   )
26 endif()
28 if(CYTHON_FOUND) # https://cython.readthedocs.io/en/stable
29   add_custom_command(OUTPUT ${CMAKE_CURRENT_LIST_DIR}/src/${PROJECT_NAME}.c
30     COMMAND ${CYTHON_EXECUTABLE} --fast-fail ${CMAKE_CURRENT_LIST_DIR}/src/${PROJECT_NAME}.pyx
31   )
32 endif()
34 if(python_suffix)
35   set(CMAKE_SHARED_MODULE_SUFFIX ${python_suffix})
36 else()
37   set(python_suffix ${CMAKE_SHARED_MODULE_SUFFIX})
38 endif()
40 set(CMAKE_SHARED_MODULE_PREFIX "")
41 set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
42 set(CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_RELWITHDEBINFO})
43 set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_RELWITHDEBINFO})
44 add_library(apy MODULE $<TARGET_OBJECTS:a> ${CMAKE_CURRENT_LIST_DIR}/src/${PROJECT_NAME}.c)
45 set_target_properties(apy PROPERTIES DEFINE_SYMBOL A_EXPORTS OUTPUT_NAME ${PROJECT_NAME}
46     INTERPROCEDURAL_OPTIMIZATION ${LIBA_IPO} VISIBILITY_INLINES_HIDDEN 1
47     LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_CURRENT_LIST_DIR}
48     LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_CURRENT_LIST_DIR}
49     LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_LIST_DIR}
50     LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_LIST_DIR}
51     CXX_VISIBILITY_PRESET hidden C_VISIBILITY_PRESET hidden
53 add_library_properties(apy PRIVATE alib)
55 if(TARGET Python::Python)
56   target_link_libraries(apy PRIVATE Python::Python)
57   get_property(implib TARGET Python::Python PROPERTY IMPORTED_IMPLIB_RELEASE)
59   if(implib)
60     set_property(TARGET Python::Python PROPERTY MAP_IMPORTED_CONFIG_DEBUG Release)
61   endif()
62 else()
63   string(REGEX REPLACE "optimized;([^;]+).*" "\\1" Python_LIBRARIES "${Python_LIBRARIES}")
64   target_include_directories(apy PRIVATE ${Python_INCLUDE_DIRS})
65   target_link_libraries(apy PRIVATE ${Python_LIBRARIES})
66 endif()
68 if(Python_SITEARCH)
69   set(python_platlib ${Python_SITEARCH})
70 else()
71   execute_process(COMMAND ${Python_EXECUTABLE} -c
72     "import sysconfig;print(sysconfig.get_path(\"platlib\"))"
73     ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE python_platlib
74   )
75 endif()
77 if(NOT python_platlib)
78   set(python_platlib ${CMAKE_INSTALL_LIBDIR}/site-packages)
79 endif()
81 if("${LIBA_INSTALL}" MATCHES "[Pp]ython")
82   install(FILES ${CMAKE_CURRENT_LIST_DIR}/liba.pyi
83     ${CMAKE_CURRENT_LIST_DIR}/liba${python_suffix}
84     DESTINATION ${python_platlib}
85   )
86 elseif("${LIBA_INSTALL}" MATCHES "^$")
87   string(REGEX REPLACE ".*[Ll]ib[/\\](.*)$" "\\1" site "${python_platlib}")
88   install(FILES ${CMAKE_CURRENT_LIST_DIR}/liba.pyi
89     ${CMAKE_CURRENT_LIST_DIR}/liba${python_suffix}
90     DESTINATION ${CMAKE_INSTALL_LIBDIR}/${site}
91   )
92 endif()
94 if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/test/CMakeLists.txt AND Python_EXECUTABLE)
95   add_subdirectory(test)
96 endif()