add CMakeList.txt. build windows binary by using vs2019. (#1134)

* add CMakeList.txt. build windows binary by using vs2019.

* remove macro redefinition warning.

* add nmake.bat.

* update CMakeLists.txt. build successfully on Ubuntu-1804-amd64.

* add CMakeList.txt. build windows binary by using vs2019.

* remove macro redefinition warning.

* add nmake.bat.

* update CMakeLists.txt. build successfully on Ubuntu-1804-amd64.

* Add build specific arch option.

* fix old MSVC inline and mipsel macro.

* add install target and option of embeded MSVCRT lib.

* add cmake.sh and document.

* add xwings and chenhuitao as programmer.

* fix COMPILE-CMAKE. rename txt to md.
This commit is contained in:
Chen Huitao 2019-09-08 16:42:43 +08:00 committed by Nguyen Anh Quynh
parent 8987ad0fff
commit 60896de9f4
8 changed files with 1045 additions and 1 deletions

890
CMakeLists.txt Normal file
View File

@ -0,0 +1,890 @@
# Tested on window10(x64) with vs2019.
# Open the "x86 Native Tools Command Prompt for VS 2019",
# cd ${UNICORN_SOURCE_DIR}
# mkdir build
# cd build
# cmake -G "NMake Makefiles" ..
# nmake
# Or Open "x64 Native Tools Command Prompt for VS 2019" for 64bit binary.
# Tested on Ubuntu-1804-amd64 with gcc.
# cd ${UNICORN_SOURCE_DIR}
# mkdir build
# cd build
# cmake ..
# make
# By Huitao Chen, 2019
cmake_minimum_required(VERSION 3.1)
project(unicorn C)
set(UNICORN_VERSION_MAJOR 1)
set(UNICORN_VERSION_MINOR 0)
set(UNICORN_VERSION_PATCH 2)
if(NOT UNICORN_ARCH)
set(UNICORN_ARCH "x86 arm aarch64 m68k mips sparc")
endif()
string(TOUPPER ${UNICORN_ARCH} UNICORN_ARCH)
string(REPLACE " " ";" UNICORN_ARCH_LIST ${UNICORN_ARCH})
foreach(ARCH_LOOP ${UNICORN_ARCH_LIST})
set(UNICORN_HAS_${ARCH_LOOP} TRUE)
endforeach(ARCH_LOOP)
# qemu uses assert(). It is not recommended to define NDEBUG if using assert()
# to detect error conditions since the software may behave
# non-deterministically. Remove the NDEBUG macro.
if(CMAKE_BUILD_TYPE STREQUAL "Release")
string(REPLACE "-DNDEBUG" "" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
endif()
if(MSVC)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn
)
else()
include_directories(
${CMAKE_BINARY_DIR}
)
endif()
include_directories(
qemu
qemu/include
qemu/tcg
include
)
if(MSVC)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(MSVC_FLAG -D__x86_64__)
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
set(MSVC_FLAG -D__i386__)
else()
message(FATAL_ERROR "Neither WIN64 or WIN32!")
endif()
add_compile_options(
-Dinline=__inline
-D__func__=__FUNCTION__
-D_CRT_SECURE_NO_WARNINGS
-DWIN32_LEAN_AND_MEAN
${MSVC_FLAG}
/I${CMAKE_CURRENT_SOURCE_DIR}/qemu/tcg/i386
/wd4018 /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)
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})
endif()
else()
# check python
find_program(PYTHON_CMD python)
if (NOT PYTHON_CMD)
message(FATAL_ERROR "Please install python.")
endif()
set(EXTRA_CFLAGS "--extra-cflags=")
if (UNICORN_HAS_X86)
set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_X86 ")
endif()
if (UNICORN_HAS_ARM)
set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_ARM -DUNICORN_HAS_ARMEB ")
endif()
if (UNICORN_HAS_AARCH64)
set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_ARM64 -DUNICORN_HAS_ARM64EB ")
endif()
if (UNICORN_HAS_M68K)
set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_M68K ")
endif()
if (UNICORN_HAS_MIPS)
set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_MIPS -DUNICORN_HAS_MIPSEL -DUNICORN_HAS_MIPS64 -DUNICORN_HAS_MIPS64EL ")
endif()
if (UNICORN_HAS_SPARC)
set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_SPARC ")
endif()
set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-fPIC -fvisibility=hidden")
set(TARGET_LIST "--target-list=")
if (UNICORN_HAS_X86)
set (TARGET_LIST "${TARGET_LIST}x86_64-softmmu, ")
endif()
if (UNICORN_HAS_ARM)
set (TARGET_LIST "${TARGET_LIST}arm-softmmu, armeb-softmmu, ")
endif()
if (UNICORN_HAS_AARCH64)
set (TARGET_LIST "${TARGET_LIST}aarch64-softmmu, aarch64eb-softmmu, ")
endif()
if (UNICORN_HAS_M68K)
set (TARGET_LIST "${TARGET_LIST}m68k-softmmu, ")
endif()
if (UNICORN_HAS_MIPS)
set (TARGET_LIST "${TARGET_LIST}mips-softmmu, mipsel-softmmu, mips64-softmmu, mips64el-softmmu, ")
endif()
if (UNICORN_HAS_SPARC)
set (TARGET_LIST "${TARGET_LIST}sparc-softmmu, sparc64-softmmu, ")
endif()
set (TARGET_LIST "${TARGET_LIST} ")
# GEN dynamic source files
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/configure
${EXTRA_CFLAGS}
${TARGET_LIST}
)
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config
INPUT_FILE ${CMAKE_BINARY_DIR}/config-host.mak
OUTPUT_FILE ${CMAKE_BINARY_DIR}/config-host.h
)
if (UNICORN_HAS_X86)
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config
INPUT_FILE ${CMAKE_BINARY_DIR}/x86_64-softmmu/config-target.mak
OUTPUT_FILE ${CMAKE_BINARY_DIR}/x86_64-softmmu/config-target.h
)
endif()
if (UNICORN_HAS_ARM)
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config
INPUT_FILE ${CMAKE_BINARY_DIR}/arm-softmmu/config-target.mak
OUTPUT_FILE ${CMAKE_BINARY_DIR}/arm-softmmu/config-target.h
)
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config
INPUT_FILE ${CMAKE_BINARY_DIR}/armeb-softmmu/config-target.mak
OUTPUT_FILE ${CMAKE_BINARY_DIR}/armeb-softmmu/config-target.h
)
endif()
if (UNICORN_HAS_AARCH64)
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config
INPUT_FILE ${CMAKE_BINARY_DIR}/aarch64-softmmu/config-target.mak
OUTPUT_FILE ${CMAKE_BINARY_DIR}/aarch64-softmmu/config-target.h
)
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config
INPUT_FILE ${CMAKE_BINARY_DIR}/aarch64eb-softmmu/config-target.mak
OUTPUT_FILE ${CMAKE_BINARY_DIR}/aarch64eb-softmmu/config-target.h
)
endif()
if (UNICORN_HAS_M68K)
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config
INPUT_FILE ${CMAKE_BINARY_DIR}/m68k-softmmu/config-target.mak
OUTPUT_FILE ${CMAKE_BINARY_DIR}/m68k-softmmu/config-target.h
)
endif()
if (UNICORN_HAS_MIPS)
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config
INPUT_FILE ${CMAKE_BINARY_DIR}/mips-softmmu/config-target.mak
OUTPUT_FILE ${CMAKE_BINARY_DIR}/mips-softmmu/config-target.h
)
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config
INPUT_FILE ${CMAKE_BINARY_DIR}/mipsel-softmmu/config-target.mak
OUTPUT_FILE ${CMAKE_BINARY_DIR}/mipsel-softmmu/config-target.h
)
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config
INPUT_FILE ${CMAKE_BINARY_DIR}/mips64-softmmu/config-target.mak
OUTPUT_FILE ${CMAKE_BINARY_DIR}/mips64-softmmu/config-target.h
)
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config
INPUT_FILE ${CMAKE_BINARY_DIR}/mips64el-softmmu/config-target.mak
OUTPUT_FILE ${CMAKE_BINARY_DIR}/mips64el-softmmu/config-target.h
)
endif()
if (UNICORN_HAS_SPARC)
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config
INPUT_FILE ${CMAKE_BINARY_DIR}/sparc-softmmu/config-target.mak
OUTPUT_FILE ${CMAKE_BINARY_DIR}/sparc-softmmu/config-target.h
)
execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config
INPUT_FILE ${CMAKE_BINARY_DIR}/sparc64-softmmu/config-target.mak
OUTPUT_FILE ${CMAKE_BINARY_DIR}/sparc64-softmmu/config-target.h
)
endif()
execute_process(COMMAND python -B ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/qapi-types.py
-h -o ${CMAKE_BINARY_DIR} -b -i ${CMAKE_CURRENT_SOURCE_DIR}/qemu/qapi-schema.json
)
execute_process(COMMAND python -B ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/qapi-types.py
-c -o ${CMAKE_BINARY_DIR} -b -i ${CMAKE_CURRENT_SOURCE_DIR}/qemu/qapi-schema.json
)
execute_process(COMMAND python -B ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/qapi-visit.py
-h -o ${CMAKE_BINARY_DIR} -b -i ${CMAKE_CURRENT_SOURCE_DIR}/qemu/qapi-schema.json
)
execute_process(COMMAND python -B ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/qapi-visit.py
-c -o ${CMAKE_BINARY_DIR} -b -i ${CMAKE_CURRENT_SOURCE_DIR}/qemu/qapi-schema.json
)
add_compile_options(
-I${CMAKE_CURRENT_SOURCE_DIR}/qemu/tcg/i386
-D_GNU_SOURCE
-D_FILE_OFFSET_BITS=64
-D_LARGEFILE_SOURCE
-Wall -O2
-fPIC -fpic -fvisibility=hidden
)
endif()
if (UNICORN_HAS_X86)
add_library(x86_64-softmmu
qemu/cpu-exec.c
qemu/cpus.c
qemu/cputlb.c
qemu/exec.c
qemu/fpu/softfloat.c
qemu/hw/i386/pc.c
qemu/hw/i386/pc_piix.c
qemu/hw/intc/apic.c
qemu/hw/intc/apic_common.c
qemu/ioport.c
qemu/memory.c
qemu/memory_mapping.c
qemu/target-i386/arch_memory_mapping.c
qemu/target-i386/cc_helper.c
qemu/target-i386/cpu.c
qemu/target-i386/excp_helper.c
qemu/target-i386/fpu_helper.c
qemu/target-i386/helper.c
qemu/target-i386/int_helper.c
qemu/target-i386/mem_helper.c
qemu/target-i386/misc_helper.c
qemu/target-i386/seg_helper.c
qemu/target-i386/smm_helper.c
qemu/target-i386/svm_helper.c
qemu/target-i386/translate.c
qemu/target-i386/unicorn.c
qemu/tcg/optimize.c
qemu/tcg/tcg.c
qemu/translate-all.c
)
if(MSVC)
target_compile_options(x86_64-softmmu PRIVATE
-DNEED_CPU_H
/FI x86_64.h
/I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/x86_64-softmmu
/I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-i386
)
else()
target_compile_options(x86_64-softmmu PRIVATE
-DNEED_CPU_H
-include x86_64.h
-I${CMAKE_BINARY_DIR}/x86_64-softmmu
-I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-i386
)
endif()
endif()
if (UNICORN_HAS_ARM)
add_library(arm-softmmu
qemu/cpu-exec.c
qemu/cpus.c
qemu/cputlb.c
qemu/exec.c
qemu/fpu/softfloat.c
qemu/hw/arm/tosa.c
qemu/hw/arm/virt.c
qemu/ioport.c
qemu/memory.c
qemu/memory_mapping.c
qemu/target-arm/cpu.c
qemu/target-arm/crypto_helper.c
qemu/target-arm/helper.c
qemu/target-arm/iwmmxt_helper.c
qemu/target-arm/neon_helper.c
qemu/target-arm/op_helper.c
qemu/target-arm/psci.c
qemu/target-arm/translate.c
qemu/target-arm/unicorn_arm.c
qemu/tcg/optimize.c
qemu/tcg/tcg.c
qemu/translate-all.c
)
if(MSVC)
target_compile_options(arm-softmmu PRIVATE
-DNEED_CPU_H
/FI arm.h
/I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/arm-softmmu
/I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm
)
else()
target_compile_options(arm-softmmu PRIVATE
-DNEED_CPU_H
-include arm.h
-I${CMAKE_BINARY_DIR}/arm-softmmu
-I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm
)
endif()
add_library(armeb-softmmu
qemu/cpu-exec.c
qemu/cpus.c
qemu/cputlb.c
qemu/exec.c
qemu/fpu/softfloat.c
qemu/hw/arm/tosa.c
qemu/hw/arm/virt.c
qemu/ioport.c
qemu/memory.c
qemu/memory_mapping.c
qemu/target-arm/cpu.c
qemu/target-arm/crypto_helper.c
qemu/target-arm/helper.c
qemu/target-arm/iwmmxt_helper.c
qemu/target-arm/neon_helper.c
qemu/target-arm/op_helper.c
qemu/target-arm/psci.c
qemu/target-arm/translate.c
qemu/target-arm/unicorn_arm.c
qemu/tcg/optimize.c
qemu/tcg/tcg.c
qemu/translate-all.c
)
if(MSVC)
target_compile_options(armeb-softmmu PRIVATE
-DNEED_CPU_H
/FI armeb.h
/I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/armeb-softmmu
/I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm
)
else()
target_compile_options(armeb-softmmu PRIVATE
-DNEED_CPU_H
-include armeb.h
-I${CMAKE_BINARY_DIR}/armeb-softmmu
-I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm
)
endif()
endif()
if (UNICORN_HAS_AARCH64)
add_library(aarch64-softmmu
qemu/cpu-exec.c
qemu/cpus.c
qemu/cputlb.c
qemu/exec.c
qemu/fpu/softfloat.c
qemu/hw/arm/tosa.c
qemu/hw/arm/virt.c
qemu/ioport.c
qemu/memory.c
qemu/memory_mapping.c
qemu/target-arm/cpu.c
qemu/target-arm/cpu64.c
qemu/target-arm/crypto_helper.c
qemu/target-arm/helper-a64.c
qemu/target-arm/helper.c
qemu/target-arm/iwmmxt_helper.c
qemu/target-arm/neon_helper.c
qemu/target-arm/op_helper.c
qemu/target-arm/psci.c
qemu/target-arm/translate-a64.c
qemu/target-arm/translate.c
qemu/target-arm/unicorn_aarch64.c
qemu/tcg/optimize.c
qemu/tcg/tcg.c
qemu/translate-all.c
)
if(MSVC)
target_compile_options(aarch64-softmmu PRIVATE
-DNEED_CPU_H
/FI aarch64.h
/I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/aarch64-softmmu
/I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm
)
else()
target_compile_options(aarch64-softmmu PRIVATE
-DNEED_CPU_H
-include aarch64.h
-I${CMAKE_BINARY_DIR}/aarch64-softmmu
-I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm
)
endif()
add_library(aarch64eb-softmmu
qemu/cpu-exec.c
qemu/cpus.c
qemu/cputlb.c
qemu/exec.c
qemu/fpu/softfloat.c
qemu/hw/arm/tosa.c
qemu/hw/arm/virt.c
qemu/ioport.c
qemu/memory.c
qemu/memory_mapping.c
qemu/target-arm/cpu.c
qemu/target-arm/cpu64.c
qemu/target-arm/crypto_helper.c
qemu/target-arm/helper-a64.c
qemu/target-arm/helper.c
qemu/target-arm/iwmmxt_helper.c
qemu/target-arm/neon_helper.c
qemu/target-arm/op_helper.c
qemu/target-arm/psci.c
qemu/target-arm/translate-a64.c
qemu/target-arm/translate.c
qemu/target-arm/unicorn_aarch64.c
qemu/tcg/optimize.c
qemu/tcg/tcg.c
qemu/translate-all.c
)
if(MSVC)
target_compile_options(aarch64eb-softmmu PRIVATE
-DNEED_CPU_H
/FI aarch64eb.h
/I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/aarch64eb-softmmu
/I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm
)
else()
target_compile_options(aarch64eb-softmmu PRIVATE
-DNEED_CPU_H
-include aarch64eb.h
-I${CMAKE_BINARY_DIR}/aarch64eb-softmmu
-I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm
)
endif()
endif()
if (UNICORN_HAS_M68K)
add_library(m68k-softmmu
qemu/cpu-exec.c
qemu/cpus.c
qemu/cputlb.c
qemu/exec.c
qemu/fpu/softfloat.c
qemu/hw/m68k/dummy_m68k.c
qemu/ioport.c
qemu/memory.c
qemu/memory_mapping.c
qemu/target-m68k/cpu.c
qemu/target-m68k/helper.c
qemu/target-m68k/op_helper.c
qemu/target-m68k/translate.c
qemu/target-m68k/unicorn.c
qemu/tcg/optimize.c
qemu/tcg/tcg.c
qemu/translate-all.c
)
if(MSVC)
target_compile_options(m68k-softmmu PRIVATE
-DNEED_CPU_H
/FI m68k.h
/I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/m68k-softmmu
/I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-m68k
)
else()
target_compile_options(m68k-softmmu PRIVATE
-DNEED_CPU_H
-include m68k.h
-I${CMAKE_BINARY_DIR}/m68k-softmmu
-I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-m68k
)
endif()
endif()
if (UNICORN_HAS_MIPS)
add_library(mips-softmmu
qemu/cpu-exec.c
qemu/cpus.c
qemu/cputlb.c
qemu/exec.c
qemu/fpu/softfloat.c
qemu/hw/mips/addr.c
qemu/hw/mips/cputimer.c
qemu/hw/mips/mips_r4k.c
qemu/ioport.c
qemu/memory.c
qemu/memory_mapping.c
qemu/target-mips/cpu.c
qemu/target-mips/dsp_helper.c
qemu/target-mips/helper.c
qemu/target-mips/lmi_helper.c
qemu/target-mips/msa_helper.c
qemu/target-mips/op_helper.c
qemu/target-mips/translate.c
qemu/target-mips/unicorn.c
qemu/tcg/optimize.c
qemu/tcg/tcg.c
qemu/translate-all.c
)
if(MSVC)
target_compile_options(mips-softmmu PRIVATE
-DNEED_CPU_H
/FI mips.h
/I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/mips-softmmu
/I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips
)
else()
target_compile_options(mips-softmmu PRIVATE
-DNEED_CPU_H
-include mips.h
-I${CMAKE_BINARY_DIR}/mips-softmmu
-I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips
)
endif()
add_library(mipsel-softmmu
qemu/cpu-exec.c
qemu/cpus.c
qemu/cputlb.c
qemu/exec.c
qemu/fpu/softfloat.c
qemu/hw/mips/addr.c
qemu/hw/mips/cputimer.c
qemu/hw/mips/mips_r4k.c
qemu/ioport.c
qemu/memory.c
qemu/memory_mapping.c
qemu/target-mips/cpu.c
qemu/target-mips/dsp_helper.c
qemu/target-mips/helper.c
qemu/target-mips/lmi_helper.c
qemu/target-mips/msa_helper.c
qemu/target-mips/op_helper.c
qemu/target-mips/translate.c
qemu/target-mips/unicorn.c
qemu/tcg/optimize.c
qemu/tcg/tcg.c
qemu/translate-all.c
)
if(MSVC)
target_compile_options(mipsel-softmmu PRIVATE
-DNEED_CPU_H
/FI mipsel.h
/I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/mipsel-softmmu
/I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips
)
else()
target_compile_options(mipsel-softmmu PRIVATE
-DNEED_CPU_H
-include mipsel.h
-I${CMAKE_BINARY_DIR}/mipsel-softmmu
-I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips
)
endif()
add_library(mips64-softmmu
qemu/cpu-exec.c
qemu/cpus.c
qemu/cputlb.c
qemu/exec.c
qemu/fpu/softfloat.c
qemu/hw/mips/addr.c
qemu/hw/mips/cputimer.c
qemu/hw/mips/mips_r4k.c
qemu/ioport.c
qemu/memory.c
qemu/memory_mapping.c
qemu/target-mips/cpu.c
qemu/target-mips/dsp_helper.c
qemu/target-mips/helper.c
qemu/target-mips/lmi_helper.c
qemu/target-mips/msa_helper.c
qemu/target-mips/op_helper.c
qemu/target-mips/translate.c
qemu/target-mips/unicorn.c
qemu/tcg/optimize.c
qemu/tcg/tcg.c
qemu/translate-all.c
)
if(MSVC)
target_compile_options(mips64-softmmu PRIVATE
-DNEED_CPU_H
/FI mips64.h
/I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/mips64-softmmu
/I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips
)
else()
target_compile_options(mips64-softmmu PRIVATE
-DNEED_CPU_H
-include mips64.h
-I${CMAKE_BINARY_DIR}/mips64-softmmu
-I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips
)
endif()
add_library(mips64el-softmmu
qemu/cpu-exec.c
qemu/cpus.c
qemu/cputlb.c
qemu/exec.c
qemu/fpu/softfloat.c
qemu/hw/mips/addr.c
qemu/hw/mips/cputimer.c
qemu/hw/mips/mips_r4k.c
qemu/ioport.c
qemu/memory.c
qemu/memory_mapping.c
qemu/target-mips/cpu.c
qemu/target-mips/dsp_helper.c
qemu/target-mips/helper.c
qemu/target-mips/lmi_helper.c
qemu/target-mips/msa_helper.c
qemu/target-mips/op_helper.c
qemu/target-mips/translate.c
qemu/target-mips/unicorn.c
qemu/tcg/optimize.c
qemu/tcg/tcg.c
qemu/translate-all.c
)
if(MSVC)
target_compile_options(mips64el-softmmu PRIVATE
-DNEED_CPU_H
/FI mips64el.h
/I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/mips64el-softmmu
/I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips
)
else()
target_compile_options(mips64el-softmmu PRIVATE
-DNEED_CPU_H
-include mips64el.h
-I${CMAKE_BINARY_DIR}/mips64el-softmmu
-I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips
)
endif()
endif()
if (UNICORN_HAS_SPARC)
add_library(sparc-softmmu
qemu/cpu-exec.c
qemu/cpus.c
qemu/cputlb.c
qemu/exec.c
qemu/fpu/softfloat.c
qemu/hw/sparc/leon3.c
qemu/ioport.c
qemu/memory.c
qemu/memory_mapping.c
qemu/target-sparc/cc_helper.c
qemu/target-sparc/cpu.c
qemu/target-sparc/fop_helper.c
qemu/target-sparc/helper.c
qemu/target-sparc/int32_helper.c
qemu/target-sparc/ldst_helper.c
qemu/target-sparc/mmu_helper.c
qemu/target-sparc/translate.c
qemu/target-sparc/unicorn.c
qemu/target-sparc/win_helper.c
qemu/tcg/optimize.c
qemu/tcg/tcg.c
qemu/translate-all.c
)
if(MSVC)
target_compile_options(sparc-softmmu PRIVATE
-DNEED_CPU_H
/FI sparc.h
/I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/sparc-softmmu
/I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-sparc
)
else()
target_compile_options(sparc-softmmu PRIVATE
-DNEED_CPU_H
-include sparc.h
-I${CMAKE_BINARY_DIR}/sparc-softmmu
-I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-sparc
)
endif()
add_library(sparc64-softmmu
qemu/cpu-exec.c
qemu/cpus.c
qemu/cputlb.c
qemu/exec.c
qemu/fpu/softfloat.c
qemu/hw/sparc64/sun4u.c
qemu/ioport.c
qemu/memory.c
qemu/memory_mapping.c
qemu/target-sparc/cc_helper.c
qemu/target-sparc/cpu.c
qemu/target-sparc/fop_helper.c
qemu/target-sparc/helper.c
qemu/target-sparc/int64_helper.c
qemu/target-sparc/ldst_helper.c
qemu/target-sparc/mmu_helper.c
qemu/target-sparc/translate.c
qemu/target-sparc/unicorn64.c
qemu/target-sparc/vis_helper.c
qemu/target-sparc/win_helper.c
qemu/tcg/optimize.c
qemu/tcg/tcg.c
qemu/translate-all.c
)
if(MSVC)
target_compile_options(sparc64-softmmu PRIVATE
-DNEED_CPU_H
/FI sparc64.h
/I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/sparc64-softmmu
/I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-sparc
)
else()
target_compile_options(sparc64-softmmu PRIVATE
-DNEED_CPU_H
-include sparc64.h
-I${CMAKE_BINARY_DIR}/sparc64-softmmu
-I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-sparc
)
endif()
endif()
set(UNICORN_SRCS_COMMON
list.c
qemu/accel.c
qemu/glib_compat.c
qemu/hw/core/machine.c
qemu/hw/core/qdev.c
qemu/qapi/qapi-dealloc-visitor.c
qemu/qapi/qapi-visit-core.c
qemu/qapi/qmp-input-visitor.c
qemu/qapi/qmp-output-visitor.c
qemu/qapi/string-input-visitor.c
qemu/qemu-log.c
qemu/qemu-timer.c
qemu/qobject/qbool.c
qemu/qobject/qdict.c
qemu/qobject/qerror.c
qemu/qobject/qfloat.c
qemu/qobject/qint.c
qemu/qobject/qlist.c
qemu/qobject/qstring.c
qemu/qom/container.c
qemu/qom/cpu.c
qemu/qom/object.c
qemu/qom/qom-qobject.c
qemu/tcg-runtime.c
qemu/util/aes.c
qemu/util/bitmap.c
qemu/util/bitops.c
qemu/util/crc32c.c
qemu/util/cutils.c
qemu/util/error.c
qemu/util/getauxval.c
qemu/util/host-utils.c
qemu/util/module.c
qemu/util/qemu-timer-common.c
qemu/vl.c
uc.c
)
if (MSVC)
set(UNICORN_SRCS
${UNICORN_SRCS_COMMON}
qemu/util/oslib-win32.c
qemu/util/qemu-thread-win32.c
qemu/util/qemu-error.c
${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/qapi-types.c
${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/qapi-visit.c
)
else()
set(UNICORN_SRCS
${UNICORN_SRCS_COMMON}
qemu/util/oslib-posix.c
qemu/util/qemu-thread-posix.c
${CMAKE_BINARY_DIR}/qapi-types.c
${CMAKE_BINARY_DIR}/qapi-visit.c
)
endif()
add_library(unicorn SHARED
${UNICORN_SRCS}
)
if (UNICORN_HAS_X86)
set(UNICRON_COMPILE_OPTIONS ${UNICRON_COMPILE_OPTIONS} -DUNICORN_HAS_X86)
set(UNICRON_LINK_LIBRARIES ${UNICRON_LINK_LIBRARIES} x86_64-softmmu)
set(UNICRON_SAMPLE_FILE ${UNICRON_SAMPLE_FILE} sample_x86 sample_x86_32_gdt_and_seg_regs sample_batch_reg mem_apis shellcode)
endif()
if (UNICORN_HAS_ARM)
set(UNICRON_COMPILE_OPTIONS ${UNICRON_COMPILE_OPTIONS} -DUNICORN_HAS_ARM)
set(UNICRON_LINK_LIBRARIES ${UNICRON_LINK_LIBRARIES} arm-softmmu armeb-softmmu)
set(UNICRON_SAMPLE_FILE ${UNICRON_SAMPLE_FILE} sample_arm sample_armeb)
endif()
if (UNICORN_HAS_AARCH64)
set(UNICRON_COMPILE_OPTIONS ${UNICRON_COMPILE_OPTIONS} -DUNICORN_HAS_ARM64)
set(UNICRON_LINK_LIBRARIES ${UNICRON_LINK_LIBRARIES} aarch64-softmmu aarch64eb-softmmu)
set(UNICRON_SAMPLE_FILE ${UNICRON_SAMPLE_FILE} sample_arm64 sample_arm64eb)
endif()
if (UNICORN_HAS_M68K)
set(UNICRON_COMPILE_OPTIONS ${UNICRON_COMPILE_OPTIONS} -DUNICORN_HAS_M68K)
set(UNICRON_LINK_LIBRARIES ${UNICRON_LINK_LIBRARIES} m68k-softmmu)
set(UNICRON_SAMPLE_FILE ${UNICRON_SAMPLE_FILE} sample_m68k)
endif()
if (UNICORN_HAS_MIPS)
set(UNICRON_COMPILE_OPTIONS ${UNICRON_COMPILE_OPTIONS} -DUNICORN_HAS_MIPS -DUNICORN_HAS_MIPSEL -DUNICORN_HAS_MIPS64 -DUNICORN_HAS_MIPS64EL)
set(UNICRON_LINK_LIBRARIES ${UNICRON_LINK_LIBRARIES} mips-softmmu mipsel-softmmu mips64-softmmu mips64el-softmmu)
set(UNICRON_SAMPLE_FILE ${UNICRON_SAMPLE_FILE} sample_mips)
endif()
if (UNICORN_HAS_SPARC)
set(UNICRON_COMPILE_OPTIONS ${UNICRON_COMPILE_OPTIONS} -DUNICORN_HAS_SPARC)
set(UNICRON_LINK_LIBRARIES ${UNICRON_LINK_LIBRARIES} sparc-softmmu sparc64-softmmu)
set(UNICRON_SAMPLE_FILE ${UNICRON_SAMPLE_FILE} sample_sparc)
endif()
if(MSVC)
target_compile_options(unicorn PRIVATE
${UNICRON_COMPILE_OPTIONS}
-DUNICORN_SHARED
)
target_link_libraries(unicorn
${UNICRON_LINK_LIBRARIES}
)
else()
target_compile_options(unicorn PRIVATE
${UNICRON_COMPILE_OPTIONS}
)
target_link_libraries(unicorn
${UNICRON_LINK_LIBRARIES}
m
)
set_target_properties(unicorn PROPERTIES
VERSION ${UNICORN_VERSION_MAJOR}
SOVERSION ${UNICORN_VERSION_MAJOR}
)
endif()
if(MSVC)
set(SAMPLES_LIB
unicorn
)
else()
set(SAMPLES_LIB
unicorn
pthread
)
endif()
foreach(SAMPLE_FILE ${UNICRON_SAMPLE_FILE})
add_executable(${SAMPLE_FILE}
${CMAKE_CURRENT_SOURCE_DIR}/samples/${SAMPLE_FILE}.c
)
target_link_libraries(${SAMPLE_FILE}
${SAMPLES_LIB}
)
endforeach(SAMPLE_FILE)
if(NOT MSVC)
include("GNUInstallDirs")
file(GLOB UNICORN_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/unicorn/*.h)
install(TARGETS unicorn
RUNTIME DESTINATION bin
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
install(FILES ${UNICORN_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/unicorn)
file(WRITE ${CMAKE_BINARY_DIR}/unicorn.pc "Name: unicorn\n\
Description: Unicorn emulator engine\n\
Version: ${UNICORN_VERSION_MAJOR}.${UNICORN_VERSION_MINOR}.${UNICORN_VERSION_PATCH}\n\
libdir=${CMAKE_INSTALL_FULL_LIBDIR}\n\
includedir=${CMAKE_INSTALL_FULL_INCLUDEDIR}\n\
Libs: -L\$\{libdir\} -lunicorn\n\
Cflags: -I\$\{includedir\}\n"
)
install(FILES ${CMAKE_BINARY_DIR}/unicorn.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
endif()

View File

@ -69,3 +69,5 @@ David Zimmer: VB6 binding.
zhangwm: ARM & ARM64 big endian.
Mohamed Osama: FreePascal/Delphi binding.
Philippe Antoine (Catena cyber): fuzzing
KaiJern Lau (xwings): programmer
Huitao Chen (chenhuitao): programmer

17
cmake.sh Executable file
View File

@ -0,0 +1,17 @@
#!/bin/sh
# Unicorn Emulator Engine (www.unicorn-engine.org)
# Usage: cmake.sh [x86] [arm] [aarch64] [m68k] [mips] [sparc]
# By chenhuitao 2019
FLAGS="-DCMAKE_BUILD_TYPE=Release"
UNICORN_ARCH="${*}"
if [ -z "${UNICORN_ARCH}" ]; then
cmake "${FLAGS}" ..
else
cmake "${FLAGS}" "-DUNICORN_ARCH=${UNICORN_ARCH}" ..
fi
make -j8

83
docs/COMPILE-CMAKE.md Normal file
View File

@ -0,0 +1,83 @@
This documentation explains how to compile Unicorn with CMake on Windows or
*nix.
----
Requirements:
Windows: MicroSoft Visual Studio(>=2013).
*nix: GNU gcc. Python CLI to generate dynamic source files.
Get CMake for free from http://www.cmake.org.
[1] Tailor Unicorn to your need.
Out of archtitectures supported by Unicorn, if you just need several selected archs,
set the 'UNICORN_ARCH' in CMake. e.g.:
cmake -DUNICORN_ARCH="x86 mips" ..
By default, all architectures(x86 arm aarch64 m68k mips sparc) are compiled in.
Besides, Unicorn also allows some more customization via following macros.
- UNICORN_STATIC_MSVCRT: change this to OFF to use dynamic MSVCRT lib, Only on Windows.
[2] CMake allows you to generate different generators to build Unicorn. Below is
some examples on how to build Unicorn on Windows with CMake.
- You can let CMake select a generator for you. Do:
mkdir build
cd build
cmake ..
This last command is also where you can pass additional CMake configuration flags
using `-D<key>=<value>`. Then to build use:
cmake --build . --config Release
- To build Unicorn using Nmake of Windows SDK, do:
mkdir build
cd build
..\nmake.bat
After this, find the samples test*.exe, unicorn.lib & unicorn.dll
in the same directory.
- To build Unicorn using Visual Studio, choose the generator accordingly to the
version of Visual Studio on your machine. For example, with Visual Studio 2013, do:
mkdir build
cd build
cmake -G "Visual Studio 12" ..
After this, find unicorn.sln in the same directory. Open it with Visual Studio
and build the solution including libraries & all test as usual.
[3] You can make sure the prior steps successfully worked by launching one of the
sample binary (sample_*.exe).
[4] You can also enable just one specific architecture by passing the architecture name
to either the cmake.sh or nmake.bat scripts. e.g.:
../cmake.sh x86
Will just target the x86 architecture. The list of available architectures is:
X86 ARM AARCH64 M68K MIPS SPARC.
[5] You can also create an installation image with cmake, by using the 'install' target.
Use:
cmake --build . --config Release --target install
This will normally install an image in a default location (NOT SUPPORT Windows),
so it's good to explicitly set this location when configuring CMake. Use: `-DCMAKE_INSTALL_PREFIX=image`
for instance, to put the installation in the 'image' subdirectory of the build directory.
Default value of 'CMAKE_INSTALL_PREFIX' on *nix is '/usr/local'.

View File

@ -3,6 +3,9 @@ see [COMPILE-NIX.md](COMPILE-NIX.md)
To compile Unicorn on Windows, see [COMPILE-WINDOWS.md](COMPILE-WINDOWS.md)
To compile Unicorn with CMake on Windows or *nix, see
[COMPILE-CMAKE.md](COMPILE-CMAKE.md)
Then learn more on how to code your own tools with our samples.
- For C sample code, see code in directory samples/sample*.c

View File

@ -205,7 +205,9 @@ typedef signed __int64 ssize_t;
typedef _W64 signed int ssize_t;
#endif
#ifndef va_copy
#define va_copy(d,s) ((d) = (s))
#endif
#define strcasecmp _stricmp
#if (_MSC_VER < MSC_VER_VS2015)
#define snprintf _snprintf

40
nmake.bat Normal file
View File

@ -0,0 +1,40 @@
:: Unicorn Emulator Engine
:: Build Unicorn libs on Windows with CMake & Nmake
:: Usage: nmake.bat [x86 arm aarch64 m68k mips sparc], default build all.
:: By Huitao Chen, 2019
@echo off
set flags="-DCMAKE_BUILD_TYPE=Release"
set allparams=
:loop
set str=%1
if "%str%"=="" (
goto end
)
set allparams=%allparams% %str%
shift /0
goto loop
:end
if "%allparams%"=="" (
goto eof
)
:: remove left, right blank
:intercept_left
if "%allparams:~0,1%"==" " set "allparams=%allparams:~1%" & goto intercept_left
:intercept_right
if "%allparams:~-1%"==" " set "allparams=%allparams:~0,-1%" & goto intercept_right
:eof
if "%allparams%"=="" (
cmake "%flags%" -G "NMake Makefiles" ..
) else (
cmake "%flags%" "-DUNICORN_ARCH=%allparams%" -G "NMake Makefiles" ..
)
nmake

View File

@ -24,8 +24,15 @@
#endif
#endif
/* gcc __builtin___clear_cache() */
static inline void __builtin___clear_cache(void *beg, void *e)
{
unsigned char *start = beg;
unsigned char *end = e;
FlushInstructionCache(GetCurrentProcess(), start, end - start);
}
static double rint( double x )
static inline double rint( double x )
{
return floor(x < 0 ? x - 0.5 : x + 0.5);
}