30 Commits

Author SHA1 Message Date
1e44655a66 fixes 2025-12-15 21:26:59 -05:00
KJ16609
e4953b64ff Merge pull request #2 from KJNeko/detached2
Fixes c++26 issues and cleans up feature messages
2025-11-23 03:31:10 -05:00
5ffd23050e Fixes c++26 issues and cleans up feature messages 2025-11-23 03:30:09 -05:00
6ab0444bd3 Merge remote-tracking branch 'origin/master' 2025-11-22 09:44:04 -05:00
9ade0feebd Fix incorrect cxx26 checking 2025-11-17 04:40:22 -05:00
272b44be0a Adds feature check for c++26 2025-11-17 04:31:36 -05:00
fdfc8b62ec Implements c++ reflection check 2025-11-15 23:29:49 -05:00
2adae5a893 Adds logic for adding the git tag to defines 2025-11-08 22:35:24 -05:00
7cf4225fe4 Reduces debug executable size by stripping unused .data sections 2025-11-03 01:21:03 -05:00
0cbd75a558 Merge remote-tracking branch 'origin/detached' into HEAD 2025-10-23 14:57:35 -04:00
3618f2d71f Adds UBSAN flags to be enabled with FGL_ENABLE_UBSAN 2025-10-23 14:56:14 -04:00
472988f256 Adds git tag to git info 2025-10-18 13:41:23 -04:00
df2fe6201d Remove -fmodules-ts from compile flags 2025-10-02 17:54:51 -04:00
6c0d8bed38 Remove module handling from helpers 2025-07-15 19:59:42 -04:00
54beba2a0d Changes sources for libraries to be private 2025-07-13 21:37:36 -04:00
3fbb7690e8 cmake fixes 2025-07-13 21:23:26 -04:00
b8a561872b Fixes cmake functions for handling UI files, Also adds GitInfo to the executable through defines 2025-07-13 21:20:35 -04:00
e8bb87bb28 Adds missing include path to AddFGLLibrary 2025-07-07 08:10:08 -04:00
37280fb95c Remove debug messages from helper function 2025-07-01 00:17:27 -04:00
95aa4bc5d9 Add ${FGL_SHARED_FLAGS} to final flag configurations 2025-07-01 00:17:22 -04:00
4f09dda70a use CCache if it's present 2025-07-01 00:17:13 -04:00
9f5f2ab4c8 Remove cxx_modules flag again from targets 2025-06-26 16:33:38 -04:00
efd1d0d023 Merge remote-tracking branch 'origin/master' 2025-06-26 16:26:40 -04:00
6dd2e2e6a3 Some cleanup 2025-06-11 14:46:04 -04:00
d1d35e8cd6 Merge branch 'modules' 2025-06-11 14:45:08 -04:00
f435781f03 Add in module library helper function 2025-06-11 14:44:23 -04:00
cf145a41b5 Add in proper module support for projects in the future 2025-06-02 15:38:32 -04:00
2073a3e3b2 Descriptor cloning & copying 2025-06-01 19:52:06 -04:00
4f760aa88d Warning Fixes 2025-06-01 19:51:42 -04:00
99c684b26e Remove CXX_MODULES from target sources 2025-04-15 01:08:30 -04:00
10 changed files with 429 additions and 64 deletions

View File

