178 lines
6.1 KiB
CMake
178 lines
6.1 KiB
CMake
################################################################################
|
|
# CMake Setup
|
|
################################################################################
|
|
cmake_minimum_required(VERSION 3.26...)
|
|
project(BlitzLLVM)
|
|
list(APPEND CMAKE_MESSAGE_INDENT "[${PROJECT_NAME}] ")
|
|
|
|
# Module Search Paths
|
|
list(APPEND CMAKE_MODULE_PATH
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake-clang"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake-version"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake"
|
|
)
|
|
|
|
# Include default modules
|
|
#- Interprocedural optimizations
|
|
include("CheckIPOSupported")
|
|
|
|
#- CMake-based Versioning
|
|
include("version")
|
|
|
|
#- CMake-based Clang integration
|
|
include("clang")
|
|
|
|
|
|
SET_PROPERTY( GLOBAL PROPERTY USE_FOLDERS ON)
|
|
|
|
################################################################################
|
|
# Versioning
|
|
################################################################################
|
|
|
|
version(GENERATE _VERSION COMPRESSED MAJOR 0 MINOR 0 PATCH 0 TWEAK 0 REQUIRE "PATCH;")
|
|
version(PARSE _VERSION "${_VERSION}" REQUIRE "PATCH;TWEAK")
|
|
|
|
# If possible, automatically generate versions from git.
|
|
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git")
|
|
find_program(GIT
|
|
NAMES
|
|
git
|
|
git.exe
|
|
)
|
|
|
|
if(EXISTS "${GIT}")
|
|
# Try and calculate the exist version using git.
|
|
execute_process(COMMAND "${GIT}" describe --tags --long --abbrev=8 HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE GIT_RESULT OUTPUT_VARIABLE GIT_OUTPUT ERROR_VARIABLE GIT_ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
|
|
if((GIT_RESULT EQUAL 0) AND (NOT "${GIT_OUTPUT}" STREQUAL ""))
|
|
# Result will be MAJOR.MINOR.PATCH-TWEAK-gHASH
|
|
string(REPLACE "-" ";" GIT_OUTPUT "${GIT_OUTPUT}")
|
|
string(REPLACE "." ";" GIT_OUTPUT "${GIT_OUTPUT}")
|
|
|
|
# Split into components
|
|
list(GET GIT_OUTPUT 0 GIT_OUTPUT_MAJOR)
|
|
list(GET GIT_OUTPUT 1 GIT_OUTPUT_MINOR)
|
|
list(GET GIT_OUTPUT 2 GIT_OUTPUT_PATCH)
|
|
list(GET GIT_OUTPUT 3 GIT_OUTPUT_TWEAK)
|
|
list(GET GIT_OUTPUT 4 GIT_OUTPUT_BUILD)
|
|
|
|
# Special case: Tag contains prerelease
|
|
if(GIT_OUTPUT_PATCH MATCHES "([0-9]+)([a-zA-Z]+)([0-9]*)")
|
|
# Patch requires special parsing.
|
|
set(GIT_OUTPUT_PATCH "${CMAKE_MATCH_1}")
|
|
if(CMAKE_MATCH_3 GREATER 0)
|
|
set(GIT_OUTPUT_PRERELEASE "${CMAKE_MATCH_2}")
|
|
else()
|
|
set(GIT_OUTPUT_PRERELEASE "a")
|
|
endif()
|
|
MATH(EXPR GIT_OUTPUT_TWEAK "${GIT_OUTPUT_TWEAK} + ${CMAKE_MATCH_3}")
|
|
|
|
# Modify the global version
|
|
version(MODIFY _VERSION "${_VERSION}" COMPRESS
|
|
MAJOR "${GIT_OUTPUT_MAJOR}"
|
|
MINOR "${GIT_OUTPUT_MINOR}"
|
|
PATCH "${GIT_OUTPUT_PATCH}"
|
|
TWEAK "${GIT_OUTPUT_TWEAK}"
|
|
BUILD "${GIT_OUTPUT_BUILD}"
|
|
PRERELEASE "${GIT_OUTPUT_PRERELEASE}"
|
|
REQUIRE "PATCH;TWEAK"
|
|
)
|
|
else()
|
|
# Modify the global version
|
|
version(MODIFY _VERSION "${_VERSION}" COMPRESS
|
|
MAJOR "${GIT_OUTPUT_MAJOR}"
|
|
MINOR "${GIT_OUTPUT_MINOR}"
|
|
PATCH "${GIT_OUTPUT_PATCH}"
|
|
TWEAK "${GIT_OUTPUT_TWEAK}"
|
|
BUILD "${GIT_OUTPUT_BUILD}"
|
|
PRERELEASE "a"
|
|
REQUIRE "PATCH;TWEAK"
|
|
)
|
|
endif()
|
|
else()
|
|
execute_process(COMMAND "${GIT}" rev-list --count HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE GIT_RESULT OUTPUT_VARIABLE GIT_OUTPUT ERROR_VARIABLE GIT_ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
|
|
if((GIT_RESULT EQUAL 0) AND (NOT "${GIT_OUTPUT}" STREQUAL ""))
|
|
version(MODIFY _VERSION "${_VERSION}" COMPRESS
|
|
TWEAK "${GIT_OUTPUT}"
|
|
PRERELEASE "a"
|
|
REQUIRE "PATCH;TWEAK"
|
|
)
|
|
|
|
# Determine the build using git.
|
|
execute_process(COMMAND "${GIT}" log -1 "--pretty=format:g%h" --abbrev=8 HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE GIT_RESULT OUTPUT_VARIABLE GIT_OUTPUT ERROR_VARIABLE GIT_ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
|
|
if((GIT_RESULT EQUAL 0) AND (NOT "${GIT_OUTPUT}" STREQUAL ""))
|
|
version(MODIFY _VERSION "${_VERSION}" COMPRESS
|
|
BUILD "${GIT_OUTPUT}"
|
|
REQUIRE "PATCH;TWEAK"
|
|
)
|
|
else()
|
|
message(WARNING "Failed to detect build version with 'git'.")
|
|
endif()
|
|
else()
|
|
message(WARNING "Failed to automatically detect version with 'git'.")
|
|
endif()
|
|
endif()
|
|
else()
|
|
message(WARNING "'git' not found, automatic version detection disabled.")
|
|
endif()
|
|
else()
|
|
message(STATUS "Not a git repository, automatic version detection disabled.")
|
|
endif()
|
|
|
|
# Allow manual overrides of the detected version.
|
|
if(${PREFIX}VERSION)
|
|
version(PARSE _VERSION_CFG "${${PREFIX}VERSION}" REQUIRE "PATCH;TWEAK")
|
|
if("${_VERSION_CFG_BUILD}" STREQUAL "")
|
|
set(_VERSION_CFG_BUILD "${_VERSION_BUILD}")
|
|
endif()
|
|
version(GENERATE _VERSION COMPRESS
|
|
MAJOR "${_VERSION_CFG_MAJOR}"
|
|
MINOR "${_VERSION_CFG_MINOR}"
|
|
PATCH "${_VERSION_CFG_PATCH}"
|
|
TWEAK "${_VERSION_CFG_TWEAK}"
|
|
PRERELEASE "${_VERSION_CFG_PRERELEASE}"
|
|
BUILD "${_VERSION_CFG_BUILD}"
|
|
)
|
|
endif()
|
|
|
|
# Fix up missing parts of the Version
|
|
version(PARSE _VERSION "${_VERSION}" REQUIRE "PATCH;TWEAK")
|
|
|
|
set(_VERSION_THIN "${_VERSION_MAJOR}.${_VERSION_MINOR}.${_VERSION_PATCH}")
|
|
if(NOT (_VERSION_PRERELEASE STREQUAL ""))
|
|
set(_VERSION_THIN "${_VERSION_THIN}${_VERSION_PRERELEASE}${_VERSION_TWEAK}")
|
|
endif()
|
|
if(NOT (VERSION_COMMIT STREQUAL ""))
|
|
set(_VERSION_THIN "${_VERSION_THIN}-${_VERSION_BUILD}")
|
|
endif()
|
|
|
|
# Parse & Log the detected version.
|
|
message(STATUS "Version ${_VERSION_THIN}")
|
|
|
|
################################################################################
|
|
# Project
|
|
################################################################################
|
|
|
|
# Metadata
|
|
version(GENERATE PROJECT_VERSION
|
|
MAJOR "${_VERSION_MAJOR}"
|
|
MINOR "${_VERSION_MINOR}"
|
|
PATCH "${_VERSION_PATCH}"
|
|
TWEAK "${_VERSION_TWEAK}"
|
|
REQUIRE "PATCH;TWEAK"
|
|
)
|
|
project(
|
|
${PROJECT_NAME}
|
|
VERSION ${PROJECT_VERSION}
|
|
)
|
|
set(PROJECT_IDENTIFER "com.xaymar.BlitzLLVM")
|
|
set(PROJECT_TITLE "BlitzLLVM")
|
|
set(PROJECT_AUTHORS "See AUTHORS file")
|
|
set(PROJECT_COPYRIGHT "All Rights Reserved. See LICENSE file for more information")
|
|
set(PROJECT_TRADEMARKS "")
|
|
|
|
################################################################################
|
|
# Sub-projects
|
|
################################################################################
|
|
ADD_SUBDIRECTORY("code_compiler")
|