Files
asmjit/CMakeLists.txt
2017-01-26 15:55:03 +01:00

223 lines
5.7 KiB
CMake

cmake_minimum_required(VERSION 3.1)
# Don't create a project if it was already created by another CMakeLists.txt.
# This allows one library to embed another library without a project collision.
if(NOT CMAKE_PROJECT_NAME OR "${CMAKE_PROJECT_NAME}" STREQUAL "asmjit")
project(asmjit C CXX)
endif()
# =============================================================================
# [AsmJit - Configuration]
# =============================================================================
set(ASMJIT_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "Location of 'asmjit'")
set(ASMJIT_EMBED FALSE CACHE BOOLEAN "Embed 'asmjit' library (no targets)")
set(ASMJIT_STATIC FALSE CACHE BOOLEAN "Build 'asmjit' library as static")
set(ASMJIT_BUILD_ARM FALSE CACHE BOOLEAN "Build ARM32/ARM64 backends")
set(ASMJIT_BUILD_X86 FALSE CACHE BOOLEAN "Build X86/X64 backends")
set(ASMJIT_BUILD_TEST FALSE CACHE BOOLEAN "Build 'asmjit_test' applications")
# =============================================================================
# [AsmJit - Project]
# =============================================================================
include("${ASMJIT_DIR}/CxxProject.cmake")
cxx_project(asmjit)
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
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-)
# Enable multi-process compilation.
if(NOT MSVC60 AND NOT MSVC70 AND NOT MSVC71)
list(APPEND ASMJIT_PRIVATE_CFLAGS /MP)
endif()
endif()
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang)$")
cxx_detect_standard(ASMJIT_PRIVATE_CFLAGS)
cxx_detect_cflags(ASMJIT_PRIVATE_CFLAGS
"-fno-tree-vectorize"
"-fvisibility=hidden"
"-Winconsistent-missing-override")
cxx_detect_cflags(ASMJIT_PRIVATE_CFLAGS_REL
"-O2" # CMake by default uses -O3, which does nothing useful.
"-fno-keep-static-consts"
"-fmerge-all-constants")
endif()
if(ASMJIT_TRACE)
list(APPEND ASMJIT_PRIVATE_CFLAGS "${CXX_DEFINE}ASMJIT_TRACE")
endif()
if(WIN32)
list(APPEND ASMJIT_PRIVATE_CFLAGS "${CXX_DEFINE}_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()
foreach(BUILD_OPTION
ASMJIT_BUILD_ARM
ASMJIT_BUILD_X86
ASMJIT_DISABLE_BUILDER
ASMJIT_DISABLE_COMPILER
ASMJIT_DISABLE_TEXT
ASMJIT_DISABLE_LOGGING
ASMJIT_DISABLE_VALIDATION)
if(${BUILD_OPTION})
List(APPEND ASMJIT_CFLAGS "${CXX_DEFINE}${BUILD_OPTION}")
List(APPEND ASMJIT_PRIVATE_CFLAGS "${CXX_DEFINE}${BUILD_OPTION}")
endif()
endforeach()
cxx_project_info(asmjit)
# =============================================================================
# [AsmJit - Source]
# =============================================================================
set(ASMJIT_SRC "")
cxx_add_source(asmjit ASMJIT_SRC asmjit
asmjit.h
asmjit_apibegin.h
asmjit_apiend.h
asmjit_build.h
base.h
arm.h
x86.h
)
cxx_add_source(asmjit ASMJIT_SRC asmjit/base
arch.cpp
arch.h
assembler.cpp
assembler.h
codebuilder.cpp
codebuilder.h
codecompiler.cpp
codecompiler.h
codeemitter.cpp
codeemitter.h
codeholder.cpp
codeholder.h
constpool.cpp
constpool.h
cpuinfo.cpp
cpuinfo.h
func.cpp
func.h
globals.cpp
globals.h
logging.cpp
logging.h
misc_p.h
operand.cpp
operand.h
osutils.cpp
osutils.h
regalloc.cpp
regalloc_p.h
runtime.cpp
runtime.h
simdtypes.h
string.cpp
string.h
utils.cpp
utils.h
vmem.cpp
vmem.h
zone.cpp
zone.h
)
if(0)
cxx_add_source(asmjit ASMJIT_SRC asmjit/arm
armassembler.cpp
armassembler.h
arminst.cpp
arminst.h
armoperand.cpp
armoperand_regs.cpp
armoperand.h
)
endif()
cxx_add_source(asmjit ASMJIT_SRC asmjit/x86
x86assembler.cpp
x86assembler.h
x86builder.cpp
x86builder.h
x86compiler.cpp
x86compiler.h
x86emitter.h
x86globals.h
x86internal.cpp
x86internal_p.h
x86inst.cpp
x86inst.h
x86logging.cpp
x86logging_p.h
x86misc.h
x86operand.cpp
x86operand_regs.cpp
x86operand.h
x86regalloc.cpp
x86regalloc_p.h
x86ssetoavxpass.cpp
x86ssetoavxpass_p.h
)
# =============================================================================
# [AsmJit - Targets]
# =============================================================================
if(NOT ASMJIT_EMBED)
# Add `asmjit` library.
cxx_add_library(asmjit asmjit
"${ASMJIT_SRC}"
"${ASMJIT_DEPS}"
"${ASMJIT_PRIVATE_CFLAGS}"
"${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)
cxx_add_source(asmjit ASMJIT_TEST_SRC ../test asmjit_test_unit.cpp broken.cpp broken.h)
cxx_add_executable(asmjit asmjit_test_unit
"${ASMJIT_SRC};${ASMJIT_TEST_SRC}"
"${ASMJIT_DEPS}"
"${ASMJIT_PRIVATE_CFLAGS};${CXX_DEFINE}ASMJIT_TEST;${CXX_DEFINE}ASMJIT_EMBED"
"${ASMJIT_PRIVATE_CFLAGS_DBG}"
"${ASMJIT_PRIVATE_CFLAGS_REL}")
foreach(_target asmjit_bench_x86 asmjit_test_opcode asmjit_test_x86_asm asmjit_test_x86_cc)
cxx_add_executable(asmjit ${_target} "test/${_target}.cpp" "${ASMJIT_LIBS}" "${ASMJIT_CFLAGS}" "" "")
endforeach()
endif()
endif()