@@ -1,6 +1,14 @@
include(compiler/features)
include(helpers) include(helpers)
include(git/commit)
# If ccache is present, enable it for better compiletimes
find_program(CCACHE_FOUND ccache)
if (CCACHE_FOUND AND FGL_USE_CCACHE)
message("== CCACHE found, Using it")
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
endif ()
if ((${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU") OR (${CMAKE_CXX_PLATFORM_ID} STREQUAL "MinGW")) if ((${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU") OR (${CMAKE_CXX_PLATFORM_ID} STREQUAL "MinGW"))
include(compiler/gcc) include(compiler/gcc)
@@ -23,7 +31,3 @@ elseif (UNIX)
else () else ()
message(DEBUG "Unknown Platform") message(DEBUG "Unknown Platform")
endif () endif ()
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/dependencies" ${CMAKE_MODULE_PATH})
message(DEBUG "Leaving ${CMAKE_CURRENT_LIST_FILE}")

View File

@@ -0,0 +1,2 @@
include(features/reflection)
include(features/c++26)

View File

@@ -5,13 +5,17 @@
endfunction() endfunction()
function(SetFGLFlags TARGET) function(SetFGLFlags TARGET)
GET_PROPERTY(FGL_FLAGS GLOBAL PROPERTY FGL_FLAGS) GET_PROPERTY(FGL_COMPILE_FLAGS GLOBAL PROPERTY FGL_COMPILE_FLAGS)
target_compile_options(${TARGET} PUBLIC ${FGL_FLAGS}) GET_PROPERTY(FGL_LINKS_FLAGS GLOBAL PROPERTY FGL_LINK_FLAGS)
message("Set target ${TARGET} to use flags\n${FGL_FLAGS}") target_compile_options(${TARGET} PRIVATE ${FGL_COMPILE_FLAGS})
message("Set target ${TARGET} to use flags\n${FGL_COMPILE_FLAGS}")
target_link_options(${TARGET} PRIVATE ${FGL_LINK_FLAGS})
endfunction() endfunction()
function(SetDependencyFlags TARGET) function(SetDependencyFlags TARGET)
GET_PROPERTY(FGL_CHILD_FLAGS GLOBAL PROPERTY FGL_CHILD_FLAGS) GET_PROPERTY(FGL_CHILD_FLAGS GLOBAL PROPERTY FGL_CHILD_FLAGS)
target_compile_options(${TARGET} PUBLIC ${FGL_CHILD_FLAGS}) GET_PROPERTY(FGL_LINKS_FLAGS GLOBAL PROPERTY FGL_LINK_FLAGS)
target_compile_options(${TARGET} PRIVATE ${FGL_CHILD_FLAGS})
message("Set dependency ${TARGET} to use flags\n${FGL_CHILD_FLAGS}") message("Set dependency ${TARGET} to use flags\n${FGL_CHILD_FLAGS}")
target_link_options(${TARGET} PRIVATE ${FGL_LINK_FLAGS})
endfunction() endfunction()

View File

@@ -103,6 +103,9 @@
AppendWarningFlag("-Wuse-after-free") #Warns about accessing a value after calling 'free' on it AppendWarningFlag("-Wuse-after-free") #Warns about accessing a value after calling 'free' on it
AppendWarningFlag("-Wuseless-cast") #Warns about a cast that is useless. AppendWarningFlag("-Wuseless-cast") #Warns about a cast that is useless.
AppendWarningFlag("-Wno-non-virtual-dtor")
AppendWarningFlag("-Wno-terminate") # Disables -Wterminate errors, These are kinda weird and I tend to use throw inside of dtors with the intent of it terminating after. So we'll just silence them.
# Starting other weird flags # Starting other weird flags
AppendWarningFlag("-fdiagnostics-show-template-tree") # Shows the template diagnostic info as a tree instead. AppendWarningFlag("-fdiagnostics-show-template-tree") # Shows the template diagnostic info as a tree instead.
@@ -112,30 +115,39 @@
string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_BUILD_TYPE) string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_BUILD_TYPE)
if (NOT DEFINED STATIC_ANAYLSIS) if (DEFINED FGL_ENABLE_UBSAN AND FGL_ENABLE_UBSAN EQUAL 1)
set(STATIC_ANYLSIS 1) list(APPEND FGL_CONFIG "-fsanitize=undefined,address,leak,alignment,bounds,vptr")
# list(APPEND FGL_CONFIG "-fsanitize-trap")
endif () endif ()
if (NOT DEFINED FGL_STATIC_ANALYSIS)
set(FGL_STATIC_ANALYSIS 0)
endif ()
# if (STATIC_ANALYSIS EQUAL 1 AND UPPER_BUILD_TYPE STREQUAL "DEBUG") if (DEFINED FGL_STATIC_ANALYSIS AND FGL_STATIC_ANALYSIS EQUAL 1)
# list(APPEND FGL_CONFIG "-fanalyzer") list(APPEND FGL_CONFIG "-fanalyzer")
# if (NOT DEFINED USE_WERROR OR NOT USE_WERROR)
# list(APPEND FGL_CONFIG "-Wanalyzer-too-complex") # list(APPEND FGL_CONFIG "-Wanalyzer-too-complex")
# endif () # Breaks more often then it is helpful
# elseif (NOT UPPER_BUILD_TYPE STREQUAL "DEBUG") list(APPEND FGL_CONFIG "-Wno-analyzer-use-of-uninitialized-value")
if (NOT UPPER_BUILD_TYPE STREQUAL "DEBUG") list(APPEND FGL_CONFIG "-Wno-analyzer-malloc-leak")
elseif (NOT UPPER_BUILD_TYPE STREQUAL "DEBUG")
list(APPEND FGL_CONFIG "-flto=auto") list(APPEND FGL_CONFIG "-flto=auto")
endif () endif ()
list(APPEND FGL_CONFIG "-ftree-vectorize") list(APPEND FGL_CONFIG "-ftree-vectorize")
list(APPEND FGL_CONFIG "-fmax-errors=6") list(APPEND FGL_CONFIG "-fmax-errors=2")
LIST(APPEND FGL_CONFIG "-fmodules-ts")
LIST(APPEND FGL_CONFIG "-std=c++23") if (HAS_CPP_REFLECTION)
list(APPEND FGL_CONFIG "-freflection")
endif ()
list(APPEND FGL_CONFIG "-fdata-sections")
list(APPEND FGL_CONFIG "-ffunction-sections")
#AppendWarningFlag("-fanalyzer") #AppendWarningFlag("-fanalyzer")
#AppendWarningFlag("-Wanalyzer-too-complex") #AppendWarningFlag("-Wanalyzer-too-complex")
if (DEFINED USE_WERROR AND USE_WERROR) if (DEFINED FGL_STRICT_WARNINGS AND FGL_STRICT_WARNINGS)
list(APPEND FGL_CONFIG "-Werror") list(APPEND FGL_CONFIG "-Werror")
endif () endif ()
@@ -154,31 +166,33 @@
list(APPEND FGL_SHARED_DEBUG "-gdwarf-4") list(APPEND FGL_SHARED_DEBUG "-gdwarf-4")
list(APPEND FGL_SHARED_DEBUG "-fvar-tracking-assignments") list(APPEND FGL_SHARED_DEBUG "-fvar-tracking-assignments")
# Optimization flags # Optimization flags
set(FGL_FINAL_FLAGS_RELEASE "-O2;-s;${FGL_GENERAL_OPTIMIZATION_FLAGS};${FGL_SHARED_OPTIMIZATION_FLAGS}") # System agonistc flags set(FGL_FINAL_FLAGS_RELEASE "-O2;-s;${FGL_GENERAL_OPTIMIZATION_FLAGS};${FGL_SHARED_OPTIMIZATION_FLAGS};${FGL_SHARED_FLAGS}") # System agonistc flags
set(FGL_FINAL_FLAGS_RELWITHDEBINFO "-O2;${FGL_GENERAL_OPTIMIZATION_FLAGS};${FGL_SHARED_OPTIMIZATION_FLAGS};${FGL_SHARED_DEBUG}") set(FGL_FINAL_FLAGS_RELWITHDEBINFO "-O2;${FGL_GENERAL_OPTIMIZATION_FLAGS};${FGL_SHARED_OPTIMIZATION_FLAGS};${FGL_SHARED_DEBUG};${FGL_SHARED_FLAGS}")
set(FGL_FINAL_FLAGS_DEBUG "-O0;-g;-fstrict-aliasing;-fno-omit-frame-pointer;-ftrapv;-fverbose-asm;-femit-class-debug-always;${FGL_SHARED_DEBUG}") # Debug flags set(FGL_FINAL_FLAGS_DEBUG "-O0;-g;-fstrict-aliasing;-fno-omit-frame-pointer;-ftrapv;-fverbose-asm;-femit-class-debug-always;${FGL_SHARED_DEBUG};${FGL_SHARED_FLAGS}") # Debug flags
set(FGL_FINAL_FLAGS_SYSTEM "-O2;-march=native;-fdeclone-ctor-dtor;-fgcse;-fgcse-las;-fgcse-sm;-ftree-loop-im;-fivopts;-ftree-loop-ivcanon;-fira-hoist-pressure;-fsched-pressure;-fsched-spec-load;-fipa-pta;-s;-ffat-lto-objects;-fno-enforce-eh-specs;-fstrict-enums;${FGL_SHARED_OPTIMIZATION_FLAGS}") # System specific flags. Probably not portable set(FGL_FINAL_FLAGS_SYSTEM "-O2;-march=native;-fdeclone-ctor-dtor;-fgcse;-fgcse-las;-fgcse-sm;-ftree-loop-im;-fivopts;-ftree-loop-ivcanon;-fira-hoist-pressure;-fsched-pressure;-fsched-spec-load;-fipa-pta;-s;-ffat-lto-objects;-fno-enforce-eh-specs;-fstrict-enums;${FGL_SHARED_OPTIMIZATION_FLAGS};${FGL_SHARED_FLAGS}") # System specific flags. Probably not portable
list(APPEND FGL_FLAGS ${FGL_CONFIG}) list(APPEND FGL_FLAGS ${FGL_CONFIG})
list(APPEND FGL_FLAGS ${FGL_FINAL_FLAGS_${UPPER_BUILD_TYPE}}) list(APPEND FGL_FLAGS ${FGL_FINAL_FLAGS_${UPPER_BUILD_TYPE}})
# list(APPEND FGL_FLAGS ${FGL_WARNINGS}) list(APPEND FGL_FLAGS ${FGL_WARNINGS})
list(APPEND FGL_CHILD_FLAGS ${FGL_FINAL_FLAGS_${UPPER_BUILD_TYPE}}) list(APPEND FGL_CHILD_FLAGS ${FGL_FINAL_FLAGS_${UPPER_BUILD_TYPE}})
# Final sets # Final sets
#set(FGL_FLAGS "${FGL_CONFIG};${FGL_FINAL_FLAGS_${UPPER_BUILD_TYPE}};${FGL_WARNINGS}") # Flags for our shit set(FGL_FLAGS "${FGL_CONFIG};${FGL_FINAL_FLAGS_${UPPER_BUILD_TYPE}};${FGL_WARNINGS}") # Flags for our shit
#set(FGL_FLAGS "${FGL_OPTIMIZATION_FLAGS_${UPPER_BUILD_TYPE}}" PARENT_SCOPE) set(FGL_FLAGS "${FGL_OPTIMIZATION_FLAGS_${UPPER_BUILD_TYPE}}" PARENT_SCOPE)
#set(FGL_CHILD_FLAGS "${FGL_FINAL_FLAGS_RELEASE}") # Child flags for adding optimization to anything we build ourselves but doesn't follow our standard set(FGL_CHILD_FLAGS "${FGL_FINAL_FLAGS_RELEASE}" PARENT_SCOPE) # Child flags for adding optimization to anything we build ourselves but doesn't follow our standard
# We use release flags since we really don't need to be using debug flags for anything not ours # We use release flags since we really don't need to be using debug flags for anything not ours
SET_PROPERTY(GLOBAL PROPERTY FGL_FLAGS ${FGL_FLAGS}) set(FGL_LINK_FLAGS "-Wl,--gcc-sections;-Wl,--print-gc-sections" PARENT_SCOPE)
SET_PROPERTY(GLOBAL PROPERTY FGL_CHILD_FLAGS ${FGL_CHILD_FLAGS})
set_property(GLOBAL PROPERTY FGL_COMPILE_FLAGS ${FGL_FLAGS})
set_property(GLOBAL PROPERTY FGL_LINK_FLAGS ${FGL_LINK_FLAGS})
set_property(GLOBAL PROPERTY FGL_CHILD_FLAGS ${FGL_CHILD_FLAGS})
message("-- FGL_FLAGS: ${FGL_FLAGS}") message("-- FGL_FLAGS: ${FGL_FLAGS}")
message("-- FGL_CHILD_FLAGS: ${FGL_CHILD_FLAGS}") message("-- FGL_CHILD_FLAGS: ${FGL_CHILD_FLAGS}")
endif () endif ()
endfunction() endfunction()

