athena/atdna/CMakeLists.txt

260 lines
8.6 KiB
CMake
Raw Normal View History

2015-08-03 01:42:47 +00:00
###############
# ATDNA Build #
###############
2017-12-07 04:07:33 +00:00
if(NOT CMAKE_CROSSCOMPILING)
2019-07-20 04:19:44 +00:00
string(REPLACE -stdlib=libc++ "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
get_directory_property(ATDNA_DEFINES COMPILE_DEFINITIONS)
list(REMOVE_ITEM ATDNA_DEFINES _GLIBCXX_DEBUG=1)
set_directory_properties(PROPERTIES COMPILE_DEFINITIONS "${ATDNA_DEFINES}")
2015-08-31 03:29:37 +00:00
# Force this binary to Release flags (to make MSVC happy)
if(MSVC)
2018-05-25 06:33:43 +00:00
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_RELEASE}")
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MD /O2 /Ob2 /DNDEBUG")
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "-debug -incremental:no")
2015-08-31 03:29:37 +00:00
endif()
2015-08-03 01:42:47 +00:00
# Find dependencies
include(FindLLVM.cmake)
if(NOT LLVM_FOUND)
2015-11-17 20:37:08 +00:00
message(STATUS "Unable to locate LLVM installation; skipping atdna")
2015-08-03 01:42:47 +00:00
else()
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
option(ATDNA_DYNAMIC_LLVM "Use dynamic library targets when linking LLVM" ON)
else()
option(ATDNA_DYNAMIC_LLVM "Use dynamic library targets when linking LLVM" OFF)
2016-12-11 20:18:12 +00:00
endif()
if(ATDNA_DYNAMIC_LLVM)
list(APPEND LLVM_LIBS
clangFrontend
clangTooling
clangDriver
clangSerialization
clangParse
clangSema
clangAnalysis
clangEdit
clangAST
clangLex
clangBasic
LLVM)
else()
find_library(LLVMDEMANGLE_LIB LLVMDemangle HINTS "${LLVM_ROOT_DIR}/lib")
find_library(LLVMBINARYFORMAT_LIB LLVMBinaryFormat HINTS "${LLVM_ROOT_DIR}/lib")
if (NOT LLVMDEMANGLE_LIB)
set(LLVMDEMANGLE_LIB "")
endif()
if (NOT LLVMBINARYFORMAT_LIB)
set(LLVMBINARYFORMAT_LIB "")
endif()
list(APPEND LLVM_LIBS
clangFrontend
clangTooling
clangDriver
clangSerialization
clangParse
clangSema
clangAnalysis
clangEdit
clangAST
clangLex
clangBasic
LLVMCore
LLVMOption
LLVMMCParser
LLVMBitReader
${LLVMBINARYFORMAT_LIB}
LLVMMC
LLVMProfileData
LLVMSupport
${LLVMDEMANGLE_LIB})
endif()
2016-06-27 22:54:55 +00:00
string(FIND ${LLVM_VERSION_STRING} "svn" SVN_FILTER_IDX)
if(NOT SVN_FILTER_IDX EQUAL -1)
string(SUBSTRING ${LLVM_VERSION_STRING} 0 ${SVN_FILTER_IDX} LLVM_VERSION_BASE)
else()
set(LLVM_VERSION_BASE ${LLVM_VERSION_STRING})
endif()
set(CLANG_INCLUDE_DIR ${LLVM_LIBRARY_DIRS}/clang/${LLVM_VERSION_BASE}/include
CACHE PATH "Clang include dir" FORCE)
2015-08-03 01:42:47 +00:00
if(UNIX)
2016-09-10 23:38:44 +00:00
list(APPEND PLAT_LIBS z pthread curses)
if (APPLE)
2015-09-12 18:25:58 +00:00
list(APPEND PLAT_LIBS dl)
2016-09-10 23:38:44 +00:00
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
2017-10-31 03:50:44 +00:00
list(APPEND PLAT_LIBS dl tinfo)
2016-09-10 23:38:44 +00:00
endif()
elseif(WIN32)
list(APPEND PLAT_LIBS Version)
2015-08-03 01:42:47 +00:00
endif()
# Offer the user the choice of overriding the installation directories
set(INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files")
set(INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables")
if(WIN32 AND NOT CYGWIN)
set(INSTALL_CMAKE_DIR cmake)
else()
set(INSTALL_CMAKE_DIR lib/cmake/atdna)
endif()
# Make relative paths absolute (needed later on)
foreach(p BIN INCLUDE CMAKE)
set(var INSTALL_${p}_DIR)
if(NOT IS_ABSOLUTE "${${var}}")
set(ABS_${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")
else()
set(ABS_${var} "${${var}}")
endif()
endforeach()
# Windows resource
if(WIN32)
configure_file(main.rc.in main.rc @ONLY)
set(PLAT_SRCS ${CMAKE_CURRENT_BINARY_DIR}/main.rc)
endif()
# ATDNA target
add_executable(atdna main.cpp test.hpp ${PLAT_SRCS})
target_link_libraries(atdna ${LLVM_LIBS} ${PLAT_LIBS})
2016-09-10 23:38:44 +00:00
set_source_files_properties(main.cpp PROPERTIES COMPILE_DEFINITIONS
2015-08-03 01:42:47 +00:00
"INSTALL_PREFIX=${ABS_INSTALL_BIN_DIR};__STDC_LIMIT_MACROS=1;__STDC_CONSTANT_MACROS=1")
target_include_directories(atdna PRIVATE ${LLVM_INCLUDE_DIRS})
target_link_directories(atdna PRIVATE ${LLVM_LIBRARY_DIRS})
2015-08-03 01:42:47 +00:00
if(MSVC)
2019-08-31 20:35:50 +00:00
target_compile_options(atdna PRIVATE /GR-)
2015-08-03 01:42:47 +00:00
else()
2019-08-31 20:35:50 +00:00
target_compile_options(atdna PRIVATE -fno-rtti -Wno-error)
2015-08-03 01:42:47 +00:00
endif()
# Define installs
install(TARGETS atdna DESTINATION ${INSTALL_BIN_DIR} EXPORT atdnaTargets COMPONENT atdna)
2016-03-04 23:00:12 +00:00
install(DIRECTORY ${CLANG_INCLUDE_DIR}/ DESTINATION ${INSTALL_INCLUDE_DIR}/athena/clang COMPONENT atdna)
2015-08-03 01:42:47 +00:00
##################
# Package Export #
##################
# Add all targets to the build-tree export set
2017-12-07 04:07:33 +00:00
export(TARGETS atdna FILE "${CMAKE_CURRENT_BINARY_DIR}/atdnaTargets.cmake")
2015-08-03 01:42:47 +00:00
# Export the package for use from the build-tree
# (this registers the build-tree with a global CMake-registry)
export(PACKAGE atdna)
# Create the atdnaConfig.cmake
# ... for the build tree
set(CONF_CLANG_INCLUDE_DIR "${CLANG_INCLUDE_DIR}")
2017-12-07 04:07:33 +00:00
configure_file(atdnaConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/atdnaConfig.cmake" @ONLY)
2015-08-03 01:42:47 +00:00
# ... for the install tree
set(CONF_CLANG_INCLUDE_DIR "\${ATHENA_INCLUDE_DIR}/clang")
2017-12-07 04:07:33 +00:00
configure_file(atdnaConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/atdnaConfig.cmake" @ONLY)
2015-08-03 01:42:47 +00:00
# ... for both
2017-12-07 04:07:33 +00:00
configure_file(atdnaConfigVersion.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/atdnaConfigVersion.cmake" @ONLY)
2015-08-03 01:42:47 +00:00
# Install atdnaConfig.cmake
install(FILES
2017-12-07 04:07:33 +00:00
"${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/atdnaConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/atdnaConfigVersion.cmake"
2015-08-03 01:42:47 +00:00
DESTINATION ${INSTALL_CMAKE_DIR} COMPONENT atdna)
# Install the export set for use with the install-tree
install(EXPORT atdnaTargets DESTINATION ${INSTALL_CMAKE_DIR} COMPONENT atdna)
#########
# CTest #
#########
enable_testing()
2016-09-10 23:38:44 +00:00
add_test(NAME test-dna COMMAND $<TARGET_FILE:atdna> -o test.cpp
2015-08-03 01:42:47 +00:00
"-I${ATHENA_INCLUDE_DIR}" -isystem "${CLANG_INCLUDE_DIR}"
${CMAKE_SOURCE_DIR}/test.hpp)
endif()
#######################
# In-tree atdna macro #
#######################
# Super handy macro for adding atdna target
function(atdna out incdirs cdefs)
# Ninja wants invocations in root binary dir for DEPFILE application
file(RELATIVE_PATH out_rel ${CMAKE_BINARY_DIR} "${CMAKE_CURRENT_BINARY_DIR}/${out}")
# Make input files source-relative
unset(ins)
unset(ins_impdeps)
foreach(arg ${ARGN})
list(APPEND ins ${CMAKE_CURRENT_SOURCE_DIR}/${arg})
list(APPEND ins_impdeps CXX)
list(APPEND ins_impdeps ${CMAKE_CURRENT_SOURCE_DIR}/${arg})
endforeach()
# MS extra
unset(extraargs)
if(MSVC)
list(APPEND extraargs -fms-compatibility -fexceptions)
if(MSVC_VERSION EQUAL 1800)
list(APPEND extraargs -fms-compatibility-version=18.00)
elseif(MSVC_VERSION EQUAL 1900)
list(APPEND extraargs -fms-compatibility-version=19.00)
2017-03-10 17:57:44 +00:00
elseif(MSVC_VERSION EQUAL 1910)
list(APPEND extraargs -fms-compatibility-version=19.10)
2017-10-24 03:10:58 +00:00
elseif(MSVC_VERSION EQUAL 1911)
list(APPEND extraargs -fms-compatibility-version=19.11)
endif()
# OSX Extra
elseif(APPLE)
get_filename_component(COMPILER_DIR "${CMAKE_CXX_COMPILER}" DIRECTORY)
2016-01-09 02:00:08 +00:00
if (NOT EXISTS "${CMAKE_OSX_SYSROOT}")
message(FATAL_ERROR "CMAKE_OSX_SYSROOT not set")
endif()
list(APPEND extraargs
2018-08-28 03:47:14 +00:00
-I ${COMPILER_DIR}/../include/c++/v1
-isysroot ${CMAKE_OSX_SYSROOT})
endif()
# Make target
if(${CMAKE_GENERATOR} STREQUAL "Ninja")
# Use Ninja's DEPFILE parser in cooperation with atdna
add_custom_command(OUTPUT ${out} COMMAND $<TARGET_FILE:atdna>
ARGS ${extraargs} -o ${out_rel} -MD -MT ${out_rel} -MF ${out_rel}.d
"$<$<BOOL:${incdirs}>:-I$<JOIN:${incdirs},;-I>>"
"$<$<BOOL:${cdefs}>:-D$<JOIN:${cdefs},;-D>>"
"-I${athena_SOURCE_DIR}/include" -isystem "${CLANG_INCLUDE_DIR}" ${ins}
DEPENDS atdna ${ins} IMPLICIT_DEPENDS ${ins_impdeps}
DEPFILE "${CMAKE_CURRENT_BINARY_DIR}/${out}.d"
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Generating DNA ${out_rel}"
COMMAND_EXPAND_LISTS)
else()
# Use CMake's built-in dependency scanner for makefile targets
add_custom_command(OUTPUT ${out} COMMAND $<TARGET_FILE:atdna>
ARGS ${extraargs} -o ${out_rel}
"$<$<BOOL:${incdirs}>:-I$<JOIN:${incdirs},;-I>>"
"$<$<BOOL:${cdefs}>:-D$<JOIN:${cdefs},;-D>>"
"-I${athena_SOURCE_DIR}/include" -isystem "${CLANG_INCLUDE_DIR}" ${ins}
DEPENDS atdna ${ins} IMPLICIT_DEPENDS ${ins_impdeps}
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Generating DNA ${out_rel}"
COMMAND_EXPAND_LISTS)
endif()
2018-10-07 02:51:06 +00:00
endfunction()
2017-12-07 04:07:33 +00:00
function(target_atdna target out)
atdna(${out} "$<TARGET_PROPERTY:${target},INCLUDE_DIRECTORIES>"
"$<TARGET_PROPERTY:${target},COMPILE_DEFINITIONS>" ${ARGN})
target_sources(${target} PRIVATE ${out} ${ARGN})
endfunction()
2017-12-07 04:07:33 +00:00
endif()