diff --git a/.clang-format b/.clang-format deleted file mode 100644 index a061362..0000000 --- a/.clang-format +++ /dev/null @@ -1,16 +0,0 @@ -BasedOnStyle: LLVM -IndentWidth: 4 - -IncludeBlocks: Regroup -IncludeCategories: - - Regex: '^".*' - Priority: 1 - - Regex: '^<(safe)/.*' - Priority: 2 - - Regex: '^<(boost|catch2|fmt|gmock|gtest|rapidcheck)/.*' - Priority: 3 - - Regex: '<.*' - Priority: 4 - -QualifierAlignment: Custom -QualifierOrder: ['constexpr', 'static', 'inline', 'type', 'const', 'volatile'] diff --git a/.clang-tidy b/.clang-tidy deleted file mode 100644 index 7a4adf6..0000000 --- a/.clang-tidy +++ /dev/null @@ -1,39 +0,0 @@ ---- -Checks: > - boost-use-to-string, - bugprone-*, - -bugprone-easily-swappable-parameters, - clang-diagnostic-*, - clang-analyzer-*, - cppcoreguidelines-*, - -cppcoreguidelines-avoid-magic-numbers, - -cppcoreguidelines-avoid-non-const-global-variables, - -cppcoreguidelines-macro-usage, - -cppcoreguidelines-pro-bounds-pointer-arithmetic, - google-build-explicit-make-pair, - google-default-arguments, - google-explicit-constructor, - google-readability-casting, - google-runtime-int, - hicpp-signed-bitwise, - misc-misplaced-const, - misc-non-copyable-objects, - misc-redundant-expression, - misc-static-assert, - misc-throw-by-value-catch-by-reference, - misc-uniqueptr-reset-release, - modernize-*, - performance-*, - portability-*, - readability-*, - -readability-identifier-length, - -readability-identifier-naming, - -readability-magic-numbers, - -readability-named-parameter, - -readability-qualified-auto, - -readability-uppercase-literal-suffix -WarningsAsErrors: '*' -HeaderFilterRegex: '' -AnalyzeTemporaryDtors: false -FormatStyle: file -... diff --git a/.cmake-format.yaml b/.cmake-format.yaml deleted file mode 100644 index 4f94929..0000000 --- a/.cmake-format.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: - tab_size: 4 - line_width: 80 diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..bae789c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" # Location of package manifests + schedule: + interval: "daily" + - package-ecosystem: "gitsubmodule" + directory: "/" # Location of package manifests + schedule: + interval: "daily" diff --git a/.github/workflows/asciidoctor-ghpages.yml b/.github/workflows/asciidoctor-ghpages.yml index c977a2d..69fb619 100644 --- a/.github/workflows/asciidoctor-ghpages.yml +++ b/.github/workflows/asciidoctor-ghpages.yml @@ -1,44 +1,41 @@ -name: GitHub Pages Publish +name: Publish GitHub Pages on: workflow_dispatch: push: branches: [ main ] +env: + DEBIAN_FRONTEND: noninteractive + jobs: build: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - - name: Checkout Source - uses: actions/checkout@v3 + - name: Checkout source + uses: actions/checkout@v4 - - name: Install asciidoc + - name: Install asciidoctor run: | sudo apt update - DEBIAN_FRONTEND=noninteractive TZ=America/Los_Angeles sudo apt-get install -y git wget asciidoctor - sudo gem install asciidoctor-diagram + sudo apt install -y asciidoctor + sudo gem install asciidoctor asciidoctor-diagram rouge - - name: Build Documentation + - name: Build documentation run: | mkdir -p ./generated-html - asciidoctor -r asciidoctor-diagram doc/index.adoc -D ./generated-html - if [ -e doc/static ]; then cp -rf doc/static ./generated-html; fi + asciidoctor -r asciidoctor-diagram docs/index.adoc -D ./generated-html + if [ -e docs/static ]; then cp -rf docs/static ./generated-html; fi touch ./generated-html/.nojekyll ls -la ./generated-html cat ./generated-html/index.html - - name: Build Single Header - run: | - pushd include - python3 ../tools/gen_release_header.py safe.hpp > ../generated-html/safe.hpp - popd - - - name: Setup GH-Pages + - name: Setup github pages uses: actions/configure-pages@v3 - - name: Upload Artifacts to GH-Pages - uses: actions/upload-pages-artifact@v1 + - name: Upload artifacts + uses: actions/upload-pages-artifact@v2 with: path: ./generated-html @@ -54,9 +51,9 @@ jobs: name: github-pages url: $${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - - name: Deploy to GitHub Pages + - name: Deploy to github pages id: deployment - uses: actions/deploy-pages@v1 + uses: actions/deploy-pages@v2 diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index c4eaa03..2567281 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -11,6 +11,9 @@ on: env: DEBIAN_FRONTEND: noninteractive CMAKE_GENERATOR: Ninja + DEFAULT_CXX_STANDARD: 20 + DEFAULT_LLVM_VERSION: 16 + DEFAULT_GCC_VERSION: 12 concurrency: group: ${{ github.head_ref || github.run_id }} @@ -31,6 +34,7 @@ jobs: - compiler: clang cc: "clang" cxx: "clang++" + cxx_flags: "-stdlib=libstdc++" - version: 16 compiler: clang install: wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && sudo ./llvm.sh 16 @@ -39,6 +43,7 @@ jobs: compiler: clang stdlib: libc++ install: wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && sudo ./llvm.sh 16 && sudo apt install -y libc++-16-dev libc++abi-16-dev + cxx_flags: "-stdlib=libc++" - version: 15 compiler: clang install: sudo apt update && sudo apt install -y clang-15 @@ -47,6 +52,7 @@ jobs: compiler: clang stdlib: libc++ install: sudo apt update && sudo apt install -y clang-15 libc++-15-dev libc++abi-15-dev + cxx_flags: "-stdlib=libc++" - version: 14 compiler: clang install: sudo apt update && sudo apt install -y clang-14 @@ -55,18 +61,21 @@ jobs: compiler: clang stdlib: libc++ install: sudo apt update && sudo apt install -y clang-14 libc++-14-dev libc++abi-14-dev + cxx_flags: "-stdlib=libc++" + - compiler: gcc + toolchain_root: "/usr" + cxx_flags: "" - version: 13 compiler: gcc install: sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test && sudo apt update && sudo apt-get install -y gcc-13 g++-13 - toolchain_root: "/usr" cc: "gcc-13" cxx: "g++-13" - version: 12 compiler: gcc install: sudo apt update && sudo apt install -y gcc-12 - toolchain_root: "/usr" cc: "gcc-12" cxx: "g++-12" + cxx_flags: "" exclude: - compiler: gcc version: 16 @@ -82,7 +91,7 @@ jobs: stdlib: libc++ steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install build tools run: | @@ -93,9 +102,7 @@ jobs: env: CC: ${{matrix.toolchain_root}}/bin/${{matrix.cc}} CXX: ${{matrix.toolchain_root}}/bin/${{matrix.cxx}} - CXX_STANDARD: ${{matrix.cxx_standard}} - CXX_STDLIB: ${{matrix.stdlib}} - run: cmake -B ${{github.workspace}}/build -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/toolchains/${{matrix.compiler}}.cmake -DCMAKE_BUILD_TYPE=${{matrix.build_type}} + run: cmake -B ${{github.workspace}}/build -DCMAKE_CXX_STANDARD=${{matrix.cxx_standard}} -DCMAKE_CXX_FLAGS_INIT=${{matrix.cxx_flags}} -DCMAKE_BUILD_TYPE=${{matrix.build_type}} - name: Build Unit Tests run: cmake --build ${{github.workspace}}/build --config ${{matrix.build_type}} -v -t build_unit_tests @@ -107,12 +114,12 @@ jobs: quality_checks_pass: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install build tools run: | - wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && sudo ./llvm.sh 16 - sudo apt install -y ninja-build clang-tidy-16 clang-format-16 + wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && sudo ./llvm.sh ${{env.DEFAULT_LLVM_VERSION}} + sudo apt install -y ninja-build clang-tidy-${{env.DEFAULT_LLVM_VERSION}} clang-format-${{env.DEFAULT_LLVM_VERSION}} - name: Install cmake-format run: | @@ -121,10 +128,9 @@ jobs: - name: Configure CMake env: - CC: "/usr/lib/llvm-16/bin/clang" - CXX: "/usr/lib/llvm-16/bin/clang++" - CXX_STANDARD: 20 - run: cmake -B ${{github.workspace}}/build + CC: "/usr/lib/llvm-${{env.DEFAULT_LLVM_VERSION}}/bin/clang" + CXX: "/usr/lib/llvm-${{env.DEFAULT_LLVM_VERSION}}/bin/clang++" + run: cmake -B ${{github.workspace}}/build -DCMAKE_CXX_STANDARD=${{env.DEFAULT_CXX_STANDARD}} - name: Run quality checks run: cmake --build ${{github.workspace}}/build -t quality @@ -137,20 +143,19 @@ jobs: sanitizer: [undefined, address, thread] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install build tools run: | - wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && sudo ./llvm.sh 16 + wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && sudo ./llvm.sh ${{env.DEFAULT_LLVM_VERSION}} sudo apt install -y ninja-build - name: Configure CMake env: - CC: "/usr/lib/llvm-16/bin/clang" - CXX: "/usr/lib/llvm-16/bin/clang++" - CXX_STANDARD: 20 + CC: "/usr/lib/llvm-${{env.DEFAULT_LLVM_VERSION}}/bin/clang" + CXX: "/usr/lib/llvm-${{env.DEFAULT_LLVM_VERSION}}/bin/clang++" SANITIZERS: ${{matrix.sanitizer}} - run: cmake -B ${{github.workspace}}/build + run: cmake -B ${{github.workspace}}/build -DCMAKE_CXX_STANDARD=${{env.DEFAULT_CXX_STANDARD}} - name: Build Unit Tests run: cmake --build ${{github.workspace}}/build -t unit_tests @@ -158,17 +163,16 @@ jobs: valgrind: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install build tools run: sudo apt update && sudo apt install -y gcc-12 ninja-build valgrind - name: Configure CMake env: - CC: "/usr/bin/gcc-12" - CXX: "/usr/bin/g++-12" - CXX_STANDARD: 20 - run: cmake -B ${{github.workspace}}/build + CC: "/usr/bin/gcc-${{env.DEFAULT_GCC_VERSION}}" + CXX: "/usr/bin/g++-${{env.DEFAULT_GCC_VERSION}}" + run: cmake -B ${{github.workspace}}/build -DCMAKE_CXX_STANDARD=${{env.DEFAULT_CXX_STANDARD}} - name: Build Unit Tests run: cmake --build ${{github.workspace}}/build -t build_unit_tests diff --git a/.gitignore b/.gitignore index c4902c9..570978f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,12 @@ -.DS_Store -*.lst -*.orign -/Testing/ -/build/ +/build /cmake-build-* -.idea -.vscode -.cache +/venv +/.vscode +/.idea +/.cache +/.DS_Store +.clang-format +.clang-tidy +.cmake-format.yaml +CMakePresets.json +/toolchains diff --git a/CMakeLists.txt b/CMakeLists.txt index 99ad6c7..7e1754c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,16 +2,8 @@ cmake_minimum_required(VERSION 3.25) project(safe_arithmetic LANGUAGES CXX) -if(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR) - message( - FATAL_ERROR - "In-source builds are a bad idea. Please make a build directory instead." - ) -endif() - -include(cmake/dependencies.cmake) -include(cmake/libraries.cmake) -include(cmake/quality.cmake) +include(cmake/get_cpm.cmake) +cpmaddpackage("gh:intel/cicd-repo-infrastructure#main") add_versioned_package("gh:boostorg/mp11#boost-1.83.0") @@ -21,7 +13,7 @@ target_include_directories(safe_arithmetic INTERFACE include) target_link_libraries(safe_arithmetic INTERFACE boost_mp11) if(PROJECT_IS_TOP_LEVEL) - set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + add_docs(docs) clang_tidy_interface(safe_arithmetic) add_subdirectory(test) endif() diff --git a/CMakePresets.json b/CMakePresets.json deleted file mode 100644 index b892fc2..0000000 --- a/CMakePresets.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "version": 3, - "cmakeMinimumRequired": { - "major": 3, - "minor": 21, - "patch": 0 - }, - "configurePresets": [ - { - "name": "base", - "hidden": true, - "generator": "Ninja", - "binaryDir": "${sourceDir}/build" - }, - { - "name": "default", - "inherits": "base", - "description": "Build using Clang with libstdc++", - "toolchainFile": "${sourceDir}/toolchains/clang.cmake" - }, - { - "name": "clang", - "inherits": "default" - }, - { - "name": "clang-libstdc++", - "inherits": "default" - }, - { - "name": "clang-libc++", - "inherits": "default", - "description": "Build using Clang with libc++", - "environment": { - "CXX_STDLIB": "libc++" - } - }, - { - "name": "gcc", - "inherits": "base", - "description": "Build using GCC", - "toolchainFile": "${sourceDir}/toolchains/gcc.cmake" - } - ] -} diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake deleted file mode 100644 index 772103f..0000000 --- a/cmake/CPM.cmake +++ /dev/null @@ -1,21 +0,0 @@ -set(CPM_DOWNLOAD_VERSION 0.36.0) - -if(CPM_SOURCE_CACHE) - set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") -elseif(DEFINED ENV{CPM_SOURCE_CACHE}) - set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") -else() - set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake") -endif() - -# Expand relative path. This is important if the provided path contains a tilde (~) -get_filename_component(CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE) -if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION})) - message(STATUS "Downloading CPM.cmake to ${CPM_DOWNLOAD_LOCATION}") - file(DOWNLOAD - https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake - ${CPM_DOWNLOAD_LOCATION} - ) -endif() - -include(${CPM_DOWNLOAD_LOCATION}) diff --git a/cmake/clang-tidy.cmake b/cmake/clang-tidy.cmake deleted file mode 100644 index 3816f79..0000000 --- a/cmake/clang-tidy.cmake +++ /dev/null @@ -1,44 +0,0 @@ -set(CREATE_CLANG_TIDIABLE_SCRIPT - "${CMAKE_CURRENT_SOURCE_DIR}/cmake/create-clang-tidiable.sh" - CACHE STRING "") - -function(clang_tidy_header HEADER TARGET) - file(RELATIVE_PATH CT_NAME ${CMAKE_SOURCE_DIR} ${HEADER}) - string(REPLACE "/" "_" CT_NAME ${CT_NAME}) - get_filename_component(CT_NAME ${CT_NAME} NAME_WLE) - set(CT_NAME "clang-tidy_${CT_NAME}") - set(CPP_NAME - "${CMAKE_BINARY_DIR}/generated-sources/${TARGET}/${CT_NAME}.cpp") - - add_custom_command( - OUTPUT "${CPP_NAME}" - COMMAND ${CMAKE_COMMAND} -E make_directory - "${CMAKE_BINARY_DIR}/generated-sources/${TARGET}" - COMMAND "${CREATE_CLANG_TIDIABLE_SCRIPT}" ${CPP_NAME} ${HEADER} - DEPENDS ${HEADER} ${CMAKE_SOURCE_DIR}/.clang-tidy) - - add_library(${CT_NAME} EXCLUDE_FROM_ALL ${CPP_NAME}) - target_link_libraries(${CT_NAME} PRIVATE ${TARGET}) - set_target_properties( - ${CT_NAME} - PROPERTIES - CXX_CLANG_TIDY - "${CLANG_TIDY_PROGRAM};-p;${CMAKE_BINARY_DIR};-header-filter=${HEADER}" - ) - - add_dependencies(clang-tidy "${CT_NAME}") -endfunction() - -function(clang_tidy_interface TARGET) - get_target_property(DIRS ${TARGET} INTERFACE_INCLUDE_DIRECTORIES) - get_target_property(SYSTEM_DIRS ${TARGET} - INTERFACE_SYSTEM_INCLUDE_DIRECTORIES) - foreach(DIR ${DIRS}) - if(NOT DIR IN_LIST SYSTEM_DIRS) - file(GLOB_RECURSE HEADERS "${DIR}/*.hpp") - foreach(HEADER ${HEADERS}) - clang_tidy_header(${HEADER} ${TARGET}) - endforeach() - endif() - endforeach() -endfunction() diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake deleted file mode 100644 index e806720..0000000 --- a/cmake/dependencies.cmake +++ /dev/null @@ -1,182 +0,0 @@ -if(COMMAND add_versioned_package) - return() -endif() - -include(${CMAKE_CURRENT_LIST_DIR}/CPM.cmake) - -if(NOT DEFINED ENV{CPM_SOURCE_CACHE}) - message( - STATUS - "The environment variable \$CPM_SOURCE_CACHE is not defined: defining a CPM cache is recommended to avoid extra downloads." - ) -endif() - -function(check_version dep required comp) - foreach(present ${ARGN}) - string(REGEX MATCH "[0-9]+(\.[0-9]+)*" req ${required}) - string(REGEX MATCH "[0-9]+(\.[0-9]+)*" pre ${present}) - string(REPLACE ${req} " " req_leftover ${required}) - string(REPLACE ${pre} " " pre_leftover ${present}) - if(${req_leftover} STREQUAL ${pre_leftover}) - if(pre VERSION_${comp} req) - if(NOT pre VERSION_EQUAL req) - message( - STATUS - "Dependency: ${dep} required version ${version} (${comp}) is fulfilled by version ${present}." - ) - endif() - return() - endif() - endif() - endforeach() - message( - FATAL_ERROR - "Dependency error for ${dep}: ${version} (${comp}) not fulfilled by one of: ${ARGN}." - ) -endfunction() - -function(identify_git_tag dep tag) - execute_process( - COMMAND git tag -l ${tag} - WORKING_DIRECTORY ${${dep}_SOURCE_DIR} - OUTPUT_VARIABLE out_tag - OUTPUT_STRIP_TRAILING_WHITESPACE) - if(out_tag STREQUAL tag) - set(is_tag - 1 - PARENT_SCOPE) - endif() -endfunction() - -function(check_dependency_version dep version) - if(${dep}_SOURCE_DIR) - execute_process( - COMMAND git rev-parse --short HEAD - WORKING_DIRECTORY ${${dep}_SOURCE_DIR} - OUTPUT_VARIABLE head_hash - OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process( - COMMAND git tag -l --points-at ${head_hash} - WORKING_DIRECTORY ${${dep}_SOURCE_DIR} - OUTPUT_VARIABLE head_version - OUTPUT_STRIP_TRAILING_WHITESPACE) - if(head_version) - string(REPLACE "\n" ";" head_version ${head_version}) - endif() - - set(comp EQUAL) - if(${ARGC} GREATER 2) - set(comp ${ARGV2}) - endif() - - identify_git_tag(${dep} ${version}) - if(is_tag) - check_version(${dep} ${version} ${comp} ${head_version}) - else() - execute_process( - COMMAND git merge-base --is-ancestor ${version} ${head_hash} - WORKING_DIRECTORY ${${dep}_SOURCE_DIR} - RESULT_VARIABLE hash_ok) - if(hash_ok EQUAL 0) - if(NOT head_hash STREQUAL version) - message( - STATUS - "Dependency: ${dep} required version ${version} is fulfilled by version ${head_hash}." - ) - endif() - else() - if(head_version) - check_version(${dep} ${version} ${comp} ${head_version}) - else() - message( - FATAL_ERROR - "Dependency error for ${dep}: ${version} is not an ancestor of ${head_hash}." - ) - endif() - endif() - endif() - else() - message( - FATAL_ERROR - "Missing required dependency: ${dep} at version ${version}.") - endif() -endfunction() - -if(NOT DEPS_INDENT) - set(DEPS_INDENT - "${CMAKE_PROJECT_NAME}" - CACHE INTERNAL "") - set(DEPS_DEPTH - "" - CACHE INTERNAL "") -endif() - -option( - LOG_CPM_DEPENDENCIES - "Log CPM dependencies fetched with add_versioned_package to cpm_dependencies.txt" - ON) - -function(log_dependency_trail parent child depth) - if(LOG_CPM_DEPENDENCIES) - string(REPLACE "/" "_" parent_target ${parent}) - string(REPLACE "@" "_" parent_target ${parent_target}) - string(APPEND parent_target "_deps") - - set(DEPS_OUTPUT_FILE "${CMAKE_BINARY_DIR}/cpm_dependencies.txt") - if(NOT TARGET deps_file) - add_custom_target(deps_file) - file(WRITE ${DEPS_OUTPUT_FILE} "") - endif() - - if(NOT TARGET ${parent_target}) - add_custom_target(${parent_target}) - if(depth STREQUAL "") - file(APPEND ${DEPS_OUTPUT_FILE} "${depth}${parent}\n") - endif() - endif() - file(APPEND ${DEPS_OUTPUT_FILE} "${depth}└─ ${child}\n") - endif() -endfunction() - -function(add_versioned_package) - list(LENGTH ARGN argnLength) - if(argnLength EQUAL 1) - cpm_parse_add_package_single_arg("${ARGN}" ARGN) - endif() - - set(oneValueArgs NAME VERSION GITHUB_REPOSITORY GIT_TAG COMPARE) - cmake_parse_arguments(ARGS "" "${oneValueArgs}" "" "${ARGN}") - if(NOT DEFINED ARGS_GIT_TAG) - set(ARGS_GIT_TAG v${ARGS_VERSION}) - endif() - if(NOT DEFINED ARGS_COMPARE) - set(ARGS_COMPARE GREATER_EQUAL) - endif() - if(NOT DEFINED ARGS_NAME) - set(ARGS_NAME ${ARGS_GITHUB_REPOSITORY}) - endif() - - set(DEPS_PARENT_INDENT "${DEPS_INDENT}") - set(DEPS_INDENT "${ARGS_NAME}@${ARGS_GIT_TAG}") - log_dependency_trail(${DEPS_PARENT_INDENT} ${DEPS_INDENT} "${DEPS_DEPTH}") - string(APPEND DEPS_DEPTH " ") - cpmaddpackage("${ARGN}") - string(REGEX REPLACE "^(.*)...$" "\\1" DEPS_DEPTH ${DEPS_DEPTH}) - set(DEPS_INDENT "${DEPS_PARENT_INDENT}") - - check_dependency_version(${CPM_LAST_PACKAGE_NAME} ${ARGS_GIT_TAG} - ${ARGS_COMPARE}) - - set(CPM_LAST_PACKAGE_NAME - ${CPM_LAST_PACKAGE_NAME} - PARENT_SCOPE) - set(${CPM_LAST_PACKAGE_NAME}_SOURCE_DIR - ${${CPM_LAST_PACKAGE_NAME}_SOURCE_DIR} - PARENT_SCOPE) - set(${CPM_LAST_PACKAGE_NAME}_BINARY_DIR - ${${CPM_LAST_PACKAGE_NAME}_BINARY_DIR} - PARENT_SCOPE) - set(${CPM_LAST_PACKAGE_NAME}_ADDED - ${${CPM_LAST_PACKAGE_NAME}_ADDED} - PARENT_SCOPE) -endfunction() diff --git a/cmake/get_cpm.cmake b/cmake/get_cpm.cmake new file mode 100644 index 0000000..4b28edb --- /dev/null +++ b/cmake/get_cpm.cmake @@ -0,0 +1,37 @@ +set(CPM_DOWNLOAD_VERSION 0.38.2) + +if(CPM_SOURCE_CACHE) + set(CPM_DOWNLOAD_LOCATION + "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +elseif(DEFINED ENV{CPM_SOURCE_CACHE}) + set(CPM_DOWNLOAD_LOCATION + "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +else() + set(CPM_DOWNLOAD_LOCATION + "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +endif() + +# Expand relative path. This is important if the provided path contains a tilde +# (~) +get_filename_component(CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE) + +function(download_cpm) + message(STATUS "Downloading CPM.cmake to ${CPM_DOWNLOAD_LOCATION}") + file( + DOWNLOAD + https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake + ${CPM_DOWNLOAD_LOCATION}) +endfunction() + +if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION})) + download_cpm() +else() + # resume download if it previously failed + file(READ ${CPM_DOWNLOAD_LOCATION} check) + if("${check}" STREQUAL "") + download_cpm() + endif() + unset(check) +endif() + +include(${CPM_DOWNLOAD_LOCATION}) diff --git a/cmake/libraries.cmake b/cmake/libraries.cmake deleted file mode 100644 index 16f7e3d..0000000 --- a/cmake/libraries.cmake +++ /dev/null @@ -1,33 +0,0 @@ -if(COMMAND target_link_libraries_system) - return() -endif() - -function(target_link_library_includes target scope) - set(libs ${ARGN}) - foreach(lib ${libs}) - get_target_property(lib_include_dirs ${lib} - INTERFACE_INCLUDE_DIRECTORIES) - if(lib_include_dirs) - target_include_directories(${target} SYSTEM ${scope} - ${lib_include_dirs}) - else() - get_target_property(sublibs ${lib} INTERFACE_LINK_LIBRARIES) - target_link_library_includes(${target} ${scope} ${sublibs}) - endif() - endforeach() -endfunction() - -function(target_link_libraries_system target) - set(options PRIVATE PUBLIC INTERFACE) - cmake_parse_arguments(TLLS "${options}" "" "" ${ARGN}) - set(scope PRIVATE) - foreach(op ${options}) - if(TLLS_${op}) - set(scope ${op}) - endif() - endforeach() - set(libs ${TLLS_UNPARSED_ARGUMENTS}) - - target_link_library_includes(${target} ${scope} ${libs}) - target_link_libraries(${target} ${scope} ${libs}) -endfunction() diff --git a/cmake/quality.cmake b/cmake/quality.cmake deleted file mode 100644 index 13b005d..0000000 --- a/cmake/quality.cmake +++ /dev/null @@ -1,52 +0,0 @@ -if(COMMAND clang_tidy_interface) - return() -endif() - -function(clang_tidy_interface TARGET) - message( - STATUS - "clang_tidy_interface(${TARGET}) is disabled because CMAKE_CXX_COMPILER_ID is ${CMAKE_CXX_COMPILER_ID}." - ) -endfunction() - -if(PROJECT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) - get_filename_component(CT_ROOT ${CMAKE_CXX_COMPILER} DIRECTORY) - find_program(CLANG_FORMAT_PROGRAM "clang-format" HINTS ${CT_ROOT}) - if(CLANG_FORMAT_PROGRAM) - message(STATUS "clang-format found: ${CLANG_FORMAT_PROGRAM}") - endif() - - include(${CMAKE_CURRENT_LIST_DIR}/sanitizers.cmake) - include(${CMAKE_CURRENT_LIST_DIR}/test.cmake) - include(${CMAKE_CURRENT_LIST_DIR}/warnings.cmake) - - add_versioned_package( - NAME - Format.cmake - VERSION - 1.7.3 - GITHUB_REPOSITORY - TheLartians/Format.cmake - OPTIONS - "CMAKE_FORMAT_EXCLUDE cmake/CPM.cmake") - - add_custom_target(quality) - add_dependencies(quality check-clang-format check-cmake-format) - - if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - find_program(CLANG_TIDY_PROGRAM "clang-tidy" HINTS ${CT_ROOT}) - if(CLANG_TIDY_PROGRAM) - message(STATUS "clang-tidy found: ${CLANG_TIDY_PROGRAM}") - add_custom_target(clang-tidy) - include(${CMAKE_CURRENT_LIST_DIR}/clang-tidy.cmake) - else() - message(STATUS "clang-tidy not found. Adding dummy target.") - set(CLANG_TIDY_NOT_FOUND_COMMAND_ARGS - COMMAND ${CMAKE_COMMAND} -E echo - "Cannot run clang-tidy because clang-tidy not found." COMMAND - ${CMAKE_COMMAND} -E false) - add_custom_target(clang-tidy ${CLANG_TIDY_NOT_FOUND_COMMAND_ARGS}) - endif() - add_dependencies(quality clang-tidy) - endif() -endif() diff --git a/cmake/sanitizers.cmake b/cmake/sanitizers.cmake deleted file mode 100644 index c6d3463..0000000 --- a/cmake/sanitizers.cmake +++ /dev/null @@ -1,26 +0,0 @@ -add_library(sanitizers INTERFACE) - -if(DEFINED ENV{SANITIZERS}) - set(SANITIZERS $ENV{SANITIZERS}) -endif() - -if(SANITIZERS) - target_compile_options( - sanitizers - INTERFACE -g -fno-omit-frame-pointer -fno-optimize-sibling-calls - -fsanitize=${SANITIZERS} -fno-sanitize-recover=${SANITIZERS}) - - string(REGEX MATCH "memory" SANITIZER_MEMORY "${SANITIZERS}") - if(SANITIZER_MEMORY) - target_compile_options(sanitizers - INTERFACE -fsanitize-memory-track-origins) - endif() - - string(REGEX MATCH "address|memory|thread" SANITIZER_NEW_DEL - "${SANITIZERS}") - if(SANITIZER_NEW_DEL) - target_compile_definitions(sanitizers INTERFACE SANITIZER_NEW_DEL) - endif() - - target_link_options(sanitizers INTERFACE -fsanitize=${SANITIZERS}) -endif() diff --git a/cmake/test.cmake b/cmake/test.cmake deleted file mode 100644 index bf6fa8d..0000000 --- a/cmake/test.cmake +++ /dev/null @@ -1,225 +0,0 @@ -option(BUILD_TESTING "" OFF) -include(CTest) -add_custom_target(unit_tests) -add_custom_target(build_unit_tests) -set(CMAKE_TESTING_ENABLED - 1 - CACHE INTERNAL "") - -find_program(MEMORYCHECK_COMMAND NAMES valgrind) -set(MEMORYCHECK_SUPPRESSIONS_FILE - "${CMAKE_CURRENT_LIST_DIR}/default.supp" - CACHE FILEPATH "File that contains suppressions for the memory checker") -configure_file(${CMAKE_ROOT}/Modules/DartConfiguration.tcl.in - ${PROJECT_BINARY_DIR}/DartConfiguration.tcl) - -if(DEFINED ENV{CXX_STANDARD}) - set(CMAKE_CXX_STANDARD $ENV{CXX_STANDARD}) -else() - set(CMAKE_CXX_STANDARD 17) -endif() - -macro(get_catch2) - if(NOT TARGET Catch2::Catch2WithMain) - add_versioned_package("gh:catchorg/Catch2@3.4.0") - list(APPEND CMAKE_MODULE_PATH ${Catch2_SOURCE_DIR}/extras) - include(Catch) - endif() -endmacro() - -macro(get_gtest) - if(NOT TARGET gtest) - add_versioned_package("gh:google/googletest@1.14.0") - include(GoogleTest) - endif() -endmacro() - -macro(get_gunit) - get_gtest() - if(NOT DEFINED gunit_SOURCE_DIR) - add_versioned_package( - NAME - gunit - GIT_TAG - d02ec96 - GITHUB_REPOSITORY - cpp-testing/GUnit - DOWNLOAD_ONLY - YES) - endif() -endmacro() - -macro(add_boost_di) - if(NOT TARGET Boost.DI) - add_versioned_package("gh:boost-ext/di#9866a4a") - endif() -endmacro() - -macro(add_gherkin) - if(NOT TARGET gherkin-cpp) - add_subdirectory( - ${gunit_SOURCE_DIR}/libs/gherkin-cpp - ${gunit_BINARY_DIR}/libs/gherkin-cpp EXCLUDE_FROM_ALL SYSTEM) - endif() -endmacro() - -macro(add_rapidcheck) - if(NOT TARGET rapidcheck) - add_versioned_package(NAME rapidcheck GIT_TAG a5724ea GITHUB_REPOSITORY - emil-e/rapidcheck) - add_subdirectory( - ${rapidcheck_SOURCE_DIR}/extras/catch - ${rapidcheck_BINARY_DIR}/extras/catch EXCLUDE_FROM_ALL SYSTEM) - add_subdirectory( - ${rapidcheck_SOURCE_DIR}/extras/gtest - ${rapidcheck_BINARY_DIR}/extras/gtest EXCLUDE_FROM_ALL SYSTEM) - add_subdirectory( - ${rapidcheck_SOURCE_DIR}/extras/gmock - ${rapidcheck_BINARY_DIR}/extras/gmock EXCLUDE_FROM_ALL SYSTEM) - endif() -endmacro() - -function(add_unit_test_target name) - set(options CATCH2 GTEST GUNIT) - set(multiValueArgs FILES INCLUDE_DIRECTORIES LIBRARIES SYSTEM_LIBRARIES) - cmake_parse_arguments(UNIT "${options}" "" "${multiValueArgs}" ${ARGN}) - - add_executable(${name} ${UNIT_FILES}) - target_include_directories(${name} PRIVATE ${UNIT_INCLUDE_DIRECTORIES}) - target_link_libraries(${name} PRIVATE ${UNIT_LIBRARIES}) - target_link_libraries_system(${name} PRIVATE ${UNIT_SYSTEM_LIBRARIES}) - target_link_libraries(${name} PRIVATE sanitizers) - add_dependencies(build_unit_tests ${name}) - - if(UNIT_CATCH2) - catch_discover_tests(${name}) - target_link_libraries_system(${name} PRIVATE Catch2::Catch2WithMain - rapidcheck rapidcheck_catch) - set(target_test_command $ "--order" "rand") - elseif(UNIT_GTEST) - gtest_discover_tests(${name}) - target_link_libraries_system( - ${name} - PRIVATE - gmock - gtest - gmock_main - rapidcheck - rapidcheck_gtest - rapidcheck_gmock) - set(target_test_command $ "--gtest_shuffle") - elseif(UNIT_GUNIT) - target_include_directories( - ${name} SYSTEM - PRIVATE ${gunit_SOURCE_DIR}/include - ${gunit_SOURCE_DIR}/libs/json/single_include/nlohmann) - target_link_libraries_system( - ${name} - PRIVATE - gtest_main - gmock_main - Boost.DI - rapidcheck - rapidcheck_gtest - rapidcheck_gmock) - set(target_test_command $ "--gtest_shuffle") - add_test(NAME ${name} COMMAND ${target_test_command}) - else() - set(target_test_command $) - add_test(NAME ${name} COMMAND ${target_test_command}) - endif() - - add_custom_target(all_${name} ALL DEPENDS run_${name}) - add_custom_target(run_${name} DEPENDS ${name}.passed) - add_custom_command( - OUTPUT ${name}.passed - COMMAND ${target_test_command} - COMMAND ${CMAKE_COMMAND} "-E" "touch" "${name}.passed" - DEPENDS ${name}) - - add_dependencies(unit_tests "run_${name}") -endfunction() - -function(detect_test_framework) - set(options CATCH2 GTEST GUNIT) - cmake_parse_arguments(TF "${options}" "" "" ${ARGN}) - if(TF_CATCH) - return(PROPAGATE TF_CATCH) - elseif(TF_GTEST) - return(PROPAGATE TF_GTEST) - elseif(TF_GUNIT) - return(PROPAGATE TF_GUNIT) - endif() -endfunction() - -macro(add_unit_test) - detect_test_framework(${ARGN}) - if(TF_CATCH) - get_catch2() - add_rapidcheck() - unset(TF_CATCH) - elseif(TF_GTEST) - get_gtest() - add_rapidcheck() - unset(TF_GTEST) - elseif(TF_GUNIT) - get_gunit() - add_boost_di() - add_rapidcheck() - unset(TF_GUNIT) - endif() - add_unit_test_target(${ARGN}) -endmacro() - -function(add_feature_test_target name) - set(singleValueArgs FEATURE) - set(multiValueArgs FILES INCLUDE_DIRECTORIES LIBRARIES SYSTEM_LIBRARIES) - cmake_parse_arguments(FEAT "${options}" "${singleValueArgs}" - "${multiValueArgs}" ${ARGN}) - - add_executable(${name} ${FEAT_FILES}) - target_include_directories(${name} PRIVATE ${FEAT_INCLUDE_DIRECTORIES}) - target_link_libraries(${name} PRIVATE ${FEAT_LIBRARIES}) - target_link_libraries_system(${name} PRIVATE ${FEAT_SYSTEM_LIBRARIES}) - target_link_libraries(${name} PRIVATE sanitizers) - add_dependencies(build_unit_tests ${name}) - - target_include_directories( - ${name} SYSTEM - PRIVATE ${gunit_SOURCE_DIR}/include - ${gunit_SOURCE_DIR}/libs/json/single_include/nlohmann - ${rapidcheck_SOURCE_DIR}/extras/gmock/include) - target_link_libraries_system( - ${name} - PRIVATE - gtest_main - gmock_main - gherkin-cpp - Boost.DI - rapidcheck - rapidcheck_gtest - rapidcheck_gmock) - set(target_test_command $ "--gtest_shuffle") - - add_custom_target(all_${name} ALL DEPENDS run_${name}) - add_custom_target(run_${name} DEPENDS ${name}.passed ${FEAT_FEATURE}) - get_filename_component(FEATURE_FILE ${FEAT_FEATURE} ABSOLUTE) - add_custom_command( - OUTPUT ${name}.passed - COMMAND ${CMAKE_COMMAND} -E env SCENARIO="${FEATURE_FILE}" - ${target_test_command} - COMMAND ${CMAKE_COMMAND} "-E" "touch" "${name}.passed" - DEPENDS ${name}) - - add_test(NAME ${name} COMMAND ${target_test_command}) - set_property(TEST ${name} PROPERTY ENVIRONMENT "SCENARIO=${FEATURE_FILE}") - add_dependencies(unit_tests "run_${name}") -endfunction() - -macro(add_feature_test) - get_gunit() - add_gherkin() - add_boost_di() - add_rapidcheck() - add_feature_test_target(${ARGN}) -endmacro() diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake deleted file mode 100644 index 651e8d1..0000000 --- a/cmake/warnings.cmake +++ /dev/null @@ -1,37 +0,0 @@ -add_library(warnings INTERFACE) - -target_compile_options( - warnings - INTERFACE - # warnings turned on - -Wall - $<$:-Warray-bounds-pointer-arithmetic> - -Wcast-align - -Wconversion - -Wdouble-promotion - $<$:-Wduplicated-branches> - $<$:-Wduplicated-cond> - -Werror - -Wextra - -Wextra-semi - $<$,$>:-Wextra-semi-stmt> - -Wfatal-errors - -Wformat=2 - $<$:-Wgcc-compat> - $<$:-Wheader-hygiene> - $<$:-Widiomatic-parentheses> - $<$:-Wimplicit> - $<$:-Wlogical-op> - $<$:-Wnewline-eof> - -Wold-style-cast - -Woverloaded-virtual - $<$:-Wpedantic> - -Wshadow - $<$:-Wuseless-cast> - -Wunused - $<$:-Wmissing-prototypes> - # other compilation flags - $<$:-ferror-limit=8> - $<$:-fmax-errors=8> - -ftemplate-backtrace-limit=0 - $<$:-fdiagnostics-color>) diff --git a/doc/api_reference.adoc b/docs/api_reference.adoc similarity index 100% rename from doc/api_reference.adoc rename to docs/api_reference.adoc diff --git a/doc/big_integer.adoc b/docs/big_integer.adoc similarity index 100% rename from doc/big_integer.adoc rename to docs/big_integer.adoc diff --git a/doc/index.adoc b/docs/index.adoc similarity index 100% rename from doc/index.adoc rename to docs/index.adoc diff --git a/doc/motivation.adoc b/docs/motivation.adoc similarity index 100% rename from doc/motivation.adoc rename to docs/motivation.adoc diff --git a/doc/overview.adoc b/docs/overview.adoc similarity index 100% rename from doc/overview.adoc rename to docs/overview.adoc diff --git a/doc/theory.adoc b/docs/theory.adoc similarity index 100% rename from doc/theory.adoc rename to docs/theory.adoc diff --git a/include/safe/iostream.hpp b/include/safe/iostream.hpp index f98b169..8d11d5e 100644 --- a/include/safe/iostream.hpp +++ b/include/safe/iostream.hpp @@ -1,6 +1,7 @@ #pragma once #include + #include auto operator<<(std::ostream &os, safe::Var auto var) -> std::ostream & { diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 78d6b74..60f15be 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,15 +1 @@ -# Test that code is NOT able to compile -function(test_static_assert_fail test_file) - string(REPLACE "/" "_" test_name "${test_file}") - string(PREPEND test_name "EXPECT_FAIL.") - add_executable(${test_name} EXCLUDE_FROM_ALL ${test_file}) - target_link_libraries(${test_name} PRIVATE safe_arithmetic) - add_test(NAME ${test_name} - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target - ${test_name}) - set_tests_properties( - ${test_name} PROPERTIES PASS_REGULAR_EXPRESSION - "(static_assert)|(static assertion failed)") -endfunction() - add_subdirectory(safe) diff --git a/test/safe/array/CMakeLists.txt b/test/safe/array/CMakeLists.txt index 7b0c1f1..b4910aa 100644 --- a/test/safe/array/CMakeLists.txt +++ b/test/safe/array/CMakeLists.txt @@ -1 +1 @@ -test_static_assert_fail(array_constant_access_max_violation.cpp) +add_compile_fail_test(array_constant_access_max_violation.cpp) diff --git a/test/safe/var/CMakeLists.txt b/test/safe/var/CMakeLists.txt index 497ed73..1f68568 100644 --- a/test/safe/var/CMakeLists.txt +++ b/test/safe/var/CMakeLists.txt @@ -1,8 +1,8 @@ -test_static_assert_fail(assign_constant_max_violation.cpp) -test_static_assert_fail(assign_constant_min_violation.cpp) -test_static_assert_fail(construct_constant_max_violation.cpp) -test_static_assert_fail(construct_constant_min_violation.cpp) -test_static_assert_fail(interval_larger_than_type.cpp) -test_static_assert_fail(assign_lhs_rhs_union.cpp) -test_static_assert_fail(assign_lhs_union.cpp) -test_static_assert_fail(assign_rhs_union.cpp) +add_compile_fail_test(assign_constant_max_violation.cpp) +add_compile_fail_test(assign_constant_min_violation.cpp) +add_compile_fail_test(construct_constant_max_violation.cpp) +add_compile_fail_test(construct_constant_min_violation.cpp) +add_compile_fail_test(interval_larger_than_type.cpp) +add_compile_fail_test(assign_lhs_rhs_union.cpp) +add_compile_fail_test(assign_lhs_union.cpp) +add_compile_fail_test(assign_rhs_union.cpp) diff --git a/toolchains/clang.cmake b/toolchains/clang.cmake deleted file mode 100644 index d2b6fdb..0000000 --- a/toolchains/clang.cmake +++ /dev/null @@ -1,31 +0,0 @@ -set(TOOLCHAIN_ROOT "/usr") -if(DEFINED ENV{TOOLCHAIN_ROOT}) - set(TOOLCHAIN_ROOT $ENV{TOOLCHAIN_ROOT}) -endif() - -set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/bin/clang") -set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/bin/clang++") - -if(DEFINED ENV{CC}) - set(CMAKE_C_COMPILER $ENV{CC}) -endif() -if(DEFINED ENV{CXX}) - set(CMAKE_CXX_COMPILER $ENV{CXX}) -endif() - -if(DEFINED ENV{GCC_TOOLCHAIN_ROOT}) - set(GCC_COMPILE_FLAGS "--gcc-toolchain=$ENV{GCC_TOOLCHAIN_ROOT}") - set(GCC_LINK_FLAGS "-Wl,-rpath -Wl,$ENV{GCC_TOOLCHAIN_ROOT}/lib64") -endif() - -set(LIB_FLAGS "") -if(DEFINED ENV{CXX_STDLIB}) - set(LIB_FLAGS " -stdlib=$ENV{CXX_STDLIB}") -endif() - -set(CMAKE_C_FLAGS_INIT ${GCC_COMPILE_FLAGS}) -set(CMAKE_CXX_FLAGS_INIT "${GCC_COMPILE_FLAGS}${LIB_FLAGS}") -set(CMAKE_EXE_LINKER_FLAGS_INIT ${GCC_LINK_FLAGS}) - -set(CMAKE_CXX_FLAGS_DEBUG_INIT "-O0") -set(CMAKE_CXX_FLAGS_RELEASE_INIT "-O3") diff --git a/toolchains/gcc.cmake b/toolchains/gcc.cmake deleted file mode 100644 index c30489a..0000000 --- a/toolchains/gcc.cmake +++ /dev/null @@ -1,17 +0,0 @@ -set(TOOLCHAIN_ROOT "/usr") -if(DEFINED ENV{TOOLCHAIN_ROOT}) - set(TOOLCHAIN_ROOT $ENV{TOOLCHAIN_ROOT}) -endif() - -set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/bin/gcc") -set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/bin/g++") - -if(DEFINED ENV{CC}) - set(CMAKE_C_COMPILER $ENV{CC}) -endif() -if(DEFINED ENV{CXX}) - set(CMAKE_CXX_COMPILER $ENV{CXX}) -endif() - -set(CMAKE_CXX_FLAGS_DEBUG_INIT "-Og") -set(CMAKE_CXX_FLAGS_DEBUG_RELEASE "-O3")