View File

@@ -0,0 +1,17 @@
include(CheckCXXSourceCompiles)
# Test actual compilation of C++26 code
set(CMAKE_REQUIRED_FLAGS "-std=c++26")
check_cxx_source_compiles("
struct A {
auto operator<=>(const A&) const = default; // C++20/26 feature
};
int main() { A a,b; return (a <=> b) == 0 ? 0 : 1; }
" HAS_CXX26)
set(CMAKE_REQUIRED_FLAGS "") # reset
if (HAS_CXX26)
message("-- C++26: ON")
else ()
message("-- C++26: OFF")
endif ()

View File

@@ -0,0 +1,14 @@
set(REFLECTION_SRC "${CMAKE_CURRENT_LIST_DIR}/reflection.cpp")
try_compile(HAS_CPP_REFLECTION
${CMAKE_BINARY_DIR} # build directory
${REFLECTION_SRC} # source file
CMAKE_FLAGS "-DCMAKE_CXX_STANDARD=26"
COMPILE_DEFINITIONS "-freflection"
)
if (HAS_CPP_REFLECTION)
message(STATUS "C++26 Reflection: ON")
else ()
message(STATUS "C++26 Reflection: OFF")
endif ()

View File

@@ -0,0 +1,57 @@
#include <meta>
using namespace std::meta;
template < typename E, bool B = is_enumerable_type( ^^E ) >
constexpr std::string_view enum_to_string( E e )
{
if constexpr ( B )
{
constexpr info Enums = reflect_constant_array( enumerators_of( ^^E ) );
template for ( constexpr info I : [:Enums:] ) if ( e == [:I:] ) return identifier_of( I );
}
return "<unnamed>";
}
template < typename E, bool B = is_enumerable_type( ^^E ) >
constexpr std::optional< E > string_to_enum( std::string_view s )
{
if constexpr ( B )
{
constexpr info Enums = reflect_constant_array( enumerators_of( ^^E ) );
template for ( constexpr info I : [:Enums:] ) if ( s == identifier_of( I ) ) return [:I:];
}
return std::nullopt;
}
consteval void test()
{
enum class Color : int;
static_assert( enum_to_string( Color { 0 } ) == "<unnamed>" );
static_assert( enum_to_string( Color { 3 } ) == "<unnamed>" );
enum class Color : int
{
Red,
Green,
Blue,
Yellow
};
static_assert( enum_to_string( Color::Red ) == "Red" );
static_assert( enum_to_string( Color::Green ) == "Green" );
static_assert( enum_to_string( Color::Blue ) == "Blue" );
static_assert( enum_to_string( Color::Yellow ) == "Yellow" );
static_assert( enum_to_string( Color { 0 } ) == "Red" );
static_assert( enum_to_string( Color { 3 } ) == "Yellow" );
static_assert( enum_to_string( Color { 4 } ) == "<unnamed>" );
static_assert( string_to_enum< Color >( "Red" ) == Color::Red );
static_assert( string_to_enum< Color >( "Green" ) == Color::Green );
static_assert( string_to_enum< Color >( "Blue" ) == Color::Blue );
static_assert( string_to_enum< Color >( "Yellow" ) == Color::Yellow );
static_assert( string_to_enum< Color >( "White" ) == std::nullopt );
}
int main()
{
test();
}

114
modules/git/commit.cmake Normal file
View File

@@ -0,0 +1,114 @@
function(getCommitHash OUTPUT_VARIABLE)
find_package(Git QUIET)
if (GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_HASH
ERROR_VARIABLE GIT_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
)
if (NOT GIT_ERROR)
set(${OUTPUT_VARIABLE} ${GIT_HASH} PARENT_SCOPE)
else ()
set(${OUTPUT_VARIABLE} "unknown" PARENT_SCOPE)
endif ()
else ()
set(${OUTPUT_VARIABLE} "unknown" PARENT_SCOPE)
endif ()
endfunction()
function(getBranchName OUTPUT_VARIABLE)
find_package(Git QUIET)
if (GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_BRANCH
ERROR_VARIABLE GIT_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
)
if (NOT GIT_ERROR)
set(${OUTPUT_VARIABLE} ${GIT_BRANCH} PARENT_SCOPE)
else ()
set(${OUTPUT_VARIABLE} "unknown" PARENT_SCOPE)
endif ()
else ()
set(${OUTPUT_VARIABLE} "unknown" PARENT_SCOPE)
endif ()
endfunction()
function(getGitTag OUTPUT_VARIABLE)
find_package(Git QUIET)
if (GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} describe --tags --always
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_TAG
ERROR_VARIABLE GIT_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
)
if (NOT GIT_ERROR)
set(${OUTPUT_VARIABLE} ${GIT_TAG} PARENT_SCOPE)
else ()
set(${OUTPUT_VARIABLE} "unknown" PARENT_SCOPE)
endif ()
else ()
set(${OUTPUT_VARIABLE} "unknown" PARENT_SCOPE)
endif ()
endfunction()
function(addGitCommitDefine TARGET)
getCommitHash(GIT_HASH)
target_compile_definitions(${TARGET} PRIVATE FGL_GIT_COMMIT="${GIT_HASH}")
endfunction()
function(addGitBranchDefine TARGET)
getBranchName(GIT_BRANCH)
target_compile_definitions(${TARGET} PRIVATE FGL_GIT_BRANCH="${GIT_BRANCH}")
endfunction()
function(getIsDirty OUTPUT_VARIABLE)
find_package(Git QUIET)
if (GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} status --porcelain
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_STATUS
ERROR_VARIABLE GIT_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
)
if (NOT GIT_ERROR)
if (GIT_STATUS)
set(${OUTPUT_VARIABLE} "1" PARENT_SCOPE)
else ()
set(${OUTPUT_VARIABLE} "0" PARENT_SCOPE)
endif ()
else ()
set(${OUTPUT_VARIABLE} "-1" PARENT_SCOPE)
endif ()
else ()
set(${OUTPUT_VARIABLE} "-1" PARENT_SCOPE)
endif ()
endfunction()
function(addGitDirtyDefine TARGET)
getIsDirty(GIT_DIRTY)
target_compile_definitions(${TARGET} PRIVATE FGL_GIT_DIRTY=${GIT_DIRTY})
target_compile_definitions(${TARGET} PRIVATE FGL_GIT_IS_DIRTY=1)
endfunction()
include(modules/git/tag.cmake)
function(AddGitInfo TARGET)
addGitCommitDefine(${TARGET})
addGitBranchDefine(${TARGET})
addGitDirtyDefine(${TARGET})
addGitTagDefine(${TARGET})
addGitUnsyncedDefine(${TARGET})
endfunction()

