Merge pull request #1544 from mrexodia/cmake-subdirectory

Refactor CMake
This commit is contained in:
lazymio
2022-01-19 14:07:37 +01:00
committed by GitHub
2 changed files with 167 additions and 156 deletions

View File

@ -4,30 +4,36 @@
cmake_minimum_required(VERSION 3.1)
# Workaround to fix wrong compiler on macos.
if ((APPLE) AND (NOT CMAKE_C_COMPILER))
if(APPLE AND NOT CMAKE_C_COMPILER)
set(CMAKE_C_COMPILER "/usr/bin/cc")
endif()
# Detect if unicorn is compiled as the top-level project
set(PROJECT_IS_TOP_LEVEL OFF)
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
set(PROJECT_IS_TOP_LEVEL ON)
# Enable folder support
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
endif()
project(unicorn C)
set(UNICORN_VERSION_MAJOR 2)
set(UNICORN_VERSION_MINOR 0)
set(UNICORN_VERSION_PATCH 0)
option(UNICORN_BUILD_SHARED "Build shared instead of static library" ON)
if (NOT UNICORN_ARCH)
# build all architectures
set(UNICORN_ARCH "x86 arm aarch64 riscv mips sparc m68k ppc")
endif()
option(BUILD_SHARED_LIBS "Build shared instead of static library" ${PROJECT_IS_TOP_LEVEL})
option(UNICORN_FUZZ "Enable fuzzing" OFF)
option(UNICORN_BUILD_TESTS "Build unicorn tests" ${PROJECT_IS_TOP_LEVEL})
option(UNICORN_INSTALL "Enable unicorn installation" ${PROJECT_IS_TOP_LEVEL})
set(UNICORN_ARCH "x86;arm;aarch64;riscv;mips;sparc;m68k;ppc" CACHE STRING "Enabled unicorn architectures")
option(UNICORN_TRACER "Trace unicorn execution" OFF)
string(TOUPPER ${UNICORN_ARCH} UNICORN_ARCH)
string(REPLACE " " ";" UNICORN_ARCH_LIST ${UNICORN_ARCH})
foreach(ARCH_LOOP ${UNICORN_ARCH_LIST})
foreach(ARCH_LOOP ${UNICORN_ARCH})
string(TOUPPER "${ARCH_LOOP}" ARCH_LOOP)
set(UNICORN_HAS_${ARCH_LOOP} TRUE)
endforeach(ARCH_LOOP)
endforeach()
if(MSVC)
include_directories(
@ -63,12 +69,18 @@ if(MSVC)
${MSVC_FLAG}
/I${CMAKE_CURRENT_SOURCE_DIR}/qemu/tcg/i386
)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4018 /wd4098 /wd4244 /wd4267")
# Disable some warnings
add_compile_options(
/wd4018
/wd4098
/wd4244
/wd4267
)
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
string(REPLACE "/ZI" "/Zi" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
endif()
# default use the multithread, static version of the run-time library.
option(UNICORN_STATIC_MSVCRT "Embed static runtime library" ON)
option(UNICORN_STATIC_MSVCRT "Embed static runtime library" ${PROJECT_IS_TOP_LEVEL})
if(UNICORN_STATIC_MSVCRT)
string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
@ -376,7 +388,7 @@ set(UNICORN_ARCH_COMMON
)
if(UNICORN_HAS_X86)
add_library(x86_64-softmmu
add_library(x86_64-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/hw/i386/x86.c
@ -417,7 +429,7 @@ else()
)
# Log and pow
target_link_libraries(x86_64-softmmu m)
target_link_libraries(x86_64-softmmu PRIVATE m)
endif()
if(UNICORN_TRACER)
@ -427,7 +439,7 @@ endif()
endif()
if(UNICORN_HAS_ARM)
add_library(arm-softmmu
add_library(arm-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/target/arm/cpu.c
@ -466,7 +478,7 @@ if(UNICORN_TRACER)
target_compile_options(arm-softmmu PRIVATE -DUNICORN_TRACER)
endif()
add_library(armeb-softmmu
add_library(armeb-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/target/arm/cpu.c
@ -508,7 +520,7 @@ endif()
endif()
if(UNICORN_HAS_AARCH64)
add_library(aarch64-softmmu
add_library(aarch64-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/target/arm/cpu64.c
@ -553,7 +565,7 @@ if(UNICORN_TRACER)
target_compile_options(aarch64-softmmu PRIVATE -DUNICORN_TRACER)
endif()
add_library(aarch64eb-softmmu
add_library(aarch64eb-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/target/arm/cpu64.c
@ -601,7 +613,7 @@ endif()
endif()
if(UNICORN_HAS_M68K)
add_library(m68k-softmmu
add_library(m68k-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/target/m68k/cpu.c
@ -636,7 +648,7 @@ endif()
endif()
if(UNICORN_HAS_MIPS)
add_library(mips-softmmu
add_library(mips-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/target/mips/cp0_helper.c
@ -672,7 +684,7 @@ if(UNICORN_TRACER)
target_compile_options(mips-softmmu PRIVATE -DUNICORN_TRACER)
endif()
add_library(mipsel-softmmu
add_library(mipsel-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/target/mips/cp0_helper.c
@ -708,7 +720,7 @@ if(UNICORN_TRACER)
target_compile_options(mipsel-softmmu PRIVATE -DUNICORN_TRACER)
endif()
add_library(mips64-softmmu
add_library(mips64-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/target/mips/cp0_helper.c
@ -744,7 +756,7 @@ if(UNICORN_TRACER)
target_compile_options(mips64-softmmu PRIVATE -DUNICORN_TRACER)
endif()
add_library(mips64el-softmmu
add_library(mips64el-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/target/mips/cp0_helper.c
@ -783,7 +795,7 @@ endif()
endif()
if(UNICORN_HAS_SPARC)
add_library(sparc-softmmu
add_library(sparc-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/target/sparc/cc_helper.c
@ -818,7 +830,7 @@ if(UNICORN_TRACER)
target_compile_options(sparc-softmmu PRIVATE -DUNICORN_TRACER)
endif()
add_library(sparc64-softmmu
add_library(sparc64-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/target/sparc/cc_helper.c
@ -857,7 +869,7 @@ endif()
endif()
if(UNICORN_HAS_PPC)
add_library(ppc-softmmu
add_library(ppc-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/hw/ppc/ppc.c
@ -905,7 +917,7 @@ if(UNICORN_TRACER)
target_compile_options(ppc-softmmu PRIVATE -DUNICORN_TRACER)
endif()
add_library(ppc64-softmmu
add_library(ppc64-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/hw/ppc/ppc.c
@ -960,7 +972,7 @@ endif()
endif()
if(UNICORN_HAS_RISCV)
add_library(riscv32-softmmu
add_library(riscv32-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/target/riscv/cpu.c
@ -993,7 +1005,7 @@ if(UNICORN_TRACER)
target_compile_options(riscv32-softmmu PRIVATE -DUNICORN_TRACER)
endif()
add_library(riscv64-softmmu
add_library(riscv64-softmmu STATIC
${UNICORN_ARCH_COMMON}
qemu/target/riscv/cpu.c
@ -1097,91 +1109,87 @@ else()
)
endif()
add_library(unicorn-common
add_library(unicorn-common STATIC
${UNICORN_COMMON_SRCS}
)
if(NOT MSVC AND NOT ANDROID_ABI)
target_link_libraries(unicorn-common pthread)
target_link_libraries(unicorn-common PRIVATE pthread)
endif()
if (UNICORN_BUILD_SHARED)
add_library(unicorn SHARED
add_library(unicorn
${UNICORN_SRCS}
)
if(BUILD_SHARED_LIBS)
if(ANDROID_ABI)
file(APPEND ${CMAKE_BINARY_DIR}/adb.sh "adb push ./libunicorn.so /data/local/tmp/build/\n")
endif()
else()
add_library(unicorn STATIC
${UNICORN_SRCS}
)
endif()
enable_testing()
set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} unicorn-common)
if(UNICORN_HAS_X86)
set(UNICORN_COMPILE_OPTIONS ${UNICORN_COMPILE_OPTIONS} -DUNICORN_HAS_X86)
set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} x86_64-softmmu)
set(UNICORN_SAMPLE_FILE ${UNICORN_SAMPLE_FILE} sample_x86 sample_x86_32_gdt_and_seg_regs sample_batch_reg mem_apis shellcode)
target_link_libraries(x86_64-softmmu unicorn-common)
target_link_libraries(x86_64-softmmu PRIVATE unicorn-common)
set(UNICORN_TEST_FILE ${UNICORN_TEST_FILE} test_x86)
endif()
if(UNICORN_HAS_ARM)
set(UNICORN_COMPILE_OPTIONS ${UNICORN_COMPILE_OPTIONS} -DUNICORN_HAS_ARM)
set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} arm-softmmu armeb-softmmu)
set(UNICORN_SAMPLE_FILE ${UNICORN_SAMPLE_FILE} sample_arm)
target_link_libraries(arm-softmmu unicorn-common)
target_link_libraries(armeb-softmmu unicorn-common)
target_link_libraries(arm-softmmu PRIVATE unicorn-common)
target_link_libraries(armeb-softmmu PRIVATE unicorn-common)
set(UNICORN_TEST_FILE ${UNICORN_TEST_FILE} test_arm)
endif()
if(UNICORN_HAS_AARCH64)
set(UNICORN_COMPILE_OPTIONS ${UNICORN_COMPILE_OPTIONS} -DUNICORN_HAS_ARM64)
set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} aarch64-softmmu aarch64eb-softmmu)
set(UNICORN_SAMPLE_FILE ${UNICORN_SAMPLE_FILE} sample_arm64)
target_link_libraries(aarch64-softmmu unicorn-common)
target_link_libraries(aarch64eb-softmmu unicorn-common)
target_link_libraries(aarch64-softmmu PRIVATE unicorn-common)
target_link_libraries(aarch64eb-softmmu PRIVATE unicorn-common)
set(UNICORN_TEST_FILE ${UNICORN_TEST_FILE} test_arm64)
endif()
if(UNICORN_HAS_M68K)
set(UNICORN_COMPILE_OPTIONS ${UNICORN_COMPILE_OPTIONS} -DUNICORN_HAS_M68K)
set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} m68k-softmmu)
set(UNICORN_SAMPLE_FILE ${UNICORN_SAMPLE_FILE} sample_m68k)
target_link_libraries(m68k-softmmu unicorn-common)
target_link_libraries(m68k-softmmu PRIVATE unicorn-common)
set(UNICORN_TEST_FILE ${UNICORN_TEST_FILE} test_m68k)
endif()
if(UNICORN_HAS_MIPS)
set(UNICORN_COMPILE_OPTIONS ${UNICORN_COMPILE_OPTIONS} -DUNICORN_HAS_MIPS -DUNICORN_HAS_MIPSEL -DUNICORN_HAS_MIPS64 -DUNICORN_HAS_MIPS64EL)
set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} mips-softmmu mipsel-softmmu mips64-softmmu mips64el-softmmu)
set(UNICORN_SAMPLE_FILE ${UNICORN_SAMPLE_FILE} sample_mips)
target_link_libraries(mips-softmmu unicorn-common)
target_link_libraries(mipsel-softmmu unicorn-common)
target_link_libraries(mips64-softmmu unicorn-common)
target_link_libraries(mips64el-softmmu unicorn-common)
target_link_libraries(mips-softmmu PRIVATE unicorn-common)
target_link_libraries(mipsel-softmmu PRIVATE unicorn-common)
target_link_libraries(mips64-softmmu PRIVATE unicorn-common)
target_link_libraries(mips64el-softmmu PRIVATE unicorn-common)
set(UNICORN_TEST_FILE ${UNICORN_TEST_FILE} test_mips)
endif()
if(UNICORN_HAS_SPARC)
set(UNICORN_COMPILE_OPTIONS ${UNICORN_COMPILE_OPTIONS} -DUNICORN_HAS_SPARC)
set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} sparc-softmmu sparc64-softmmu)
set(UNICORN_SAMPLE_FILE ${UNICORN_SAMPLE_FILE} sample_sparc)
target_link_libraries(sparc-softmmu unicorn-common)
target_link_libraries(sparc64-softmmu unicorn-common)
target_link_libraries(sparc-softmmu PRIVATE unicorn-common)
target_link_libraries(sparc64-softmmu PRIVATE unicorn-common)
set(UNICORN_TEST_FILE ${UNICORN_TEST_FILE} test_sparc)
endif()
if(UNICORN_HAS_PPC)
set(UNICORN_COMPILE_OPTIONS ${UNICORN_COMPILE_OPTIONS} -DUNICORN_HAS_PPC)
set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} ppc-softmmu ppc64-softmmu)
set(UNICORN_SAMPLE_FILE ${UNICORN_SAMPLE_FILE} sample_ppc)
target_link_libraries(ppc-softmmu unicorn-common)
target_link_libraries(ppc64-softmmu unicorn-common)
target_link_libraries(ppc-softmmu PRIVATE unicorn-common)
target_link_libraries(ppc64-softmmu PRIVATE unicorn-common)
set(UNICORN_TEST_FILE ${UNICORN_TEST_FILE} test_ppc)
endif()
if(UNICORN_HAS_RISCV)
set(UNICORN_COMPILE_OPTIONS ${UNICORN_COMPILE_OPTIONS} -DUNICORN_HAS_RISCV)
set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} riscv32-softmmu riscv64-softmmu)
set(UNICORN_SAMPLE_FILE ${UNICORN_SAMPLE_FILE} sample_riscv)
target_link_libraries(riscv32-softmmu unicorn-common)
target_link_libraries(riscv64-softmmu unicorn-common)
target_link_libraries(riscv32-softmmu PRIVATE unicorn-common)
target_link_libraries(riscv64-softmmu PRIVATE unicorn-common)
set(UNICORN_TEST_FILE ${UNICORN_TEST_FILE} test_riscv)
endif()
@ -1212,7 +1220,7 @@ if(UNICORN_TARGET_ARCH STREQUAL "riscv")
endif()
if(MSVC)
if (UNICORN_BUILD_SHARED)
if(BUILD_SHARED_LIBS)
target_compile_options(unicorn PRIVATE
-DUNICORN_SHARED
)
@ -1262,25 +1270,28 @@ if(UNICORN_FUZZ)
${CMAKE_CURRENT_SOURCE_DIR}/tests/fuzz/fuzz_emu_${SUFFIX}.c
${CMAKE_CURRENT_SOURCE_DIR}/tests/fuzz/onedir.c
)
target_link_libraries(fuzz_emu_${SUFFIX}
target_link_libraries(fuzz_emu_${SUFFIX} PRIVATE
${SAMPLES_LIB}
)
endforeach()
else()
endif()
if(UNICORN_BUILD_TESTS)
enable_testing()
foreach(SAMPLE_FILE ${UNICORN_SAMPLE_FILE})
add_executable(${SAMPLE_FILE}
${CMAKE_CURRENT_SOURCE_DIR}/samples/${SAMPLE_FILE}.c
)
target_link_libraries(${SAMPLE_FILE}
target_link_libraries(${SAMPLE_FILE} PRIVATE
${SAMPLES_LIB}
)
endforeach(SAMPLE_FILE)
endforeach()
foreach(TEST_FILE ${UNICORN_TEST_FILE})
add_executable(${TEST_FILE}
${CMAKE_CURRENT_SOURCE_DIR}/tests/unit/${TEST_FILE}.c
)
target_link_libraries(${TEST_FILE}
target_link_libraries(${TEST_FILE} PRIVATE
${SAMPLES_LIB}
)
add_test(${TEST_FILE} ${TEST_FILE})
@ -1289,18 +1300,18 @@ else()
file(APPEND ${CMAKE_BINARY_DIR}/adb.sh "adb shell \"chmod +x /data/local/tmp/build/${TEST_FILE}\"\n")
file(APPEND ${CMAKE_BINARY_DIR}/adb.sh "adb shell \'LD_LIBRARY_PATH=/data/local/tmp/build:$LD_LIBRARY_PATH /data/local/tmp/build/${TEST_FILE}\' || exit -1\n")
endif()
endforeach(TEST_FILE)
endforeach()
endif()
target_include_directories(unicorn PUBLIC
include
)
if(NOT MSVC)
if(UNICORN_INSTALL AND NOT MSVC)
include("GNUInstallDirs")
file(GLOB UNICORN_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/unicorn/*.h)
install(TARGETS unicorn
RUNTIME DESTINATION bin
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

View File

@ -87,7 +87,7 @@ fn main() {
cmd.current_dir(&unicorn_dir)
.arg("-B")
.arg("rust_build")
.arg("-DUNICORN_BUILD_SHARED=off")
.arg("-DBUILD_SHARED_LIBS=OFF")
.arg("-G")
.arg("Visual Studio 16 2019");
@ -127,7 +127,7 @@ fn main() {
cmd.current_dir(&unicorn_dir)
.arg("-B")
.arg("rust_build")
.arg("-DUNICORN_BUILD_SHARED=off");
.arg("-DBUILD_SHARED_LIBS=OFF");
if profile == "debug" {
cmd.arg("-DCMAKE_BUILD_TYPE=Debug");