mirror of
https://github.com/lief-project/LIEF
synced 2026-06-08 15:30:44 +00:00
161 lines
4.0 KiB
CMake
161 lines
4.0 KiB
CMake
|
|
if (LIEF_PY_LIEF_EXT)
|
|
if (LIEF_PY_LIEF_EXT_SHARED)
|
|
find_package(LIEF REQUIRED COMPONENTS SHARED)
|
|
else()
|
|
find_package(LIEF REQUIRED COMPONENTS STATIC)
|
|
endif()
|
|
message(STATUS "Using pre-installed version of LIEF")
|
|
set(LIEF_TARGET LIEF::LIEF)
|
|
set_target_properties(LIB_LIEF PROPERTIES EXCLUDE_FROM_ALL ON)
|
|
else()
|
|
set(LIEF_TARGET LIB_LIEF)
|
|
endif()
|
|
|
|
include(FetchContent)
|
|
|
|
if (LIEF_EXTERNAL_NANOBIND)
|
|
find_package(Python REQUIRED COMPONENTS Interpreter Development.Module)
|
|
find_package(nanobind REQUIRED)
|
|
else()
|
|
set(NANOBIND_VERSION 2.12.0.r18.g2ed93bf)
|
|
set(NANOBIND_SHA256 SHA256=9565ad98a2b776ab9cddab5c4898dbf6df28ab78607d0269b9c92b36e5a39d94)
|
|
set(NANOBIND_URL "${THIRD_PARTY_DIRECTORY}/nanobind-${NANOBIND_VERSION}.zip"
|
|
CACHE STRING "URL to the Nanobind")
|
|
FetchContent_Declare(nanobind
|
|
URL ${NANOBIND_URL}
|
|
URL_HASH ${NANOBIND_SHA256}
|
|
)
|
|
FetchContent_MakeAvailable(nanobind)
|
|
find_package(Python REQUIRED COMPONENTS Interpreter Development.Module)
|
|
find_package(nanobind REQUIRED PATHS ${nanobind_SOURCE_DIR}/cmake
|
|
NO_DEFAULT_PATH)
|
|
endif()
|
|
|
|
|
|
message(STATUS "Python version: ${Python_VERSION}")
|
|
message(STATUS "Python lib: ${Python_LIBRARIES}")
|
|
message(STATUS "Python include: ${Python_INCLUDE_DIRS}")
|
|
message(STATUS "Python interpreter: ${Python_EXECUTABLE}")
|
|
|
|
set(NANOBIND_OPT
|
|
NB_STATIC
|
|
NOMINSIZE
|
|
)
|
|
|
|
if (LIEF_PYTHON_STABLE_ABI)
|
|
message(STATUS "Stable ABI enabled")
|
|
list(APPEND NANOBIND_OPT STABLE_ABI)
|
|
endif()
|
|
|
|
if (LIEF_PYTHON_FREE_THREADED)
|
|
message(STATUS "Free threading enabled")
|
|
list(APPEND NANOBIND_OPT FREE_THREADED)
|
|
endif()
|
|
|
|
if (LIEF_PYTHON_STATIC)
|
|
list(APPEND NANOBIND_OPT NB_EXT_STATIC)
|
|
endif()
|
|
|
|
nanobind_add_module(
|
|
pyLIEF
|
|
${NANOBIND_OPT}
|
|
|
|
NB_SUPPRESS_WARNINGS
|
|
|
|
src/pyLIEF.cpp
|
|
)
|
|
|
|
add_subdirectory(src)
|
|
|
|
set_target_properties(pyLIEF PROPERTIES
|
|
POSITION_INDEPENDENT_CODE ON
|
|
CXX_STANDARD 17
|
|
CXX_STANDARD_REQUIRED ON
|
|
CXX_VISIBILITY_PRESET hidden
|
|
C_VISIBILITY_PRESET hidden
|
|
PREFIX ""
|
|
OUTPUT_NAME "_lief"
|
|
)
|
|
|
|
|
|
if (LIEF_EXTRA_FLAGS)
|
|
target_compile_options(pyLIEF PRIVATE ${LIEF_EXTRA_FLAGS})
|
|
endif()
|
|
|
|
if (MSVC AND NOT CLANG_CL AND NOT LIEF_EXTERNAL_SPDLOG)
|
|
target_compile_definitions(pyLIEF PRIVATE FMT_UNICODE=0)
|
|
endif()
|
|
|
|
target_link_libraries(pyLIEF PUBLIC ${LIEF_TARGET} lief_spdlog)
|
|
|
|
target_precompile_headers(pyLIEF PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/pylief-pch.hpp
|
|
)
|
|
|
|
if(APPLE)
|
|
set_target_properties(pyLIEF PROPERTIES
|
|
MACOSX_RPATH ON
|
|
LINK_FLAGS "-undefined dynamic_lookup "
|
|
)
|
|
endif()
|
|
|
|
|
|
if (UNIX OR MUSL)
|
|
if (LIEF_PYTHON_STATIC)
|
|
set_target_properties(pyLIEF PROPERTIES SUFFIX ".a")
|
|
else()
|
|
# Even on osx (c.f. EXT_SUFFIX from sysconfig)
|
|
set_target_properties(pyLIEF PROPERTIES SUFFIX ".so")
|
|
endif()
|
|
elseif(WIN32)
|
|
if (LIEF_PYTHON_STATIC)
|
|
set_target_properties(pyLIEF PROPERTIES SUFFIX ".lib")
|
|
else()
|
|
set_target_properties(pyLIEF PROPERTIES SUFFIX ".pyd")
|
|
endif()
|
|
endif()
|
|
|
|
|
|
if (WIN32)
|
|
target_link_libraries(pyLIEF PUBLIC ${PYTHON_LIBRARIES} bcrypt)
|
|
endif()
|
|
|
|
if (ANDROID)
|
|
target_link_libraries(pyLIEF PUBLIC Python::Module)
|
|
endif()
|
|
|
|
if(SKBUILD)
|
|
if(LIEF_PYTHON_EDITABLE)
|
|
install(TARGETS pyLIEF LIBRARY DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/lief)
|
|
else()
|
|
install(TARGETS pyLIEF LIBRARY DESTINATION ${SKBUILD_PLATLIB_DIR}/lief/)
|
|
endif()
|
|
endif()
|
|
|
|
if (LIEF_ASAN)
|
|
target_link_libraries(pyLIEF INTERFACE libclang_rt.asan.so)
|
|
endif()
|
|
|
|
if (LIEF_TSAN)
|
|
target_link_libraries(pyLIEF INTERFACE libclang_rt.tsan.so)
|
|
endif()
|
|
|
|
if (LIEF_PYTHON_STATIC)
|
|
set(NANOBIND_TARGET nanobind-static)
|
|
if (LIEF_PYTHON_STABLE_ABI)
|
|
set(NANOBIND_TARGET nanobind-static-abi3)
|
|
endif()
|
|
install(TARGETS ${NANOBIND_TARGET} pyLIEF
|
|
DESTINATION lib/python-${Python_VERSION})
|
|
|
|
install(
|
|
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lief
|
|
DESTINATION lib/python/typing
|
|
FILES_MATCHING
|
|
REGEX "(.*).(pyi)$")
|
|
|
|
install(DIRECTORY ${NB_DIR}/include/
|
|
DESTINATION include/)
|
|
endif()
|