95
modules/git/tag.cmake Normal file
View File

@@ -0,0 +1,95 @@
function(getGitTagVersion)
execute_process(
COMMAND git describe --tags --abbrev=0
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_TAG_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
if (NOT GIT_TAG_VERSION)
set(GIT_TAG_VERSION "v0.0.0")
endif ()
string(REGEX MATCH "v?([0-9]+)\\.([0-9]+)\\.([0-9]+)" _ ${GIT_TAG_VERSION})
if (CMAKE_MATCH_1)
set(VERSION_MAJOR ${CMAKE_MATCH_1})
else ()
set(VERSION_MAJOR 0)
endif ()
if (CMAKE_MATCH_2)
set(VERSION_MINOR ${CMAKE_MATCH_2})
else ()
set(VERSION_MINOR 0)
endif ()
if (CMAKE_MATCH_3)
set(VERSION_PATCH ${CMAKE_MATCH_3})
else ()
set(VERSION_PATCH 0)
endif ()
set(GIT_TAG_VERSION ${GIT_TAG_VERSION} PARENT_SCOPE)
set(VERSION_MAJOR ${VERSION_MAJOR} PARENT_SCOPE)
set(VERSION_MINOR ${VERSION_MINOR} PARENT_SCOPE)
set(VERSION_PATCH ${VERSION_PATCH} PARENT_SCOPE)
endfunction()
function(setGitTagVersionDefines TARGET)
getGitTagVersion()
message("Adding version info to ${TARGET}")
target_compile_definitions(${TARGET} PUBLIC
${TARGET}_MAJOR_VERSION=${VERSION_MAJOR}
${TARGET}_MINOR_VERSION=${VERSION_MINOR}
${TARGET}_PATCH_VERSION=${VERSION_PATCH}
)
endfunction()
function(addGitTagDefine TARGET)
getGitTag(GIT_TAG)
setGitTagVersionDefines(${TARGET})
target_compile_definitions(${TARGET} PRIVATE FGL_GIT_TAG="${GIT_TAG}")
endfunction()
function(getIsUnsynced OUTPUT_VARIABLE)
find_package(Git QUIET)
if (GIT_FOUND)
# Get the commit hash of the latest tag
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-list -n 1 $ (${GIT_EXECUTABLE} describe --tags --abbrev=0)
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE TAG_COMMIT
ERROR_VARIABLE GIT_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
)
# Get the current commit hash
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE CURRENT_COMMIT
ERROR_VARIABLE GIT_ERROR2
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
)
if (NOT GIT_ERROR AND NOT GIT_ERROR2)
if (NOT "${CURRENT_COMMIT}" STREQUAL "${TAG_COMMIT}")
set(${OUTPUT_VARIABLE} "1" PARENT_SCOPE)
else ()
set(${OUTPUT_VARIABLE} "0" PARENT_SCOPE)
endif ()
else ()
set(${OUTPUT_VARIABLE} "-1" PARENT_SCOPE)
endif ()
else ()
set(${OUTPUT_VARIABLE} "-1" PARENT_SCOPE)
endif ()
endfunction()
function(addGitUnsyncedDefine TARGET)
getIsUnsynced(GIT_UNSYNCED)
target_compile_definitions(${TARGET} PRIVATE FGL_GIT_UNSYNCED=${GIT_UNSYNCED})
endfunction()

