Browse Source
This should make integrating the project easier. CMake also works on Windows now.pull/40/head

8 changed files with 317 additions and 398 deletions
@ -1,172 +1,250 @@
|
||||
cmake_minimum_required(VERSION 3.12) |
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/project-meta-info.in") |
||||
include(CMakePrintHelpers) |
||||
|
||||
set(disasm_version_file ${CMAKE_CURRENT_LIST_DIR}/inc/version.h) |
||||
set(BDD_VER_FILE ${CMAKE_CURRENT_LIST_DIR}/inc/version.h) |
||||
|
||||
file(STRINGS ${disasm_version_file} disasm_ver_major REGEX "DISASM_VERSION_MAJOR") |
||||
file(STRINGS ${disasm_version_file} disasm_ver_minor REGEX "DISASM_VERSION_MINOR") |
||||
file(STRINGS ${disasm_version_file} disasm_ver_patch REGEX "DISASM_VERSION_REVISION") |
||||
file(STRINGS ${BDD_VER_FILE} disasm_ver_major REGEX "DISASM_VERSION_MAJOR") |
||||
file(STRINGS ${BDD_VER_FILE} disasm_ver_minor REGEX "DISASM_VERSION_MINOR") |
||||
file(STRINGS ${BDD_VER_FILE} disasm_ver_patch REGEX "DISASM_VERSION_REVISION") |
||||
|
||||
string(REGEX REPLACE "#define DISASM_VERSION_MAJOR[ \t\r\n]*" "" disasm_ver_major ${disasm_ver_major}) |
||||
string(REGEX REPLACE "#define DISASM_VERSION_MINOR[ \t\r\n]*" "" disasm_ver_minor ${disasm_ver_minor}) |
||||
string(REGEX REPLACE "#define DISASM_VERSION_REVISION[ \t\r\n]*" "" disasm_ver_patch ${disasm_ver_patch}) |
||||
|
||||
message(STATUS "Extracted version from ${disasm_version_file}: ${disasm_ver_major}.${disasm_ver_minor}.${disasm_ver_patch}") |
||||
message(STATUS "Extracted version from ${BDD_VER_FILE}: ${disasm_ver_major}.${disasm_ver_minor}.${disasm_ver_patch}") |
||||
|
||||
project(bddisasm |
||||
VERSION ${disasm_ver_major}.${disasm_ver_minor}.${disasm_ver_patch} |
||||
DESCRIPTION ${project_description} |
||||
DESCRIPTION "Bitdefender x86 instruction decoder and emulator" |
||||
LANGUAGES C |
||||
) |
||||
HOMEPAGE_URL https://github.com/bitdefender/bddisasm |
||||
) |
||||
|
||||
if (NOT CMAKE_BUILD_TYPE) |
||||
# Use Release as the build type if no build type was specified and we're not using a multi-config generator . |
||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) |
||||
message(STATUS "No build type given. Will use 'Release'") |
||||
set(CMAKE_BUILD_TYPE Release) |
||||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE) |
||||
# Set the possible values of build type for cmake-gui. |
||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release") |
||||
endif() |
||||
|
||||
# These are shared by bddisasm and bdshemu. |
||||
if (NOT MSVC) |
||||
set(BDDISASM_COMMON_COMPILE_OPTIONS |
||||
"$<$<CONFIG:Release>:-U_FORTIFY_SOURCE>" |
||||
"$<$<CONFIG:Release>:-D_FORTIFY_SOURCE=2>" |
||||
-Wall |
||||
-Wno-unknown-pragmas |
||||
-Wextra |
||||
-Wshadow |
||||
-Wformat-security |
||||
-Wstrict-overflow=2 |
||||
-Wstrict-prototypes |
||||
-Wwrite-strings |
||||
-Wshadow |
||||
-Winit-self |
||||
-Wno-unused-function |
||||
-Wno-multichar |
||||
-Wno-incompatible-pointer-types |
||||
-Wno-discarded-qualifiers |
||||
-Wnull-dereference |
||||
-Wduplicated-cond |
||||
-Werror=format-security |
||||
-Werror=implicit-function-declaration |
||||
-pipe |
||||
-fwrapv |
||||
-fno-strict-aliasing |
||||
-fstack-protector-strong |
||||
-fno-omit-frame-pointer |
||||
-ffunction-sections |
||||
-fdata-sections |
||||
-g3 |
||||
-gdwarf-4 |
||||
-grecord-gcc-switches |
||||
-march=westmere |
||||
) |
||||
else () |
||||
set(BDDISASM_COMMON_COMPILE_OPTIONS /W4 /WX) |
||||
endif () |
||||
|
||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/x64/${CMAKE_BUILD_TYPE}) |
||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/x64/${CMAKE_BUILD_TYPE}) |
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/x64/${CMAKE_BUILD_TYPE}) |
||||
set(BDDISASM_PUBLIC_HEADERS |
||||
"inc/bddisasm.h" |
||||
"inc/constants.h" |
||||
"inc/cpuidflags.h" |
||||
"inc/disasmstatus.h" |
||||
"inc/disasmtypes.h" |
||||
"inc/registers.h" |
||||
"inc/version.h" |
||||
) |
||||
|
||||
message(STATUS "Output directory set to: ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") |
||||
cmake_print_variables(BDDISASM_PUBLIC_HEADERS) |
||||
cmake_print_variables(CMAKE_INSTALL_PREFIX) |
||||
|
||||
set(bddisasm_src |
||||
include(GNUInstallDirs) |
||||
|
||||
set(BDDISASM_INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_INCLUDEDIR}/bddisasm" |
||||
CACHE STRING "Path to bddisasm public include files." |
||||
) |
||||
|
||||
# -- bddisasm -- |
||||
|
||||
add_library(bddisasm STATIC |
||||
bddisasm/crt.c |
||||
bddisasm/bddisasm.c |
||||
) |
||||
add_library(bddisasm STATIC ${bddisasm_src}) |
||||
# Add the headers so they will show up in IDEs. |
||||
bddisasm/include/instructions.h |
||||
bddisasm/include/mnemonics.h |
||||
bddisasm/include/nd_crt.h |
||||
bddisasm/include/prefixes.h |
||||
bddisasm/include/table_evex.h |
||||
bddisasm/include/table_root.h |
||||
bddisasm/include/table_vex.h |
||||
bddisasm/include/table_xop.h |
||||
bddisasm/include/tabledefs.h |
||||
"${BDDISASM_PUBLIC_HEADERS}" |
||||
) |
||||
|
||||
set_target_properties(bddisasm PROPERTIES |
||||
POSITION_INDEPENDENT_CODE ON |
||||
C_STANDARD 11 |
||||
VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} |
||||
) |
||||
) |
||||
|
||||
target_include_directories(bddisasm PRIVATE bddisasm/include) |
||||
target_include_directories(bddisasm PUBLIC |
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/inc> |
||||
$<INSTALL_INTERFACE:${BDDISASM_INSTALL_INCLUDE_DIR}> |
||||
) |
||||
|
||||
set(bdshemu_src |
||||
target_compile_options(bddisasm PRIVATE ${BDDISASM_COMMON_COMPILE_OPTIONS}) |
||||
|
||||
set_target_properties(bddisasm PROPERTIES |
||||
PUBLIC_HEADER "${BDDISASM_PUBLIC_HEADERS}" |
||||
VERSION ${CMAKE_PROJECT_VERSION} |
||||
SOVERSION ${CMAKE_PROJECT_VERSION_MAJOR} |
||||
) |
||||
|
||||
add_library(bddisasm::bddisasm ALIAS bddisasm) |
||||
|
||||
# -- bdshemu -- |
||||
|
||||
add_library(bdshemu STATIC |
||||
bdshemu/bdshemu.c |
||||
) |
||||
add_library(bdshemu STATIC ${bdshemu_src}) |
||||
# Add the headers so they will show up in IDEs. |
||||
inc/bdshemu.h |
||||
) |
||||
|
||||
set_target_properties(bdshemu PROPERTIES |
||||
POSITION_INDEPENDENT_CODE ON |
||||
C_STANDARD 11 |
||||
VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} |
||||
) |
||||
add_dependencies(bdshemu bddisasm) |
||||
|
||||
include_directories( |
||||
inc |
||||
bddisasm/include |
||||
) |
||||
|
||||
if (CMAKE_BUILD_TYPE EQUAL "Release") |
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Ofast -DNDEBUG") |
||||
else () |
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -D_DEBUG -DDEBUG") |
||||
endif () |
||||
|
||||
set(BDDISASM_COMPILE_OPTIONS |
||||
"$<$<CONFIG:Release>:-U_FORTIFY_SOURCE>" |
||||
"$<$<CONFIG:Release>:-D_FORTIFY_SOURCE=2>" |
||||
-Wall |
||||
-Wno-unknown-pragmas |
||||
-Wextra |
||||
-Wshadow |
||||
-Wformat-security |
||||
-Wstrict-overflow=2 |
||||
-Wstrict-prototypes |
||||
-Wwrite-strings |
||||
-Wshadow |
||||
-Winit-self |
||||
-Wno-unused-function |
||||
-Wno-multichar |
||||
-Wno-incompatible-pointer-types |
||||
-Wno-discarded-qualifiers |
||||
-Wnull-dereference |
||||
-Wduplicated-cond |
||||
-Werror=format-security |
||||
-Werror=implicit-function-declaration |
||||
-pipe |
||||
-fwrapv |
||||
-fno-strict-aliasing |
||||
-fstack-protector-strong |
||||
-fno-omit-frame-pointer |
||||
-ffunction-sections |
||||
-fdata-sections |
||||
-g3 |
||||
-gdwarf-4 |
||||
-grecord-gcc-switches |
||||
-march=westmere |
||||
) |
||||
) |
||||
|
||||
target_compile_options(bddisasm PRIVATE ${BDDISASM_COMPILE_OPTIONS}) |
||||
target_compile_options(bdshemu PRIVATE ${BDDISASM_COMPILE_OPTIONS} -maes) |
||||
target_include_directories(bdshemu PRIVATE bddisasm/include) |
||||
target_include_directories(bddisasm PUBLIC |
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/inc> |
||||
$<INSTALL_INTERFACE:${BDDISASM_INSTALL_INCLUDE_DIR}> |
||||
) |
||||
|
||||
include(GNUInstallDirs) |
||||
target_link_libraries(bdshemu PUBLIC bddisasm) |
||||
|
||||
set(CMAKE_SKIP_BUILD_RPATH TRUE) |
||||
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) |
||||
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") |
||||
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) |
||||
target_compile_options(bdshemu PRIVATE ${BDDISASM_COMMON_COMPILE_OPTIONS}) |
||||
if (NOT MSVC) |
||||
target_compile_options(bdshemu PRIVATE -maes) |
||||
endif () |
||||
|
||||
get_filename_component(public_header_path "${PROJECT_SOURCE_DIR}/inc" REALPATH) |
||||
file(GLOB_RECURSE public_headers "${public_header_path}/*.h") |
||||
set_target_properties(bddisasm PROPERTIES PUBLIC_HEADER "${public_headers}") |
||||
set_target_properties(bdshemu PROPERTIES |
||||
PUBLIC_HEADER "inc/bdshemu.h" |
||||
VERSION ${CMAKE_PROJECT_VERSION} |
||||
SOVERSION ${CMAKE_PROJECT_VERSION_MAJOR} |
||||
) |
||||
|
||||
add_library(bddisasm::bdshemu ALIAS bdshemu) |
||||
|
||||
# If this is the master project (or if the user requested it) add disasmtool. |
||||
if ((${CMAKE_PROJECT_NAME} STREQUAL ${PROJECT_NAME}) OR BDD_INCLUDE_TOOL) |
||||
if (WIN32) |
||||
add_subdirectory(disasmtool) |
||||
else () |
||||
add_subdirectory(disasmtool_lix) |
||||
endif () |
||||
endif() |
||||
|
||||
set(DEST_DIR "${CMAKE_INSTALL_PREFIX}") |
||||
set(LIB_DIR "${CMAKE_INSTALL_LIBDIR}") |
||||
set(INC_DIR "${CMAKE_INSTALL_INCLUDEDIR}") |
||||
set(PRIVATE_LIBS "-lbdshemu -lbddisasm") |
||||
set(DATA_DIR "${CMAKE_INSTALL_DATADIR}") |
||||
# If this is the master project add install and package targets. |
||||
if (${CMAKE_PROJECT_NAME} STREQUAL ${PROJECT_NAME}) |
||||
set(BDDISASM_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/bddisasm" |
||||
CACHE STRING "Path to bddisasm cmake files." |
||||
) |
||||
|
||||
CONFIGURE_FILE("${CMAKE_STATIC_LIBRARY_PREFIX}bddisasm.pc.in" |
||||
"${PROJECT_SOURCE_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}bddisasm.pc" |
||||
@ONLY |
||||
set(BDDISASM_INSTALL_PCDIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig" |
||||
CACHE STRING "Path to bddisasm pkgconfig files." |
||||
) |
||||
|
||||
INSTALL(TARGETS bddisasm bdshemu |
||||
EXPORT bddisasmTargets |
||||
LIBRARY DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" |
||||
ARCHIVE DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" |
||||
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/bddisasm" |
||||
set(CMAKE_SKIP_BUILD_RPATH TRUE) |
||||
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) |
||||
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") |
||||
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) |
||||
|
||||
install(TARGETS bddisasm bdshemu disasmtool |
||||
EXPORT bddisasmTargets |
||||
INCLUDES |
||||
DESTINATION ${BDDISASM_INSTALL_INCLUDE_DIR} |
||||
PUBLIC_HEADER |
||||
DESTINATION ${BDDISASM_INSTALL_INCLUDE_DIR} |
||||
COMPONENT bddisasm_Development |
||||
RUNTIME |
||||
DESTINATION ${CMAKE_INSTALL_BINDIR} |
||||
COMPONENT bddisasm_Runtime |
||||
LIBRARY |
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR} |
||||
COMPONENT bddisasm_Runtime |
||||
NAMELINK_COMPONENT bddisasm_Development |
||||
ARCHIVE |
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR} |
||||
COMPONENT bddisasm_Development |
||||
) |
||||
|
||||
set(CMAKE_INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/bddisasm) |
||||
install(EXPORT bddisasmTargets |
||||
DESTINATION ${CMAKE_INSTALL_CONFIGDIR} |
||||
install(EXPORT bddisasmTargets |
||||
DESTINATION ${BDDISASM_INSTALL_CMAKEDIR} |
||||
NAMESPACE bddisasm:: |
||||
FILE bddisasmTargets.cmake |
||||
COMPONENT bddisasm_Development |
||||
) |
||||
|
||||
include(CMakePackageConfigHelpers) |
||||
include(CMakePackageConfigHelpers) |
||||
|
||||
configure_package_config_file(${PROJECT_SOURCE_DIR}/bddisasmConfig.cmake.in ${PROJECT_BINARY_DIR}/bddisasmConfig.cmake |
||||
INSTALL_DESTINATION ${CMAKE_INSTALL_CONFIGDIR} |
||||
PATH_VARS CMAKE_INSTALL_FULL_INCLUDEDIR CMAKE_INSTALL_FULL_LIBDIR |
||||
write_basic_package_version_file("bddisasmConfigVersion.cmake" |
||||
VERSION ${CMAKE_PROJECT_VERSION} |
||||
COMPATIBILITY SameMajorVersion |
||||
) |
||||
|
||||
write_basic_package_version_file(${PROJECT_BINARY_DIR}/bddisasmConfigVersion.cmake |
||||
VERSION ${PROJECT_VERSION} |
||||
COMPATIBILITY SameMajorVersion |
||||
install(FILES bddisasmConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/bddisasmConfigVersion.cmake |
||||
DESTINATION ${BDDISASM_INSTALL_CMAKEDIR} |
||||
COMPONENT bddisasm_Development |
||||
) |
||||
|
||||
install(FILES ${PROJECT_BINARY_DIR}/bddisasmConfig.cmake ${PROJECT_BINARY_DIR}/bddisasmConfigVersion.cmake |
||||
DESTINATION ${CMAKE_INSTALL_CONFIGDIR} |
||||
) |
||||
CONFIGURE_FILE("bddisasm.pc.in" "${CMAKE_STATIC_LIBRARY_PREFIX}bddisasm.pc" @ONLY) |
||||
|
||||
INSTALL(FILES "${PROJECT_SOURCE_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}bddisasm.pc" |
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/pkgconfig" |
||||
INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}bddisasm.pc" |
||||
DESTINATION "${BDDISASM_INSTALL_PCDIR}" |
||||
COMPONENT bddisasm_Development |
||||
) |
||||
|
||||
if (NOT CPACK_GENERATOR) |
||||
set(CPACK_GENERATOR "DEB") |
||||
endif() |
||||
set(CPACK_PACKAGE_VENDOR "Bitdefender") |
||||
|
||||
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Bitdefender HVI Team <hvmi-oss@bitdefender.com>") |
||||
set(CPACK_DEBIAN_PACKAGE_DEPENDS "") |
||||
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64") |
||||
set(CPACK_DEBIAN_PACKAGE_SECTION "devel") |
||||
if (NOT CPACK_GENERATOR) |
||||
if (NOT WIN32) |
||||
set(CPACK_GENERATOR "DEB") |
||||
else () |
||||
set(CPACK_GENERATOR "ZIP") |
||||
endif () |
||||
endif() |
||||
|
||||
if (INCLUDE_TOOL) |
||||
add_subdirectory("disasmtool_lix") |
||||
add_dependencies(disasmtool bdshemu) |
||||
endif() |
||||
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Bitdefender HVI Team <hvmi-oss@bitdefender.com>") |
||||
set(CPACK_DEBIAN_PACKAGE_DEPENDS "") |
||||
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64") |
||||
set(CPACK_DEBIAN_PACKAGE_SECTION "devel") |
||||
|
||||
include(CPack) |
||||
include(CPack) |
||||
endif () |
||||
|
@ -0,0 +1 @@
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/bddisasmTargets.cmake) |
@ -0,0 +1,59 @@
|
||||
cmake_minimum_required(VERSION 3.16) |
||||
|
||||
project(disasmtool LANGUAGES C) |
||||
|
||||
# Use Release as the build type if no build type was specified and we're not using a multi-config generator . |
||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) |
||||
message(STATUS "No build type given. Will use 'Release'") |
||||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE) |
||||
# Set the possible values of build type for cmake-gui. |
||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release") |
||||
endif() |
||||
|
||||
add_executable(disasmtool disasmtool.c) |
||||
target_link_libraries(disasmtool PRIVATE bddisasm::bddisasm bddisasm::bdshemu) |
||||
|
||||
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release") |
||||
include(CheckIPOSupported) |
||||
check_ipo_supported(RESULT USE_IPO) |
||||
if (USE_IPO) |
||||
set_target_properties(bddisasm PROPERTIES INTERPROCEDURAL_OPTIMIZATION True) |
||||
endif () |
||||
endif() |
||||
|
||||
if (NOT MSVC) |
||||
target_compile_options(disasmtool PRIVATE |
||||
-Wall |
||||
-Wno-unknown-pragmas |
||||
-Wextra |
||||
-Wshadow |
||||
-Wformat-security |
||||
-Wstrict-overflow=2 |
||||
-Wstrict-prototypes |
||||
-Wwrite-strings |
||||
-Wshadow |
||||
-Winit-self |
||||
-Wno-unused-function |
||||
-Wno-multichar |
||||
-Wno-incompatible-pointer-types |
||||
-Wno-discarded-qualifiers |
||||
-Wnull-dereference |
||||
-Wduplicated-cond |
||||
-Werror=format-security |
||||
-Werror=implicit-function-declaration |
||||
-pipe |
||||
-fwrapv |
||||
-fno-strict-aliasing |
||||
-fstack-protector-strong |
||||
-fno-omit-frame-pointer |
||||
-ffunction-sections |
||||
-fdata-sections |
||||
-g3 |
||||
-gdwarf-4 |
||||
-grecord-gcc-switches |
||||
-march=westmere |
||||
) |
||||
else () |
||||
target_compile_options(disasmtool PRIVATE |
||||
/W4 /WX) |
||||
endif () |
Loading…
Reference in new issue