From 3495a7cc84bc1e9ac23f615b559dac6689f45b52 Mon Sep 17 00:00:00 2001 From: Ionel-Cristinel ANICHITEI Date: Tue, 30 Mar 2021 12:20:31 +0300 Subject: [PATCH] cmake: Various improvements, especially to the way the bddisasm package is consumed This should make integrating the project easier. CMake also works on Windows now. --- .gitignore | 2 +- CMakeLists.txt | 314 +++++++++++++++++---------- libbddisasm.pc.in => bddisasm.pc.in | 10 +- bddisasmConfig.cmake | 1 + disasmtool/CMakeLists.txt | 59 +++++ disasmtool/disasmtool.c | 1 + disasmtool_lix/CMakeLists.txt | 325 +++++----------------------- project-meta-info.in | 3 - 8 files changed, 317 insertions(+), 398 deletions(-) rename libbddisasm.pc.in => bddisasm.pc.in (70%) create mode 100644 bddisasmConfig.cmake create mode 100644 disasmtool/CMakeLists.txt delete mode 100644 project-meta-info.in diff --git a/.gitignore b/.gitignore index 9adf611..76b6fab 100644 --- a/.gitignore +++ b/.gitignore @@ -64,6 +64,6 @@ bdshemu_fuzz/out-32 bdshemu_fuzz/out-64 docs/build libbddisasm.pc -build +build* .vscode disasmtool_lix/_build diff --git a/CMakeLists.txt b/CMakeLists.txt index f7bc4c1..b8a3e9c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 + "$<$:-U_FORTIFY_SOURCE>" + "$<$:-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 + $ + $ +) -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 - "$<$:-U_FORTIFY_SOURCE>" - "$<$:-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 + $ + $ +) -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 ") -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 ") + set(CPACK_DEBIAN_PACKAGE_DEPENDS "") + set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64") + set(CPACK_DEBIAN_PACKAGE_SECTION "devel") -include(CPack) + include(CPack) +endif () diff --git a/libbddisasm.pc.in b/bddisasm.pc.in similarity index 70% rename from libbddisasm.pc.in rename to bddisasm.pc.in index 9a0ff8c..ebbe833 100644 --- a/libbddisasm.pc.in +++ b/bddisasm.pc.in @@ -1,7 +1,7 @@ -dir_prefix=@DEST_DIR@ -lib=@LIB_DIR@ -include=@INC_DIR@ -data_dir=@DATA_DIR@ +dir_prefix=@CMAKE_INSTALL_PREFIX@ +lib=@CMAKE_INSTALL_LIBDIR@ +include=@BDDISASM_INSTALL_INCLUDE_DIR@ +data_dir=@CMAKE_INSTALL_DATADIR@ prefix=${dir_prefix} lib_dir=${dir_prefix}/${lib} @@ -15,5 +15,5 @@ Description: "Bitdefender x86 instruction decoder and shellcode emulator" URL: https://github.com/bitdefender/bddisasm Version: @PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@ -Libs: -L${lib_dir} @PRIVATE_LIBS@ +Libs: -L${lib_dir} -lbdshemu -lbddisasm Cflags: -I${include_dir} diff --git a/bddisasmConfig.cmake b/bddisasmConfig.cmake new file mode 100644 index 0000000..39a965f --- /dev/null +++ b/bddisasmConfig.cmake @@ -0,0 +1 @@ +include(${CMAKE_CURRENT_LIST_DIR}/bddisasmTargets.cmake) diff --git a/disasmtool/CMakeLists.txt b/disasmtool/CMakeLists.txt new file mode 100644 index 0000000..44113f2 --- /dev/null +++ b/disasmtool/CMakeLists.txt @@ -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 () diff --git a/disasmtool/disasmtool.c b/disasmtool/disasmtool.c index b31513c..de36840 100644 --- a/disasmtool/disasmtool.c +++ b/disasmtool/disasmtool.c @@ -7,6 +7,7 @@ #include #include #include +#include typedef uint64_t QWORD, *PQWORD; diff --git a/disasmtool_lix/CMakeLists.txt b/disasmtool_lix/CMakeLists.txt index bb84296..07c523c 100644 --- a/disasmtool_lix/CMakeLists.txt +++ b/disasmtool_lix/CMakeLists.txt @@ -2,281 +2,64 @@ cmake_minimum_required (VERSION 3.12) project(disasmtool LANGUAGES CXX) -if (NOT CMAKE_BUILD_TYPE) - message(STATUS "No build type given. Will use 'Release'!") - set(CMAKE_BUILD_TYPE Release) +# 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() -if (CMAKE_CXX_FLAGS) - message(STATUS "Passed CXXFLAGS: ${CMAKE_CXX_FLAGS}") -endif() - -if (("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") AND (CMAKE_CXX_FLAGS_DEBUG)) - message(STATUS "Passed CXXFLAGS_DEBUG: ${CMAKE_CXX_FLAGS_DEBUG}") -endif() - -if (("${CMAKE_BUILD_TYPE}" STREQUAL "Release") AND (CMAKE_CXX_FLAGS_RELEASE)) - message(STATUS "Passed CXXFLAGS_RELEASE: ${CMAKE_CXX_FLAGS_RELEASE}") -endif() - -get_filename_component(DISASM_DIRECTORY "${PROJECT_SOURCE_DIR}/.." REALPATH) -set(DISASM_BUILD_PREFIX "bin/x64") - -set(disasmtool_src_files - disasmtool.cpp - dumpers.cpp - ) - -find_package(RapidJSON) - +add_executable(disasmtool disasmtool.cpp dumpers.cpp) + +target_compile_options(disasmtool PRIVATE + "$<$:-U_FORTIFY_SOURCE>" + "$<$:-D_FORTIFY_SOURCE=2>" + -Wall + -Wextra + -Wshadow + -Wformat-security + -Wstrict-overflow=2 + -Wno-unused-function + -Wno-multichar + -Werror=format-security + -pipe + -fpie + -fwrapv + -fno-strict-aliasing + -fstack-protector-strong + -ffunction-sections + -fdata-sections + -g3 + -gdwarf-4 + -grecord-gcc-switches + -march=nehalem + -fno-omit-frame-pointer +) + +# find_package(bddisasm REQUIRED) +find_package(RapidJSON QUIET) + +target_link_libraries(disasmtool PRIVATE bddisasm::bddisasm bddisasm::bdshemu) if (RapidJSON_FOUND) - message(STATUS "Dependency: rapidjson found") - include_directories(${RapidJSON_INCLUDE_DIRS}) - add_compile_definitions(HAS_RAPIDJSON) - list(APPEND disasmtool_src_files rapidjson.cpp) -else() - message(FATAL_ERROR "Dependency: rapidjson not found") -endif() - - -add_executable(${PROJECT_NAME} ${disasmtool_src_files}) - - -target_compile_options(${PROJECT_NAME} PRIVATE - "$<$:-U_FORTIFY_SOURCE>" - "$<$:-D_FORTIFY_SOURCE=2>" - -Wall - -Wextra - -Wshadow - -Wformat-security - -Wstrict-overflow=2 - -Wno-unused-function - -Wno-multichar - -Werror=format-security - -pipe - -fpie - -fwrapv - -fno-strict-aliasing - -fstack-protector-strong - -ffunction-sections - -fdata-sections - -g3 - -gdwarf-4 - -grecord-gcc-switches - -march=nehalem - -fno-omit-frame-pointer - # -fsanitize=leak - # -fsanitize=address - ) - -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} \ --Wl,--fatal-warnings \ --Wl,--warn-common \ --Wl,--no-undefined \ --Wl,-z,noexecstack \ --Wl,-z,relro \ --Wl,-z,now \ --Wl,--build-id") - -set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} -Wl,-O1") - -if (CMAKE_COMPILER_IS_GNUCXX) - if (NOT (CMAKE_CXX_COMPILER_VERSION LESS 6.0)) - target_compile_options(${PROJECT_NAME} PRIVATE - -Wshift-overflow=2 - -Wnull-dereference - -Wduplicated-cond - -Wlogical-op - -Wvla - ) - endif() - - if (NOT (CMAKE_CXX_COMPILER_VERSION LESS 7.0)) - target_compile_options(${PROJECT_NAME} PRIVATE - -Wdangling-else - -Wshadow=global - -Walloc-zero - ) - endif() - - if (NOT (CMAKE_CXX_COMPILER_VERSION LESS 8.0)) - target_compile_options(${PROJECT_NAME} PRIVATE - -Wmultistatement-macros - -Warray-bounds=2 - -Wformat-overflow=2 - -Wformat-truncation=1 - -Wstringop-truncation - -Wpointer-arith - -Wdouble-promotion - -Wmissing-include-dirs - -Wuninitialized - -Wmissing-noreturn - -Wsuggest-attribute=noreturn - -Walloca - -Wtrampolines - -Wcast-qual - -Wcast-align - -Wparentheses - -Wfloat-conversion - -Wredundant-decls - -Wdisabled-optimization - -Woverlength-strings - -Wswitch-enum - -fstack-clash-protection - -static - ) - endif() - - if (NOT (CMAKE_CXX_COMPILER_VERSION LESS 9.0)) - target_compile_options(${PROJECT_NAME} PRIVATE - -Wcatch-value=2 - -Wduplicated-branches - -Wextra-semi - -Wif-not-aligned - -Wplacement-new=2 - -Wsuggest-override - -Wunused-but-set-parameter - -Wswitch-enum - -Wuseless-cast - ) - endif() -elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - target_compile_options(${PROJECT_NAME} PRIVATE - -Wno-missing-braces - ) - - if (NOT (CMAKE_CXX_COMPILER_VERSION LESS 6.0)) - target_compile_options(${PROJECT_NAME} PRIVATE - -Wshift-overflow - -Wnull-dereference - -Wvla - -Wdangling-else - -Wpragmas - -Wtautological-compare - -Wzero-as-null-pointer-constant - ) - endif() - - if (NOT (CMAKE_CXX_COMPILER_VERSION LESS 10.0)) - target_compile_options(${PROJECT_NAME} PRIVATE - -Warray-bounds-pointer-arithmetic - -Wassign-enum - -Watomic-implicit-seq-cst - -Watomic-properties - -Wauto-import - -Wbad-function-cast - -Wbind-to-temporary-copy - -Wbitfield-enum-conversion - -Wbitwise-op-parentheses - -Wcomma - -Wconditional-uninitialized - -Wconsumed - -Wcstring-format-directive - -Wctad-maybe-unsupported - -Wcustom-atomic-properties - -Wdelete-non-abstract-non-virtual-dtor - -Wdeprecated-copy - -Wdeprecated-copy-dtor - -Wdeprecated-dynamic-exception-spec - -Wdeprecated-implementations - -Wdouble-promotion - -Wduplicate-enum - -Wduplicate-method-arg - -Wduplicate-method-match - -Wembedded-directive - -Wempty-init-stmt - -Wexit-time-destructors - -Wexplicit-ownership-type - -Wextra-semi - -Wfloat-conversion - -Wfor-loop-analysis - -Wformat-non-iso - -Wformat-type-confusion - -Wheader-hygiene - -Widiomatic-parentheses - -Winfinite-recursion - -Wlogical-op-parentheses - -Wmethod-signatures - -Wmissing-noreturn - -Wmissing-variable-declarations - -Wmove - -Wnon-gcc - -Wnon-virtual-dtor - -Wnull-pointer-arithmetic - -Wnullable-to-nonnull-conversion - -Wover-aligned - -Woverlength-strings - -Woverloaded-virtual - -Woverriding-method-mismatch - -Wpragma-pack - -Wpragma-pack-suspicious-include - -Wquoted-include-in-framework-header - -Wrange-loop-analysis - -Wredundant-move - -Wredundant-parens - -Wreserved-id-macro - -Wreturn-std-move - -Wself-assign - -Wself-move - -Wsemicolon-before-method-body - -Wshadow-all - -Wshift-sign-overflow - -Wsometimes-uninitialized - -Wstatic-in-inline - -Wstrict-prototypes - -Wstrict-selector-match - -Wstring-conversion - -Wsuper-class-method-mismatch - -Wswitch-enum - -Wtautological-bitwise-compare - -Wtautological-constant-in-range-compare - -Wtautological-overlap-compare - -Wtautological-type-limit-compare - -Wtautological-unsigned-enum-zero-compare - -Wtautological-unsigned-zero-compare - -Wunneeded-internal-declaration - -Wunneeded-member-function - -Wunreachable-code-aggressive - -Wunused-label - -Wunused-lambda-capture - -Wunused-local-typedef - -Wunused-variable - -Wvla-extension - -Wzero-length-array - - -Wno-sign-conversion - -Wno-shorten-64-to-32 - ) - endif() -else() - message(FATAL_ERROR "Unsupported compiler!") -endif() - -target_include_directories(${PROJECT_NAME} PRIVATE - ${DISASM_DIRECTORY}/inc - ${DISASM_DIRECTORY}/bddisasm/include - ) + # :( https://github.com/satishbabariya/modern-cmake#good-boys-export-their-targets + target_include_directories(disasmtool PRIVATE ${RapidJSON_INCLUDE_DIRS}) + target_sources(disasmtool PRIVATE rapidjson.cpp) + target_compile_definitions(disasmtool PRIVATE HAS_RAPIDJSON) +endif () if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release") - include(CheckIPOSupported) - check_ipo_supported(RESULT USE_IPO) - set_target_properties(${PROJECT_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION True) + include(CheckIPOSupported) + check_ipo_supported(RESULT USE_IPO) + if (USE_IPO) + set_target_properties(bddisasm PROPERTIES INTERPROCEDURAL_OPTIMIZATION True) + endif () endif() -set_target_properties(${PROJECT_NAME} - PROPERTIES - POSITION_INDEPENDENT_CODE ON - CXX_STANDARD 17 - CXX_STANDARD_REQUIRED ON - CXX_EXTENSIONS ON - ) - -target_link_directories(${PROJECT_NAME} PRIVATE "${DISASM_DIRECTORY}/bin/x64/${CMAKE_BUILD_TYPE}") -target_link_libraries(${PROJECT_NAME} PRIVATE bddisasm bdshemu) - -INSTALL(TARGETS disasmtool - RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}" - ) - -unset(DISASM_LIB CACHE) -unset(SHEMU_LIB CACHE) +set_target_properties(disasmtool + PROPERTIES + POSITION_INDEPENDENT_CODE ON + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS ON +) diff --git a/project-meta-info.in b/project-meta-info.in deleted file mode 100644 index a56c711..0000000 --- a/project-meta-info.in +++ /dev/null @@ -1,3 +0,0 @@ -# project-meta-info.in - -set(project_description "Bitdefender x86 instruction decoder and emulator")