diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index a3c5419..228f452 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -18,6 +18,7 @@ jobs: strategy: matrix: build_type: ["Debug", "RelWithDebInfo", "Release"] + unity_build: ["ON", "OFF"] include: - build_type: Release conan_profile: ./ConanProfiles/clang @@ -28,7 +29,7 @@ jobs: - build_type: RelWithDebInfo conan_profile: ./ConanProfiles/clangd name: RelWithDebInfo (ASAN, LSAN, UBSAN) - name: "Build & Test ${{ matrix.name }}" + name: "Build & Test ${{ matrix.name }} (Unity Build: ${{ matrix.unity_build }})" steps: - name: Install Node.js run: apt-get update && apt-get install -y nodejs @@ -42,7 +43,7 @@ jobs: run: | conan profile detect conan install . --deployer=full_deploy --deployer-folder=build --remote=bigfootpackages -pr:h=${{ matrix.conan_profile }} -pr:b=${{ matrix.conan_profile }} --build=missing -s build_type=${{ matrix.build_type }} - cmake -S . -B ./build/${{ matrix.build_type }} --toolchain ./build/${{ matrix.build_type }}/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -G "Ninja" + cmake -S . -B ./build/${{ matrix.build_type }} --toolchain ./build/${{ matrix.build_type }}/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DCMAKE_UNITY_BUILD=${{ matrix.unity_build }} -G "Ninja" cmake --build build/${{ matrix.build_type }} --parallel $(nproc) - name: Unit Tests diff --git a/.gitea/workflows/sonarqube.yml b/.gitea/workflows/sonarqube.yml index c7530cb..3732faa 100644 --- a/.gitea/workflows/sonarqube.yml +++ b/.gitea/workflows/sonarqube.yml @@ -26,7 +26,7 @@ jobs: - name: Generate run: | conan profile detect - conan install . --deployer=full_deploy --deployer-folder=build --remote=bigfootpackages --build=missing -s build_type=Debug + conan install . --deployer=full_deploy --deployer-folder=build --remote=bigfootpackages -pr:h=./ConanProfiles/clang_coverage -pr:b=./ConanProfiles/clang_coverage --build=missing -s build_type=Debug cmake -S . -B ./build/Debug --toolchain ./build/Debug/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug -G "Ninja" cmake --build build/Debug --parallel $(nproc) diff --git a/Bin2CPP/Sources/Bin2CPPExe/CMakeLists.txt b/Bin2CPP/Sources/Bin2CPPExe/CMakeLists.txt index 630d0f2..e27c20a 100644 --- a/Bin2CPP/Sources/Bin2CPPExe/CMakeLists.txt +++ b/Bin2CPP/Sources/Bin2CPPExe/CMakeLists.txt @@ -2,7 +2,7 @@ get_filename_component(PackageName ${CMAKE_CURRENT_SOURCE_DIR} NAME) project(${PackageName}) add_executable(${PROJECT_NAME}) -set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE CXX) +target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Include) @@ -19,6 +19,7 @@ target_sources(${PROJECT_NAME} ${SOURCES} ) +target_link_libraries(${PROJECT_NAME} PRIVATE Bin2CPPCompileAndLinkFlags) target_link_libraries(${PROJECT_NAME} PUBLIC CLI11::CLI11 Bin2CPPLib) target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_DL_LIBS}) diff --git a/Bin2CPP/Sources/Bin2CPPLib/CMakeLists.txt b/Bin2CPP/Sources/Bin2CPPLib/CMakeLists.txt index 2facf7a..1da8ebe 100644 --- a/Bin2CPP/Sources/Bin2CPPLib/CMakeLists.txt +++ b/Bin2CPP/Sources/Bin2CPPLib/CMakeLists.txt @@ -2,7 +2,7 @@ get_filename_component(PackageName ${CMAKE_CURRENT_SOURCE_DIR} NAME) project(${PackageName}) add_library(${PROJECT_NAME} STATIC) -set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE CXX) +target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Include) @@ -20,6 +20,7 @@ target_sources(${PROJECT_NAME} ${SOURCES} ) +target_link_libraries(${PROJECT_NAME} PRIVATE Bin2CPPCompileAndLinkFlags) target_link_libraries(${PROJECT_NAME} PUBLIC EASTL::EASTL $,mimalloc-asan,mimalloc-static> diff --git a/Bin2CPP/Tests/Bin2CPPLib/CMakeLists.txt b/Bin2CPP/Tests/Bin2CPPLib/CMakeLists.txt index 9dbcad5..2475d5f 100644 --- a/Bin2CPP/Tests/Bin2CPPLib/CMakeLists.txt +++ b/Bin2CPP/Tests/Bin2CPPLib/CMakeLists.txt @@ -2,7 +2,7 @@ get_filename_component(PackageName ${CMAKE_CURRENT_SOURCE_DIR} NAME) project(${PackageName}Tests) add_executable(${PROJECT_NAME}) -set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE CXX) +target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Include) @@ -18,6 +18,7 @@ target_sources(${PROJECT_NAME} ${TEST_SOURCES} ) +target_link_libraries(${PROJECT_NAME} PRIVATE Bin2CPPCompileAndLinkFlags) target_link_libraries(${PROJECT_NAME} PRIVATE gtest::gtest Bin2CPPLib) include(GoogleTest) diff --git a/CMake/CustomTargets.cmake b/CMake/CustomTargets.cmake new file mode 100644 index 0000000..2f6a29c --- /dev/null +++ b/CMake/CustomTargets.cmake @@ -0,0 +1,32 @@ +foreach(CONFIG DEBUG RELWITHDEBINFO) + if("${CMAKE_EXE_LINKER_FLAGS_${CONFIG}}" MATCHES "/INCREMENTAL:NO") + string(REGEX REPLACE "/INCREMENTAL([^:]|$)" "" + CMAKE_EXE_LINKER_FLAGS_${CONFIG} + "${CMAKE_EXE_LINKER_FLAGS_${CONFIG}}") + endif() + if("${CMAKE_SHARED_LINKER_FLAGS_${CONFIG}}" MATCHES "/INCREMENTAL:NO") + string(REGEX REPLACE "/INCREMENTAL([^:]|$)" "" + CMAKE_SHARED_LINKER_FLAGS_${CONFIG} + "${CMAKE_SHARED_LINKER_FLAGS_${CONFIG}}") + endif() +endforeach() + +add_library(Bin2CPPCompileAndLinkFlags INTERFACE) + +target_compile_options(Bin2CPPCompileAndLinkFlags INTERFACE + $<$:/W4 /WX> + $<$:-Wall -Wextra -Wpedantic -Werror> + $<$,$>:-fprofile-instr-generate -fcoverage-mapping> +) + +target_link_options(Bin2CPPCompileAndLinkFlags INTERFACE + $<$,$>:-fprofile-instr-generate> +) + +target_compile_definitions(Bin2CPPCompileAndLinkFlags INTERFACE + $<$:BIN2CPP_OPTIMIZED> + $<$:BIN2CPP_NOT_OPTIMIZED> + $<$:BIN2CPP_WINDOWS> + $<$:BIN2CPP_LINUX> + $<$:NOMINMAX> + $<$:WIN32_LEAN_AND_MEAN>) \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index cf8572c..6041a4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,41 +4,22 @@ project(Bin2CPP VERSION 0.1.0 DESCRIPTION "Bin2CPP" LANGUAGES CXX) -set(CMAKE_CXX_STANDARD 20) -set(CMAKE_CXX_STANDARD_REQUIRED True) - set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + +include(${CMAKE_SOURCE_DIR}/CMake/CustomTargets.cmake) +include(${CMAKE_SOURCE_DIR}/CMake/FindDependencies.cmake) + set(CMAKE_CONFIGURATION_TYPES "Release;RelWithDebInfo;Debug" CACHE STRING "" FORCE) option(BUILD_TESTS OFF) option(ASAN OFF) - -include(${CMAKE_SOURCE_DIR}/CMake/FindDependencies.cmake) - -foreach(CONFIG DEBUG RELWITHDEBINFO) - if("${CMAKE_EXE_LINKER_FLAGS_${CONFIG}}" MATCHES "/INCREMENTAL:NO") - string(REGEX REPLACE "/INCREMENTAL([^:]|$)" "" - CMAKE_EXE_LINKER_FLAGS_${CONFIG} - "${CMAKE_EXE_LINKER_FLAGS_${CONFIG}}") - endif() -endforeach() +option(COVERAGE OFF) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_OPTIMIZE_DEPENDENCIES 1) -add_compile_options(${BIN2CPP_CXX_FLAGS}) -add_link_options(${BIN2CPP_EXE_LINK_FLAGS}) - -add_compile_definitions( - $<$:BIN2CPP_OPTIMIZED> - $<$:BIN2CPP_NOT_OPTIMIZED> - $<$:BIN2CPP_WINDOWS> - $<$:BIN2CPP_LINUX> - $<$:NOMINMAX> - $<$:WIN32_LEAN_AND_MEAN>) - if(BUILD_TESTS) enable_testing() endif() diff --git a/ConanProfiles/clang b/ConanProfiles/clang index e571591..86ec4bf 100644 --- a/ConanProfiles/clang +++ b/ConanProfiles/clang @@ -11,7 +11,6 @@ build_type=Release [conf] tools.cmake.cmaketoolchain:extra_variables={'CMAKE_CXX_COMPILER_LAUNCHER': 'ccache', 'CMAKE_C_COMPILER_LAUNCHER': 'ccache'} -tools.cmake.cmaketoolchain:extra_variables*={'BIN2CPP_CXX_FLAGS': {'value': '-Wall;-Wextra;-Wpedantic;-Werror', 'cache': True, 'type': 'STRING', 'docstring': 'CXX flags for Bin2CPP', 'force': True}} tools.system.package_manager:mode=install tools.system.package_manager:sudo=True diff --git a/ConanProfiles/clang_coverage b/ConanProfiles/clang_coverage index 81c685d..f536fd9 100644 --- a/ConanProfiles/clang_coverage +++ b/ConanProfiles/clang_coverage @@ -11,8 +11,6 @@ build_type=Debug [conf] tools.cmake.cmaketoolchain:extra_variables={'CMAKE_CXX_COMPILER_LAUNCHER': 'ccache', 'CMAKE_C_COMPILER_LAUNCHER': 'ccache'} -tools.cmake.cmaketoolchain:extra_variables*={'BIN2CPP_CXX_FLAGS': {'value': '-Wall;-Wextra;-Wpedantic;-Werror;-fprofile-instr-generate;-fcoverage-mapping', 'cache': True, 'type': 'STRING', 'docstring': 'CXX flags for Bin2CPP', 'force': True}} -tools.cmake.cmaketoolchain:extra_variables*={'BIN2CPP_EXE_LINK_FLAGS': {'value': '-fprofile-instr-generate', 'cache': True, 'type': 'STRING', 'docstring': 'EXE link flags for Bin2CPP', 'force': True}} tools.system.package_manager:mode=install tools.system.package_manager:sudo=True @@ -20,12 +18,13 @@ tools.system.package_manager:sudo=True tools.build:exelinkflags=["-fuse-ld=mold"] tools.build:sharedlinkflags=["-fuse-ld=mold"] -tools.build:compiler_executables={"c": "clang", "cpp": "clang++"} - tools.cmake.cmaketoolchain:generator=Ninja +tools.build:compiler_executables={"c": "clang", "cpp": "clang++"} + [tool_requires] !cmake/*: cmake/[>=4.2] [options] -Bin2CPP/*:build_tests=True \ No newline at end of file +Bin2CPP/*:build_tests=True +Bin2CPP/*:coverage=True diff --git a/ConanProfiles/clangd b/ConanProfiles/clangd index 5219090..9a8fc1e 100644 --- a/ConanProfiles/clangd +++ b/ConanProfiles/clangd @@ -11,14 +11,15 @@ build_type=Debug [conf] tools.cmake.cmaketoolchain:extra_variables={'CMAKE_CXX_COMPILER_LAUNCHER': 'ccache', 'CMAKE_C_COMPILER_LAUNCHER': 'ccache'} -tools.cmake.cmaketoolchain:extra_variables*={'BIN2CPP_CXX_FLAGS': {'value': '-Wall;-Wextra;-Wpedantic;-Werror;-fsanitize=address,undefined,leak;-fno-sanitize-recover=all', 'cache': True, 'type': 'STRING', 'docstring': 'CXX flags for Bin2CPP', 'force': True}} -tools.cmake.cmaketoolchain:extra_variables*={'BIN2CPP_EXE_LINK_FLAGS': {'value': '-fsanitize=address,undefined,leak', 'cache': True, 'type': 'STRING', 'docstring': 'EXE link flags for Bin2CPP', 'force': True}} tools.system.package_manager:mode=install tools.system.package_manager:sudo=True -tools.build:exelinkflags=["-fuse-ld=mold"] -tools.build:sharedlinkflags=["-fuse-ld=mold"] +tools.build:exelinkflags=["-fuse-ld=mold", "-fsanitize=address,undefined,leak"] +tools.build:sharedlinkflags=["-fuse-ld=mold", "-fsanitize=address,undefined,leak"] + +tools.build:cflags=["-fsanitize=address,undefined,leak", "-fno-sanitize-recover=all"] +tools.build:cxxflags=["-fsanitize=address,undefined,leak", "-fno-sanitize-recover=all"] tools.cmake.cmaketoolchain:generator=Ninja diff --git a/ConanProfiles/msvc b/ConanProfiles/msvc index 1cc7cdf..f462118 100644 --- a/ConanProfiles/msvc +++ b/ConanProfiles/msvc @@ -9,10 +9,10 @@ compiler.runtime=static build_type=Release [conf] -tools.cmake.cmaketoolchain:extra_variables={'BIN2CPP_CXX_FLAGS': {'value': '/W4;/WX;', 'cache': True, 'type': 'STRING', 'docstring': 'CXX flags for Bin2CPP', 'force': True}} tools.cmake.cmaketoolchain:user_toolchain+={{profile_dir}}/msvc_ccache.cmake tools.build:exelinkflags=["/LTCG", "/INCREMENTAL:NO"] +tools.build:sharedlinkflags=["/LTCG", "/INCREMENTAL:NO"] tools.build:cflags=["/Zc:preprocessor", "/Zc:__STDC__", "/D_CRT_DECLARE_NONSTDC_NAMES=1", "/GL"] tools.build:cxxflags=["/Zc:preprocessor", "/Zc:__cplusplus", "/Zc:enumTypes", "/Zc:templateScope", "/Zc:strictStrings", "/Zc:rvalueCast", "/Zc:hiddenFriend", "/Zc:externConstexpr", "/Zc:ternary", "/GL"] diff --git a/ConanProfiles/msvcd b/ConanProfiles/msvcd index b184b6a..aa385c6 100644 --- a/ConanProfiles/msvcd +++ b/ConanProfiles/msvcd @@ -9,10 +9,10 @@ compiler.runtime=static build_type=Debug [conf] -tools.cmake.cmaketoolchain:extra_variables={'BIN2CPP_CXX_FLAGS': {'value': '/W4;/WX', 'cache': True, 'type': 'STRING', 'docstring': 'CXX flags for Bin2CPP', 'force': True}} tools.cmake.cmaketoolchain:user_toolchain+={{profile_dir}}/msvc_ccache.cmake tools.build:exelinkflags=["/INCREMENTAL:NO"] +tools.build:sharedlinkflags=["/INCREMENTAL:NO"] tools.build:cflags=["/Zc:preprocessor", "/Zc:__STDC__", "/D_CRT_DECLARE_NONSTDC_NAMES=1", "/fsanitize=address"] tools.build:cxxflags=["/Zc:preprocessor", "/Zc:__cplusplus", "/Zc:enumTypes", "/Zc:templateScope", "/Zc:strictStrings", "/Zc:rvalueCast", "/Zc:hiddenFriend", "/Zc:externConstexpr", "/Zc:ternary", "/fsanitize=address"] diff --git a/conanfile.py b/conanfile.py index dee2351..a27c36c 100644 --- a/conanfile.py +++ b/conanfile.py @@ -20,13 +20,15 @@ class Bin2CPP(ConanFile): "shared": [True, False], "fPIC": [True, False], "build_tests": [True, False], - "asan": [True, False] + "asan": [True, False], + "coverage": [True, False] } default_options = { "shared": False, "fPIC": True, "build_tests": False, - "asan": False + "asan": False, + "coverage": False } generators = "CMakeDeps" @@ -58,6 +60,7 @@ class Bin2CPP(ConanFile): tc.variables["BUILD_TESTS"] = self.options.build_tests tc.variables["ASAN"] = self.options.asan + tc.variables["COVERAGE"] = self.options.coverage tc.generate()