2017-03-30 16:56:49 +02:00
|
|
|
|
cmake_minimum_required(VERSION 3.1)
|
|
|
|
|
include(ExternalProject)
|
2017-04-16 10:40:30 +02:00
|
|
|
|
include(CheckCXXCompilerFlag)
|
|
|
|
|
include(CheckCCompilerFlag)
|
2017-03-30 16:56:49 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set(Python_ADDITIONAL_VERSIONS 2.7 2.7.6 3.4 3.5 3.6 3.7)
|
|
|
|
|
if (NOT ${PYTHON_VERSION} STREQUAL "")
|
|
|
|
|
find_package(PythonLibs ${PYTHON_VERSION} EXACT)
|
|
|
|
|
|
|
|
|
|
if (NOT PythonLibs_FOUND)
|
|
|
|
|
find_package(PythonLibs ${PYTHON_VERSION})
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
set(PYTHONLIBS_VERSION_STRING "${PYTHON_VERSION}")
|
|
|
|
|
if (NOT PythonLibs_FOUND)
|
|
|
|
|
# WARNING: DIRTY HACK
|
|
|
|
|
# ^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
if ((${PYTHON_VERSION} VERSION_GREATER "3") OR (${PYTHON_VERSION} VERSION_EQUAL "3"))
|
|
|
|
|
if (UNIX)
|
|
|
|
|
set(PYTHON_LIBRARY /usr/lib/libpython${PYTHON_VERSION}.so)
|
|
|
|
|
if(EXISTS "/usr/include/python${PYTHON_VERSION}" AND IS_DIRECTORY "/usr/include/python${PYTHON_VERSION}")
|
|
|
|
|
set(PYTHON_INCLUDE_DIR /usr/include/python${PYTHON_VERSION})
|
|
|
|
|
set(PYTHONLIBS_VERSION_STRING "${PYTHON_VERSION}")
|
|
|
|
|
elseif(EXISTS "/usr/include/python${PYTHON_VERSION}m" AND IS_DIRECTORY "/usr/include/python${PYTHON_VERSION}m")
|
|
|
|
|
set(PYTHON_INCLUDE_DIR /usr/include/python${PYTHON_VERSION}m)
|
|
|
|
|
set(PYTHONLIBS_VERSION_STRING "${PYTHON_VERSION}m")
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
else()
|
|
|
|
|
find_package(PythonLibs REQUIRED)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
message(STATUS "Python version: ${PYTHONLIBS_VERSION_STRING}")
|
|
|
|
|
message(STATUS "Python lib: ${PYTHON_LIBRARY}")
|
|
|
|
|
message(STATUS "Python include: ${PYTHON_INCLUDE_DIR}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set(PYBIND11_GIT_URL "https://github.com/pybind/pybind11.git" CACHE STRING "URL to the Pybind11 repo")
|
2017-07-27 16:29:15 +02:00
|
|
|
|
ExternalProject_Add(lief_pybind11
|
2017-03-30 16:56:49 +02:00
|
|
|
|
GIT_REPOSITORY ${PYBIND11_GIT_URL}
|
2017-04-29 20:23:07 +02:00
|
|
|
|
GIT_TAG "v2.1.1"
|
2017-03-30 16:56:49 +02:00
|
|
|
|
CONFIGURE_COMMAND ""
|
|
|
|
|
BUILD_COMMAND ""
|
|
|
|
|
INSTALL_COMMAND "")
|
2017-07-27 16:29:15 +02:00
|
|
|
|
ExternalProject_get_property(lief_pybind11 SOURCE_DIR)
|
2017-04-05 15:33:18 +02:00
|
|
|
|
set(PYBIND11_SOURCE_DIR "${SOURCE_DIR}")
|
2017-03-30 16:56:49 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Define source files
|
2017-04-24 10:18:06 -04:00
|
|
|
|
set(LIEF_PYTHON_BASIC_SRC
|
2017-04-05 15:33:18 +02:00
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/pyLIEF.cpp"
|
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/pyUtils.cpp"
|
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/pyIterators.cpp"
|
2017-07-15 14:15:16 +02:00
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/pyExceptions.cpp"
|
2017-07-31 15:16:02 +02:00
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/pyLogger.cpp"
|
2017-07-15 14:15:16 +02:00
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/encoding.cpp"
|
|
|
|
|
)
|
2017-04-05 15:33:18 +02:00
|
|
|
|
|
2017-08-20 07:08:50 +02:00
|
|
|
|
if (LIEF_ENABLE_JSON)
|
|
|
|
|
set(LIEF_PYTHON_BASIC_SRC
|
2017-08-20 07:08:50 +02:00
|
|
|
|
${LIEF_PYTHON_BASIC_SRC}
|
2017-08-20 07:08:50 +02:00
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/pyJson.cpp"
|
|
|
|
|
)
|
|
|
|
|
endif()
|
|
|
|
|
|
2017-04-24 10:18:06 -04:00
|
|
|
|
set(LIEF_PYTHON_SRC
|
|
|
|
|
${LIEF_PYTHON_BASIC_SRC}
|
2017-09-05 22:00:31 +02:00
|
|
|
|
)
|
2017-04-24 10:18:06 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set(LIEF_PYTHON_BASIC_HDR
|
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/pyIterators.hpp"
|
2017-07-15 14:15:16 +02:00
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/pyLIEF.hpp"
|
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/encoding.hpp"
|
|
|
|
|
)
|
2017-04-24 10:18:06 -04:00
|
|
|
|
|
|
|
|
|
set(LIEF_PYTHON_HDR
|
|
|
|
|
${LIEF_PYTHON_BASIC_HDR}
|
2017-09-05 22:00:31 +02:00
|
|
|
|
)
|
2017-03-30 16:56:49 +02:00
|
|
|
|
|
2017-04-24 10:18:06 -04:00
|
|
|
|
source_group("Header Files" FILES ${LIEF_PYTHON_BASIC_HDR})
|
2017-03-30 16:56:49 +02:00
|
|
|
|
|
2017-04-24 10:18:06 -04:00
|
|
|
|
add_library(pyLIEF SHARED ${LIEF_PYTHON_SRC} ${LIEF_PYTHON_HDR})
|
2017-03-30 16:56:49 +02:00
|
|
|
|
|
|
|
|
|
target_include_directories(pyLIEF PUBLIC
|
2017-04-05 15:33:18 +02:00
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/"
|
|
|
|
|
"${PYTHON_INCLUDE_DIR}"
|
|
|
|
|
"${PYBIND11_SOURCE_DIR}/include")
|
2017-03-30 16:56:49 +02:00
|
|
|
|
|
|
|
|
|
add_definitions(-DELPP_NO_DEFAULT_LOG_FILE)
|
|
|
|
|
|
2017-09-05 22:00:31 +02:00
|
|
|
|
include("${CMAKE_CURRENT_SOURCE_DIR}/Abstract/CMakeLists.txt")
|
|
|
|
|
|
2017-03-30 16:56:49 +02:00
|
|
|
|
if(LIEF_ELF)
|
2017-04-05 15:33:18 +02:00
|
|
|
|
include("${CMAKE_CURRENT_SOURCE_DIR}/ELF/CMakeLists.txt")
|
2017-03-30 16:56:49 +02:00
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if(LIEF_PE)
|
2017-04-05 15:33:18 +02:00
|
|
|
|
include("${CMAKE_CURRENT_SOURCE_DIR}/PE/CMakeLists.txt")
|
2017-03-30 16:56:49 +02:00
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if(LIEF_MACHO)
|
2017-04-05 15:33:18 +02:00
|
|
|
|
include("${CMAKE_CURRENT_SOURCE_DIR}/MachO/CMakeLists.txt")
|
2017-03-30 16:56:49 +02:00
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
target_compile_features(pyLIEF PRIVATE cxx_attribute_deprecated)
|
|
|
|
|
|
|
|
|
|
set_property(TARGET pyLIEF PROPERTY CXX_STANDARD 11)
|
|
|
|
|
set_property(TARGET pyLIEF PROPERTY CXX_STANDARD_REQUIRED ON)
|
|
|
|
|
|
|
|
|
|
if (MSVC)
|
|
|
|
|
target_compile_options(pyLIEF PUBLIC /FIiso646.h)
|
|
|
|
|
set_property(TARGET pyLIEF PROPERTY LINK_FLAGS /NODEFAULTLIB:MSVCRT)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
set_target_properties(pyLIEF PROPERTIES PYTHON_VERSION ${PYTHONLIBS_VERSION_STRING})
|
|
|
|
|
set(PYLIEF_DEPS_LIBRARIES LIB_LIEF_STATIC)
|
|
|
|
|
|
|
|
|
|
if(LIEF_COVERAGE)
|
|
|
|
|
target_compile_options(pyLIEF PRIVATE -g -O0 --coverage -fprofile-arcs -ftest-coverage)
|
|
|
|
|
set(PYLIEF_DEPS_LIBRARIES ${PYLIEF_DEPS_LIBRARIES} gcov)
|
|
|
|
|
endif()
|
|
|
|
|
|
2017-04-16 10:40:30 +02:00
|
|
|
|
set(PYLIEF_COMPILE_FLAGS)
|
|
|
|
|
|
2017-03-30 16:56:49 +02:00
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
2017-04-16 10:40:30 +02:00
|
|
|
|
CHECK_CXX_COMPILER_FLAG("-Wno-macro-redefined" HAS_NO_MACRO_REDEFINED)
|
|
|
|
|
set(PYLIEF_COMPILE_FLAGS ${PYLIEF_COMPILE_FLAGS} -Wall -Wextra -Wpedantic)
|
|
|
|
|
if (HAS_NO_MACRO_REDEFINED)
|
|
|
|
|
set(PYLIEF_COMPILE_FLAGS ${PYLIEF_COMPILE_FLAGS} -Wno-macro-redefined)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
target_compile_options(pyLIEF PRIVATE ${PYLIEF_COMPILE_FLAGS})
|
2017-03-30 16:56:49 +02:00
|
|
|
|
endif()
|
|
|
|
|
|
2017-07-25 17:06:30 +02:00
|
|
|
|
#set_target_properties(pyLIEF PROPERTIES PREFIX "" OUTPUT_NAME "lief")
|
|
|
|
|
set_target_properties(pyLIEF PROPERTIES PREFIX "" OUTPUT_NAME "_pylief")
|
2017-07-27 16:29:15 +02:00
|
|
|
|
add_dependencies(pyLIEF lief_pybind11)
|
2017-03-30 16:56:49 +02:00
|
|
|
|
|
|
|
|
|
if(APPLE)
|
|
|
|
|
set_target_properties(pyLIEF PROPERTIES MACOSX_RPATH ".")
|
|
|
|
|
set_target_properties(pyLIEF PROPERTIES LINK_FLAGS "-undefined dynamic_lookup ")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
set_target_properties(pyLIEF PROPERTIES PREFIX "")
|
|
|
|
|
if (UNIX)
|
|
|
|
|
set_target_properties(pyLIEF PROPERTIES SUFFIX ".so")
|
|
|
|
|
elseif(WIN32)
|
|
|
|
|
set_target_properties(pyLIEF PROPERTIES SUFFIX ".pyd")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
get_target_property(suffix pyLIEF SUFFIX)
|
|
|
|
|
set(LIEF_LIBRARY_NAME "lief${suffix}")
|
|
|
|
|
|
|
|
|
|
if (WIN32)
|
|
|
|
|
set(PYLIEF_DEPS_LIBRARIES ${PYLIEF_DEPS_LIBRARIES} ${PYTHON_LIBRARIES})
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
target_link_libraries(pyLIEF PUBLIC ${PYLIEF_DEPS_LIBRARIES})
|
|
|
|
|
|
|
|
|
|
add_custom_command(TARGET pyLIEF POST_BUILD
|
2017-07-25 17:06:30 +02:00
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:pyLIEF> ${PROJECT_BINARY_DIR}/api/python/lief
|
2017-03-30 16:56:49 +02:00
|
|
|
|
)
|
|
|
|
|
|
2017-07-25 17:06:30 +02:00
|
|
|
|
if (MSVC)
|
|
|
|
|
add_custom_command(TARGET pyLIEF POST_BUILD
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:pyLIEF> ${CMAKE_CURRENT_BINARY_DIR}
|
|
|
|
|
)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in" "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
|
|
|
|
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/__init__.py.in" "${CMAKE_CURRENT_BINARY_DIR}/lief/__init__.py")
|
|
|
|
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/README.in" "${CMAKE_CURRENT_BINARY_DIR}/README")
|
2017-03-30 16:56:49 +02:00
|
|
|
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/MANIFEST.in.in" "${CMAKE_CURRENT_BINARY_DIR}/MANIFEST.in")
|
|
|
|
|
|
|
|
|
|
MESSAGE(STATUS "OS: ${CMAKE_HOST_SYSTEM}")
|
|
|
|
|
|
|
|
|
|
find_program(ENV_BINARY "env")
|
|
|
|
|
|
|
|
|
|
if (UNIX AND ENV_BINARY AND LIEF_INSTALL_PYTHON)
|
|
|
|
|
if ((${PYTHONLIBS_VERSION_STRING} VERSION_GREATER "3") OR (${PYTHONLIBS_VERSION_STRING} VERSION_EQUAL "3"))
|
|
|
|
|
install(CODE "execute_process(COMMAND ${ENV_BINARY} python3 ${CMAKE_CURRENT_BINARY_DIR}/setup.py install)"
|
|
|
|
|
COMPONENT python)
|
|
|
|
|
else()
|
|
|
|
|
install(
|
|
|
|
|
CODE "execute_process(COMMAND ${ENV_BINARY} python2 ${CMAKE_CURRENT_BINARY_DIR}/setup.py install)"
|
|
|
|
|
COMPONENT python)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|