View File

@@ -12,59 +12,103 @@ function(PostSetup)
CompilerPostSetup() CompilerPostSetup()
endfunction() endfunction()
function(AddFGLExecutable NAME SRC_SOURCES_LOCATION)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
file(GLOB_RECURSE M_SOURCES CONFIGURE_DEPENDS function(ConfigureFGLTarget NAME SRC_DIR INCLUDE_DIR)
${SRC_SOURCES_LOCATION}/**.cppm) if (INCLUDE_DIR)
target_include_directories(${NAME} PUBLIC ${INCLUDE_DIR})
endif ()
file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS target_include_directories(${NAME} PRIVATE ${SRC_DIR})
${SRC_SOURCES_LOCATION}/**.cpp if (DEFINED FGL_STRICT_WARNINGS AND FGL_STRICT_WARNINGS)
${SRC_SOURCES_LOCATION}/**.hpp target_compile_definitions(${NAME} PUBLIC "-DFGL_STRICT_WARNINGS=1")
endif ()
if (CMAKE_CXX_STANDARD STREQUAL 26)
message("Setting target ${NAME} to c++26")
target_compile_features(${NAME} PUBLIC cxx_std_26)
else ()
message("Setting target ${NAME} to c++23")
target_compile_features(${NAME} PUBLIC cxx_std_23)
endif ()
endfunction()
function(SplitDebugSymbols NAME)
if (DEFINED FGL_STRIP_DEBUG AND FGL_STRIP_DEBUG)
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
add_custom_command(TARGET ${NAME} POST_BUILD
COMMAND ${CMAKE_OBJCOPY} --only-keep-debug $<TARGET_FILE:${NAME}> $<TARGET_FILE:${NAME}>.debug
COMMAND ${CMAKE_STRIP} --strip-debug --strip-unneeded $<TARGET_FILE:${NAME}>
COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink=$<TARGET_FILE:${NAME}>.debug $<TARGET_FILE:${NAME}>
COMMENT "Stripping symbols and creating ${NAME}.debug"
) )
endif ()
endif ()
endfunction()
message("Compiling ${NAME} WITH ${M_SOURCES} as modules") function(AddFGLExecutable NAME SRC_SOURCES_LOCATION)
file(GLOB_RECURSE CPP_SOURCES CONFIGURE_DEPENDS ${SRC_SOURCES_LOCATION}/**.cpp)
file(GLOB_RECURSE HPP_SOURCES CONFIGURE_DEPENDS ${SRC_SOURCES_LOCATION}/**.hpp)
file(GLOB_RECURSE UI_SOURCES CONFIGURE_DEPENDS ${SRC_SOURCES_LOCATION}/**.ui)
add_executable(${NAME}) add_executable(${NAME})
target_sources(${NAME} PUBLIC ${SOURCES}) target_sources(${NAME} PRIVATE ${CPP_SOURCES})
target_sources(${NAME} PUBLIC FILE_SET modules TYPE CXX_MODULES FILES ${M_SOURCES})
ConfigureFGLTarget(${NAME} ${SRC_SOURCES_LOCATION} "")
target_include_directories(${NAME} PRIVATE ${SRC_SOURCES_LOCATION})
set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set_target_properties(${NAME} PROPERTIES CXX_STANDARD 23) set_target_properties(${NAME} PROPERTIES CXX_STANDARD 23)
set_target_properties(${NAME} PROPERTIES CXX_STANDARD_REQUIRED ON) set_target_properties(${NAME} PROPERTIES CXX_STANDARD_REQUIRED ON)
SetFGLFlags(${NAME}) SetFGLFlags(${NAME})
AddGitInfo(${NAME})
target_compile_definitions(${NAME} PRIVATE FGL_BUILD_TYPE="${CMAKE_BUILD_TYPE}")
SplitDebugSymbols(${NAME})
endfunction() endfunction()
function(AddFGLLibrary NAME MODE SRC_SOURCES_LOCATION INCLUDE_SOURCES_LOCATION) function(AddFGLLibrary NAME MODE SRC_SOURCES_LOCATION INCLUDE_SOURCES_LOCATION)
file(GLOB_RECURSE CPP_SOURCES CONFIGURE_DEPENDS ${SRC_SOURCES_LOCATION}/**.cpp) file(GLOB_RECURSE CPP_SOURCES CONFIGURE_DEPENDS ${SRC_SOURCES_LOCATION}/**.cpp)
file(GLOB_RECURSE HPP_SOURCES CONFIGURE_DEPENDS ${SRC_SOURCES_LOCATION}/**.hpp) file(GLOB_RECURSE HPP_SOURCES CONFIGURE_DEPENDS ${SRC_SOURCES_LOCATION}/**.hpp)
message("Found {CPPM_SOURCES}")
file(GLOB_RECURSE INCLUDE_HPP_SOURCES CONFIGURE_DEPENDS ${INCLUDE_SOURCES_LOCATION}/**.hpp) file(GLOB_RECURSE INCLUDE_HPP_SOURCES CONFIGURE_DEPENDS ${INCLUDE_SOURCES_LOCATION}/**.hpp)
file(GLOB_RECURSE INCLUDE_CPPM_SOURCES CONFIGURE_DEPENDS ${INCLUDE_SOURCES_LOCATION}/**.cppm)
add_library(${NAME} ${MODE} ${CPP_SOURCES} ${HPP_SOURCES} ${INCLUDE_SOURCES_LOCATION})
add_library(${NAME} ${MODE})
target_sources(${NAME} PRIVATE ${CPP_SOURCES} ${HPP_SOURCES})
file(GLOB_RECURSE CPPM_SOURCES CONFIGURE_DEPENDS ${SRC_SOURCES_LOCATION}/**.cppm) ConfigureFGLTarget(${NAME} ${SRC_SOURCES_LOCATION} ${INCLUDE_SOURCES_LOCATION})
target_sources(${NAME} PUBLIC FILE_SET modules TYPE CXX_MODULES BASE_DIRS ${SRC_SOURCES_LOCATION} FILES ${CPPM_SOURCES})
target_compile_features(${NAME} PRIVATE cxx_std_23 INTERFACE cxx_std_20)
target_include_directories(${NAME} PUBLIC ${INCLUDE_SOURCES_LOCATION})
target_include_directories(${NAME} PRIVATE ${SRC_SOURCES_LOCATION})
set_target_properties(${NAME} PROPERTIES CXX_STANDARD 23)
set_target_properties(${NAME} PROPERTIES CXX_STANDARD_REQUIRED ON)
SetFGLFlags(${NAME}) SetFGLFlags(${NAME})
AddGitInfo(${NAME})
target_compile_definitions(${NAME} PRIVATE FGL_BUILD_TYPE="${CMAKE_BUILD_TYPE}")
if (NOT "${MODE}" STREQUAL "OBJECT")
SplitDebugSymbols(${NAME})
endif ()
endfunction()
function(AddFGLModule NAME SRC_SOURCES_LOCATION)
file(GLOB_RECURSE CPP_SOURCES CONFIGURE_DEPENDS ${SRC_SOURCES_LOCATION}/**.cpp)
file(GLOB_RECURSE HPP_SOURCES CONFIGURE_DEPENDS ${SRC_SOURCES_LOCATION}/**.hpp)
add_library(${NAME} MODULE ${CPP_SOURCES} ${HPP_SOURCES})
target_include_directories(${NAME} PRIVATE ${SRC_SOURCES_LOCATION})
SetFGLFlags(${NAME})
AddGitInfo(${NAME})
target_compile_definitions(${NAME} PRIVATE FGL_BUILD_TYPE="${CMAKE_BUILD_TYPE}")
ConfigureFGLTarget(${NAME} ${SRC_SOURCES_LOCATION} "")
SplitDebugSymbols(${NAME})
endfunction() endfunction()
function(AddFGLChildLibrary NAME MODE SRC_SOURCES_LOCATION INCLUDE_SOURCES_LOCATION) function(AddFGLChildLibrary NAME MODE SRC_SOURCES_LOCATION INCLUDE_SOURCES_LOCATION)
file(GLOB_RECURSE CPP_SOURCES ${SRC_SOURCES_LOCATION}/**.cpp) file(GLOB_RECURSE CPP_SOURCES CONFIGURE_DEPENDS ${SRC_SOURCES_LOCATION}/**.cpp)
file(GLOB_RECURSE HPP_SOURCES ${SRC_SOURCES_LOCATION}/**.hpp) file(GLOB_RECURSE HPP_SOURCES CONFIGURE_DEPENDS ${SRC_SOURCES_LOCATION}/**.hpp)
file(GLOB_RECURSE INCLUDE_HPP_SOURCES ${INCLUDE_SOURCES_LOCATION}/**.hpp) file(GLOB_RECURSE INCLUDE_HPP_SOURCES ${INCLUDE_SOURCES_LOCATION}/**.hpp)
add_library(${NAME} ${MODE} ${CPP_SOURCES} ${HPP_SOURCES} ${INCLUDE_SOURCES_LOCATION}) add_library(${NAME} ${MODE} ${CPP_SOURCES} ${HPP_SOURCES} ${INCLUDE_SOURCES_LOCATION})
target_include_directories(${NAME} PUBLIC ${INCLUDE_SOURCES_LOCATION}) target_include_directories(${NAME} PUBLIC ${INCLUDE_SOURCES_LOCATION})
target_include_directories(${NAME} PRIVATE ${SRC_SOURCES_LOCATION}) target_include_directories(${NAME} PRIVATE ${SRC_SOURCES_LOCATION})
# SetFGLFlags(${NAME}) ConfigureFGLTarget(${NAME} ${SRC_SOURCES_LOCATION} ${INCLUDE_SOURCES_LOCATION})
SplitDebugSymbols(${NAME})
endfunction() endfunction()