diff --git a/CMakeLists.txt b/CMakeLists.txt index bce40d9..205caa4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required (VERSION 3.8) # Main project -string(REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}) +string (REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}) project (${CURRENT_FOLDER}) message (STATUS "Configuring project: " ${CURRENT_FOLDER}) @@ -25,16 +25,21 @@ else () endif () # Define configuration type macros -add_compile_definitions ("BUILD_TYPE=${CMAKE_BUILD_TYPE}") if (CMAKE_BUILD_TYPE MATCHES "Debug") add_compile_definitions ("BUILD_DEBUG=1") + add_compile_definitions ("BUILD_TYPE=Debug") +elseif (CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo") + add_compile_definitions ("BUILD_DEVELOPMENT=1") + add_compile_definitions ("BUILD_TYPE=Development") elseif (CMAKE_BUILD_TYPE MATCHES "Release") add_compile_definitions ("BUILD_RELEASE=1") + add_compile_definitions ("BUILD_TYPE=Release") else () add_compile_definitions ("BUILD_UNKNOWN=1") + add_compile_definitions ("BUILD_TYPE=${CMAKE_BUILD_TYPE}") endif () -# Add subproject +# Add subproject file (GLOB PROJECT_FOLDERS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/*") foreach (PROJECT_SUBDIRECTORY ${PROJECT_FOLDERS}) if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_SUBDIRECTORY}") diff --git a/CMakeSettings.json b/CMakeSettings.json index 7438803..8c218af 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -11,6 +11,17 @@ "ctestCommandArgs": "", "inheritEnvironments": [ "msvc_x64_x64" ] }, + { + "name": "x64-Development", + "generator": "Ninja", + "configurationType": "RelWithDebInfo", + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64_x64" ] + }, { "name": "x64-Release", "generator": "Ninja", @@ -41,6 +52,25 @@ "remoteCopyBuildOutput": false, "remoteCopySourcesMethod": "rsync" }, + { + "name": "Linux-GCC-Development", + "generator": "Ninja", + "configurationType": "RelWithDebInfo", + "cmakeExecutable": "cmake", + "remoteCopySourcesExclusionList": [ ".vs", ".git", "out" ], + "cmakeCommandArgs": "-D CMAKE_C_COMPILER=gcc-11 -D CMAKE_CXX_COMPILER=g++-11", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "linux_x64" ], + "remoteMachineName": "${defaultRemoteMachineName}", + "remoteCMakeListsRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/src", + "remoteBuildRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/build/${name}", + "remoteInstallRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/install/${name}", + "remoteCopySources": true, + "rsyncCommandArgs": "-t --delete --delete-excluded", + "remoteCopyBuildOutput": false, + "remoteCopySourcesMethod": "rsync" + }, { "name": "Linux-GCC-Release", "generator": "Ninja", diff --git a/Redcraft.Utility/CMakeLists.txt b/Redcraft.Utility/CMakeLists.txt index 23edd6e..1abc984 100644 --- a/Redcraft.Utility/CMakeLists.txt +++ b/Redcraft.Utility/CMakeLists.txt @@ -1,19 +1,19 @@ cmake_minimum_required (VERSION 3.8) -# Set module name. -string(REGEX REPLACE ".*/(.*)" "\\1" MODULE_NAME ${CMAKE_CURRENT_SOURCE_DIR}) +# Set module name +string (REGEX REPLACE ".*/(.*)" "\\1" MODULE_NAME ${CMAKE_CURRENT_SOURCE_DIR}) message (STATUS "Configuring module: " ${MODULE_NAME}) -# Add target. +# Add target file (GLOB_RECURSE MODULE_SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/Source/*") add_library (${MODULE_NAME} ${MODULE_SOURCE_FILES}) target_compile_definitions (${MODULE_NAME} PRIVATE "MODULE_NAME=${MODULE_NAME}") -# Add include directories. +# Add include directories target_include_directories (${MODULE_NAME} PUBLIC "Source/Public") target_include_directories (${MODULE_NAME} PRIVATE "Source/Private") -# Define API macro. +# Define API macro string (TOUPPER ${MODULE_NAME} MODULE_API) string (REGEX REPLACE "[^A-Z ^0-1]" "" MODULE_API ${MODULE_API}) set (MODULE_API "${MODULE_API}_API") diff --git a/Redcraft.Utility/Source/Public/Miscellaneous/Platform.h b/Redcraft.Utility/Source/Public/Miscellaneous/Platform.h index 04f50ec..b675176 100644 --- a/Redcraft.Utility/Source/Public/Miscellaneous/Platform.h +++ b/Redcraft.Utility/Source/Public/Miscellaneous/Platform.h @@ -10,10 +10,10 @@ NAMESPACE_REDCRAFT_BEGIN NAMESPACE_MODULE_BEGIN(Redcraft) NAMESPACE_MODULE_BEGIN(Utility) -// Build information macro. +// Build information macro #ifndef PLATFORM_NAME -# error "PLATFORM_NAME must be defined" +# error "PLATFORM_NAME must be defined." #endif #ifndef PLATFORM_WINDOWS @@ -29,13 +29,17 @@ NAMESPACE_MODULE_BEGIN(Utility) #endif #ifndef BUILD_TYPE -# error "BUILD_TYPE must be defined" +# error "BUILD_TYPE must be defined." #endif #ifndef BUILD_DEBUG # define BUILD_DEBUG 0 #endif +#ifndef BUILD_DEVELOPMENT +# define BUILD_DEVELOPMENT 0 +#endif + #ifndef BUILD_RELEASE # define BUILD_RELEASE 0 #endif @@ -64,7 +68,7 @@ NAMESPACE_MODULE_BEGIN(Utility) # endif #endif -// Function type macros. +// Function type macros #if PLATFORM_WINDOWS @@ -86,7 +90,7 @@ NAMESPACE_MODULE_BEGIN(Utility) # if BUILD_DEBUG # define FORCEINLINE inline # else -# define FORCEINLINE inline __attribute__ ((always_inline)) +# define FORCEINLINE inline __attribute__((always_inline)) # endif #else @@ -100,40 +104,57 @@ NAMESPACE_MODULE_BEGIN(Utility) #endif -// DLL export and import definitions. +// DLL export and import macros #if PLATFORM_WINDOWS - # define DLLEXPORT __declspec(dllexport) # define DLLIMPORT __declspec(dllimport) - #elif PLATFORM_LINUX - # define DLLEXPORT __attribute__((visibility("default"))) # define DLLIMPORT __attribute__((visibility("default"))) - #else - -# define DLLEXPORT -# define DLLIMPORT - +# error "DLL export and import macros must be defined." #endif -// Unsigned base types. +// Optimization macros + +#if !defined(__clang__) +# define PRAGMA_DISABLE_OPTIMIZATION_ACTUAL _Pragma("optimize(\"\", off)") +# define PRAGMA_ENABLE_OPTIMIZATION_ACTUAL _Pragma("optimize(\"\", on)") +#elif defined(_MSC_VER) +# define PRAGMA_DISABLE_OPTIMIZATION_ACTUAL _Pragma("clang optimize off") +# define PRAGMA_ENABLE_OPTIMIZATION_ACTUAL _Pragma("clang optimize on") +#elif defined(__GNUC__ ) +# define PRAGMA_DISABLE_OPTIMIZATION_ACTUAL _Pragma("GCC push_options") _Pragma("GCC optimize (\"O0\")") +# define PRAGMA_ENABLE_OPTIMIZATION_ACTUAL _Pragma("GCC pop_options") +#else +# define PRAGMA_DISABLE_OPTIMIZATION_ACTUAL +# define PRAGMA_ENABLE_OPTIMIZATION_ACTUAL +#endif + +#if BUILD_DEBUG +# define PRAGMA_DISABLE_OPTIMIZATION +# define PRAGMA_ENABLE_OPTIMIZATION +#else +# define PRAGMA_DISABLE_OPTIMIZATION PRAGMA_DISABLE_OPTIMIZATION_ACTUAL +# define PRAGMA_ENABLE_OPTIMIZATION PRAGMA_ENABLE_OPTIMIZATION_ACTUAL +#endif + +// Unsigned base types typedef NAMESPACE_STD::uint8_t uint8; typedef NAMESPACE_STD::uint16_t uint16; typedef NAMESPACE_STD::uint32_t uint32; typedef NAMESPACE_STD::uint64_t uint64; -// Signed base types. +// Signed base types typedef NAMESPACE_STD::int8_t int8; typedef NAMESPACE_STD::int16_t int16; typedef NAMESPACE_STD::int32_t int32; typedef NAMESPACE_STD::int64_t int64; -// Character types. +// Character types typedef char chara; typedef wchar_t charw; @@ -142,7 +163,7 @@ typedef char8_t char8; typedef char16_t char16; typedef char32_t char32; -// Pointer types. +// Pointer types typedef NAMESPACE_STD::uintptr_t uintptr; typedef NAMESPACE_STD::intptr_t intptr; @@ -150,7 +171,7 @@ typedef NAMESPACE_STD::ptrdiff_t ptrdiff; typedef NAMESPACE_STD::size_t size_t; typedef intptr_t ssize_t; -// Null types. +// Null types typedef decltype(NULL) null_t; typedef NAMESPACE_STD::nullptr_t nullptr_t; @@ -161,7 +182,7 @@ typedef NAMESPACE_STD::nullptr_t nullptr_t; # define PLATFORM_TCHAR_IS_CHAR16 0 #endif -// Define the TEXT macro. +// Define the TEXT macro #if PLATFORM_TCHAR_IS_CHAR16 # define TEXT_PASTE(x) u ## x