blob: 529b5c292889b497da7280928724bca0027ccbcd [file]
# CMake build for ORC-RT.
#===============================================================================
# Setup Project
#===============================================================================
cmake_minimum_required(VERSION 3.20.0)
if("${CMAKE_VERSION}" VERSION_LESS "3.31.0")
message(WARNING
"Your CMake version is ${CMAKE_VERSION}. Starting with LLVM 24, the "
"minimum version of CMake required to build LLVM will become 3.31.0, and "
"using an older CMake will become an error. Please upgrade your CMake to "
"at least 3.31.0 now to avoid issues in the future.")
endif()
set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake
NO_POLICY_SCOPE)
project(OrcRT LANGUAGES C CXX ASM)
list(INSERT CMAKE_MODULE_PATH 0
"${CMAKE_CURRENT_SOURCE_DIR}/cmake"
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
"${CMAKE_CURRENT_SOURCE_DIR}/../runtimes/cmake/Modules"
"${LLVM_COMMON_CMAKE_UTILS}"
"${LLVM_COMMON_CMAKE_UTILS}/Modules"
)
include(GNUInstallDirs)
# --- C++ standard ---
set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
set(CMAKE_CXX_STANDARD_REQUIRED YES)
set(CMAKE_CXX_EXTENSIONS NO)
# --- Project variables ---
set(CMAKE_FOLDER "orc-rt")
set(ORC_RT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(ORC_RT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
#===============================================================================
# Setup CMake Options
#===============================================================================
# --- Build components ---
option(ORC_RT_INCLUDE_DOCS "Build the ORC-RT documentation." ON)
option(ORC_RT_INCLUDE_TESTS "Build ORC-RT tests." ${LLVM_INCLUDE_TESTS})
# --- Build behavior ---
option(ORC_RT_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON)
option(ORC_RT_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
option(ORC_RT_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
# --- Language runtime (RTTI / exceptions) ---
option(ORC_RT_ENABLE_RTTI "Enable RTTI." ON)
option(ORC_RT_ENABLE_EXCEPTIONS "Enable exceptions." ON)
# Derive the compile flags implied by the language-runtime options.
set(ORC_RT_COMPILE_FLAGS)
if(ORC_RT_ENABLE_RTTI)
list(APPEND ORC_RT_COMPILE_FLAGS -frtti)
else()
list(APPEND ORC_RT_COMPILE_FLAGS -fno-rtti)
endif()
if(ORC_RT_ENABLE_EXCEPTIONS)
list(APPEND ORC_RT_COMPILE_FLAGS -fexceptions)
else()
list(APPEND ORC_RT_COMPILE_FLAGS -fno-exceptions)
endif()
# --- Logging ---
# User-settable options (everything below them is validation and derivation):
# ORC_RT_LOG_BACKEND none (default) | printf | os_log
# ORC_RT_LOG_LEVEL error | warning | info (default) | debug
set(orc_rt_log_level_default "info")
set(ORC_RT_LOG_LEVEL "${orc_rt_log_level_default}" CACHE STRING
"Lowest log level compiled in: error, warning, info, or debug")
set(orc_rt_log_levels error warning info debug)
set_property(CACHE ORC_RT_LOG_LEVEL PROPERTY STRINGS ${orc_rt_log_levels})
set(ORC_RT_LOG_BACKEND "none" CACHE STRING
"ORC-RT logging backend: none, printf, os_log")
set(orc_rt_log_backends none printf os_log)
set_property(CACHE ORC_RT_LOG_BACKEND PROPERTY STRINGS ${orc_rt_log_backends})
# Validate the level and derive its config.h macro symbol.
if(NOT ORC_RT_LOG_LEVEL IN_LIST orc_rt_log_levels)
message(FATAL_ERROR "ORC_RT_LOG_LEVEL must be one of: ${orc_rt_log_levels}")
endif()
string(TOUPPER "ORC_RT_LOG_LEVEL_${ORC_RT_LOG_LEVEL}" ORC_RT_LOG_LEVEL_VALUE)
# Validate the backend (os_log is Apple-only) and derive its config.h macro symbol.
if(NOT ORC_RT_LOG_BACKEND IN_LIST orc_rt_log_backends)
message(FATAL_ERROR "ORC_RT_LOG_BACKEND must be one of: ${orc_rt_log_backends}")
endif()
if(ORC_RT_LOG_BACKEND STREQUAL "os_log" AND NOT APPLE)
message(FATAL_ERROR "ORC_RT_LOG_BACKEND=os_log is only supported on Apple platforms.")
endif()
string(TOUPPER "ORC_RT_LOG_BACKEND_${ORC_RT_LOG_BACKEND}" ORC_RT_LOG_BACKEND_VALUE)
# The "none" backend compiles all logging out, so the level has no effect. Warn
# if the user picked a non-default level under it, as their choice is ignored.
if(ORC_RT_LOG_BACKEND STREQUAL "none" AND
NOT ORC_RT_LOG_LEVEL STREQUAL orc_rt_log_level_default)
message(WARNING
"ORC_RT_LOG_LEVEL is set to '${ORC_RT_LOG_LEVEL}', but ORC_RT_LOG_BACKEND is "
"'none', so no logging is compiled in and the level has no effect. Select a "
"backend (printf or os_log) to enable logging.")
endif()
# --- Generated config header ---
# Keep this last in the section so it captures every value derived above.
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/include/orc-rt-c/config.h.in
${CMAKE_CURRENT_BINARY_DIR}/include/orc-rt-c/config.h
@ONLY
)
#===============================================================================
# Setup Source Code
#===============================================================================
if (ORC_RT_INCLUDE_DOCS)
add_subdirectory(docs)
endif()
add_subdirectory(include)
add_subdirectory(lib)
add_subdirectory(tools)
if(ORC_RT_INCLUDE_TESTS)
add_subdirectory(test)
endif()