Files
asmjit/CMakeLists.txt

364 lines
10 KiB
CMake

cmake_minimum_required(VERSION 3.1)
include(CheckCXXCompilerFlag)
# =============================================================================
# [AsmJit - Configuration]
# =============================================================================
# Embedding mode, asmjit will not create any targets (default FALSE).
# set(ASMJIT_EMBED FALSE)
# Whether to build a static library (default FALSE).
# set(ASMJIT_STATIC FALSE)
# Used for debugging asmjit itself (default FALSE).
# set(ASMJIT_TRACE FALSE)
# Whether to build ARM32 backend (TRUE if building for ARM32).
# set(ASMJIT_BUILD_ARM32 FALSE)
# Whether to build ARM64 backend (TRUE if building for ARM64).
# set(ASMJIT_BUILD_ARM64 FALSE)
# Whether to build X86 backend (TRUE if building for X86).
# set(ASMJIT_BUILD_X86 FALSE)
# Whether to build X64 backend (TRUE if building for X64).
# set(ASMJIT_BUILD_X64 FALSE)
# Whether to build tests and samples (default FALSE).
# set(ASMJIT_BUILD_TEST FALSE)
# =============================================================================
# [AsmJit - Build / Embed]
# =============================================================================
# Do not create a project if this CMakeLists.txt is included from another
# project. This makes it easy to embed or create a static library.
if(NOT CMAKE_PROJECT_NAME OR "${CMAKE_PROJECT_NAME}" MATCHES "^asmjit$")
project(asmjit C CXX)
set(ASMJIT_SIGNATURE "Standalone")
else()
set(ASMJIT_SIGNATURE "Included")
endif()
if(ASMJIT_EMBED)
set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Mode=Embed")
set(ASMJIT_STATIC TRUE) # Implies ASMJIT_STATIC.
elseif(ASMJIT_STATIC)
set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Mode=Static")
else()
set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Mode=Shared")
endif()
if(ASMJIT_BUILD_TEST)
set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Test=On")
else()
set(ASMJIT_SIGNATURE "${ASMJIT_SIGNATURE} | Test=Off")
endif()
if(NOT ASMJIT_DIR)
set(ASMJIT_DIR ${CMAKE_CURRENT_LIST_DIR})
endif()
message("-- [asmjit] ${ASMJIT_SIGNATURE}")
message("-- [asmjit] ASMJIT_DIR=${ASMJIT_DIR}")
# =============================================================================
# [NP-Utilities]
# =============================================================================
function(np_detect_options out)
set(out_array)
foreach(flag ${ARGN})
check_cxx_compiler_flag("${flag}" ok)
if(ok)
list(APPEND out_array "${flag}")
endif()
unset(ok)
endforeach()
set(${out} "${out_array}" PARENT_SCOPE)
endfunction()
# =============================================================================
# [AsmJit - Flags / Deps]
# =============================================================================
set(ASMJIT_SOURCE_DIR "${ASMJIT_DIR}/src") # Asmjit source directory.
set(ASMJIT_INCLUDE_DIR "${ASMJIT_SOURCE_DIR}") # Asmjit include directory.
set(ASMJIT_CFLAGS) # Asmjit CFLAGS / CXXFLAGS.
set(ASMJIT_DEPS) # Asmjit dependencies (list of libraries) for the linker.
set(ASMJIT_LIBS) # Asmjit dependencies with asmjit included, for consumers.
# Internal, never use.
set(ASMJIT_D "-D") # Used to define a C/C++ preprocessor parameter (-D or /D).
set(ASMJIT_PRIVATE_CFLAGS) # Compiler flags independent of build type.
set(ASMJIT_PRIVATE_LFLAGS "") # Linker flags used by the library and tests.
set(ASMJIT_PRIVATE_CFLAGS_DBG) # Compiler flags used only by debug build.
set(ASMJIT_PRIVATE_CFLAGS_REL) # Compiler flags used only by release build.
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
set(ASMJIT_D "/D")
set(ASMJIT_PRIVATE_LFLAGS "/OPT:REF /OPT:ICF")
list(APPEND ASMJIT_PRIVATE_CFLAGS /GF)
list(APPEND ASMJIT_PRIVATE_CFLAGS_DBG /GS /GR-)
list(APPEND ASMJIT_PRIVATE_CFLAGS_REL /Oi /Oy /GS- /GR-)
if(NOT MSVC60 AND NOT MSVC70 AND NOT MSVC71)
list(APPEND ASMJIT_PRIVATE_CFLAGS /MP) # Enable multi-process compilation.
endif()
endif()
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang)$")
# Keep only the first option detected.
np_detect_options(ASMJIT_CC_OPTIONS
"-std=c++14"
"-std=c++11"
"-std=c++0x")
if(ASMJIT_CC_OPTIONS)
list(GET ASMJIT_CC_OPTIONS 0 ASMJIT_CC_OPTIONS)
list(APPEND ASMJIT_PRIVATE_CFLAGS ${ASMJIT_CC_OPTIONS})
endif()
np_detect_options(ASMJIT_CC_OPTIONS
"-fno-exceptions"
"-fno-tree-vectorize"
"-fvisibility=hidden")
list(APPEND ASMJIT_PRIVATE_CFLAGS ${ASMJIT_CC_OPTIONS})
list(APPEND ASMJIT_PRIVATE_CFLAGS_REL -fmerge-all-constants)
unset(ASMJIT_CC_OPTIONS)
endif()
if(ASMJIT_EMBED)
list(APPEND ASMJIT_PRIVATE_CFLAGS "${ASMJIT_D}ASMJIT_EMBED")
elseif(ASMJIT_STATIC)
list(APPEND ASMJIT_PRIVATE_CFLAGS "${ASMJIT_D}ASMJIT_STATIC")
endif()
if(ASMJIT_TRACE)
list(APPEND ASMJIT_PRIVATE_CFLAGS "${ASMJIT_D}ASMJIT_TRACE")
endif()
if(WIN32)
list(APPEND ASMJIT_PRIVATE_CFLAGS "${ASMJIT_D}_UNICODE")
else()
list(APPEND ASMJIT_DEPS pthread)
endif()
if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
list(APPEND ASMJIT_DEPS rt)
endif()
set(ASMJIT_LIBS ${ASMJIT_DEPS})
if(NOT ASMJIT_EMBED)
list(INSERT ASMJIT_LIBS 0 asmjit)
endif()
if(ASMJIT_BUILD_ARM32)
List(APPEND ASMJIT_CFLAGS "${ASMJIT_D}ASMJIT_BUILD_ARM32")
endif()
if(ASMJIT_BUILD_ARM64)
List(APPEND ASMJIT_CFLAGS "${ASMJIT_D}ASMJIT_BUILD_ARM64")
endif()
if(ASMJIT_BUILD_X86)
List(APPEND ASMJIT_CFLAGS "${ASMJIT_D}ASMJIT_BUILD_X86")
endif()
if(ASMJIT_BUILD_X64)
List(APPEND ASMJIT_CFLAGS "${ASMJIT_D}ASMJIT_BUILD_X64")
endif()
set(ASMJIT_PRIVATE_CFLAGS_DBG ${ASMJIT_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS_DBG})
set(ASMJIT_PRIVATE_CFLAGS_REL ${ASMJIT_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS_REL})
message("-- [asmjit] ASMJIT_DEPS=${ASMJIT_DEPS}")
message("-- [asmjit] ASMJIT_LIBS=${ASMJIT_LIBS}")
message("-- [asmjit] ASMJIT_CFLAGS=${ASMJIT_CFLAGS}")
# =============================================================================
# [AsmJit - Macros]
# =============================================================================
macro(asmjit_add_source _out_dst _src_dir)
set(_src_path "${ASMJIT_SOURCE_DIR}/${_src_dir}")
set(_src_list)
foreach(_arg ${ARGN})
set(_src_file "${_src_path}/${_arg}")
list(APPEND _src_list ${_src_file})
endforeach()
list(APPEND "${_out_dst}" ${_src_list})
source_group(${_src_dir} FILES ${_src_list})
endmacro()
macro(asmjit_add_library _target _src _deps _cflags _cflags_dbg _cflags_rel)
if(NOT ASMJIT_STATIC)
add_library(${_target} SHARED ${_src})
else()
add_library(${_target} STATIC ${_src})
endif()
target_link_libraries(${_target} ${_deps})
set_target_properties(${_target} PROPERTIES LINK_FLAGS "${ASMJIT_PRIVATE_LFLAGS}")
if(CMAKE_BUILD_TYPE)
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
target_compile_options(${_target} PRIVATE ${_cflags} ${_cflags_dbg})
else()
target_compile_options(${_target} PRIVATE ${_cflags} ${_cflags_rel})
endif()
else()
target_compile_options(${_target} PRIVATE ${_cflags}
$<$<CONFIG:Debug>:${_cflags_dbg}>
$<$<NOT:$<CONFIG:Debug>>:${_cflags_rel}>)
endif()
if(NOT ASMJIT_STATIC)
install(TARGETS ${_target} DESTINATION "lib${LIB_SUFFIX}")
endif()
endmacro()
# =============================================================================
# [AsmJit - Source]
# =============================================================================
set(ASMJIT_SRC "")
asmjit_add_source(ASMJIT_SRC asmjit
apibegin.h
apiend.h
asmjit.h
base.h
build.h
host.h
arm.h
x86.h
)
asmjit_add_source(ASMJIT_SRC asmjit/base
assembler.cpp
assembler.h
compiler.cpp
compiler.h
compilercontext.cpp
compilercontext_p.h
compilerfunc.h
constpool.cpp
constpool.h
containers.cpp
containers.h
cpuinfo.cpp
cpuinfo.h
globals.cpp
globals.h
hlstream.cpp
hlstream.h
logger.cpp
logger.h
operand.cpp
operand.h
podvector.cpp
podvector.h
runtime.cpp
runtime.h
utils.cpp
utils.h
vectypes.h
vmem.cpp
vmem.h
zone.cpp
zone.h
)
if(0)
asmjit_add_source(ASMJIT_SRC asmjit/arm
armassembler.cpp
armassembler.h
arminst.cpp
arminst.h
armoperand.cpp
armoperand_regs.cpp
armoperand.h
)
endif()
asmjit_add_source(ASMJIT_SRC asmjit/x86
x86assembler.cpp
x86assembler.h
x86compiler.cpp
x86compiler.h
x86compilercontext.cpp
x86compilercontext_p.h
x86compilerfunc.cpp
x86compilerfunc.h
x86inst.cpp
x86inst.h
x86operand.cpp
x86operand_regs.cpp
x86operand.h
)
# =============================================================================
# [AsmJit - Targets]
# =============================================================================
if(NOT ASMJIT_EMBED)
# Add `asmjit` library.
asmjit_add_library(asmjit
"${ASMJIT_SRC}"
"${ASMJIT_DEPS}"
""
"${ASMJIT_PRIVATE_CFLAGS_DBG}"
"${ASMJIT_PRIVATE_CFLAGS_REL}"
)
foreach(_src_file ${ASMJIT_SRC})
get_filename_component(_src_dir ${_src_file} PATH)
get_filename_component(_src_name ${_src_file} NAME)
string(REGEX REPLACE "^${ASMJIT_SOURCE_DIR}/" "" targetpath "${_src_dir}")
if("${_src_name}" MATCHES ".h$")
if(NOT "${_src_name}" MATCHES "_p.h$")
install(FILES ${_src_file} DESTINATION "include/${targetpath}")
endif()
endif()
endforeach()
# Add `asmjit` tests and samples.
if(ASMJIT_BUILD_TEST)
set(ASMJIT_TEST_SRC "")
set(ASMJIT_TEST_CFLAGS ${ASMJIT_CFLAGS} ${ASMJIT_D}ASMJIT_TEST ${ASMJIT_D}ASMJIT_EMBED)
asmjit_add_source(ASMJIT_TEST_SRC test asmjit_test_unit.cpp broken.cpp broken.h)
add_executable(asmjit_test_unit ${ASMJIT_SRC} ${ASMJIT_TEST_SRC})
target_link_libraries(asmjit_test_unit ${ASMJIT_DEPS})
set_target_properties(asmjit_test_unit PROPERTIES LINK_FLAGS "${ASMJIT_PRIVATE_LFLAGS}")
if(CMAKE_BUILD_TYPE)
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
target_compile_options(asmjit_test_unit PRIVATE ${ASMJIT_TEST_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS_DBG})
else()
target_compile_options(asmjit_test_unit PRIVATE ${ASMJIT_TEST_CFLAGS} ${ASMJIT_PRIVATE_CFLAGS_REL})
endif()
else()
target_compile_options(asmjit_test_unit PRIVATE ${ASMJIT_TEST_CFLAGS}
$<$<CONFIG:Debug>:${ASMJIT_PRIVATE_CFLAGS_DBG}>
$<$<NOT:$<CONFIG:Debug>>:${ASMJIT_PRIVATE_CFLAGS_REL}>)
endif()
foreach(_target asmjit_bench_x86 asmjit_test_opcode asmjit_test_x86)
add_executable(${_target} "src/test/${_target}.cpp")
target_compile_options(${_target} PRIVATE ${ASMJIT_CFLAGS})
target_link_libraries(${_target} ${ASMJIT_LIBS})
endforeach()
endif()
endif()