diff --git a/.gersemirc b/.gersemirc new file mode 100644 index 00000000..8895acdd --- /dev/null +++ b/.gersemirc @@ -0,0 +1,9 @@ +# yamllint disable-line rule:line-length +# yaml-language-server: $schema=https://raw.githubusercontent.com/BlankSpruce/gersemi/master/gersemi/configuration.schema.json + +definitions: + - "build/deps/Catch2-extracted/extras/Catch.cmake" + - "examples/CMakeLists.txt" + +line_length: 100 +list_expansion: "favour-expansion" diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a6b558b..f9ae6cf9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,15 @@ cmake_minimum_required(VERSION 3.22.1) -project(log_surgeon +project( + log_surgeon VERSION 0.0.1 DESCRIPTION "log-surgeon: A performant log parsing library" HOMEPAGE_URL https://github.com/y-scope/log-surgeon - LANGUAGES CXX - ) + LANGUAGES + CXX +) -if (POLICY CMP0077) +if(POLICY CMP0077) cmake_policy(SET CMP0077 NEW) endif() @@ -24,7 +26,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS FORCE ) -if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(default_build_type "Release") message(STATUS "No build type specified. Setting to '${default_build_type}'.") set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Choose the type of build." FORCE) @@ -112,7 +114,7 @@ set(SOURCE_FILES src/log_surgeon/Token.hpp src/log_surgeon/types.hpp src/log_surgeon/UniqueIdGenerator.hpp - ) +) set(LOG_SURGEON_INSTALL_CONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/log_surgeon) set(LOG_SURGEON_INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}) @@ -120,97 +122,112 @@ set(LOG_SURGEON_INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}) add_library(log_surgeon ${SOURCE_FILES}) add_library(log_surgeon::log_surgeon ALIAS log_surgeon) -target_link_libraries(log_surgeon +target_link_libraries( + log_surgeon PUBLIC - fmt::fmt - Microsoft.GSL::GSL - ) + fmt::fmt + Microsoft.GSL::GSL +) -target_include_directories(log_surgeon - PUBLIC +target_include_directories( + log_surgeon + PUBLIC $ $ - PRIVATE + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src - ) +) -target_compile_features(log_surgeon - PRIVATE cxx_std_20 - ) +target_compile_features(log_surgeon PRIVATE cxx_std_20) -target_compile_options(log_surgeon PRIVATE - $<$:/W4 /WX> - $<$>:-Wall -Wextra -Wpedantic -Werror> - ) +target_compile_options( + log_surgeon + PRIVATE + $<$:/W4 + /WX> + $<$>:-Wall + -Wextra + -Wpedantic + -Werror> +) # Disable -Wstringop-overflow to avoid a false positive in the following compiler versions. # See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117983 -if("GNU" STREQUAL "${CMAKE_CXX_COMPILER_ID}" - AND ((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 12 - AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.5) - OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13 - AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.4) - OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 14 - AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 14.3))) +if( + "GNU" + STREQUAL + "${CMAKE_CXX_COMPILER_ID}" + AND ( + ( + CMAKE_CXX_COMPILER_VERSION + VERSION_GREATER_EQUAL + 12 + AND CMAKE_CXX_COMPILER_VERSION + VERSION_LESS + 12.5 + ) + OR ( + CMAKE_CXX_COMPILER_VERSION + VERSION_GREATER_EQUAL + 13 + AND CMAKE_CXX_COMPILER_VERSION + VERSION_LESS + 13.4 + ) + OR ( + CMAKE_CXX_COMPILER_VERSION + VERSION_GREATER_EQUAL + 14 + AND CMAKE_CXX_COMPILER_VERSION + VERSION_LESS + 14.3 + ) + ) +) target_compile_options(log_surgeon PRIVATE "-Wno-stringop-overflow") endif() # Make off_t 64-bit -target_compile_definitions(log_surgeon - PRIVATE - _FILE_OFFSET_BITS=64 - ) +target_compile_definitions(log_surgeon PRIVATE _FILE_OFFSET_BITS=64) -install( - TARGETS - log_surgeon - EXPORT - log_surgeon-targets - ) +install(TARGETS log_surgeon EXPORT log_surgeon-targets) install( - EXPORT - log_surgeon-targets - NAMESPACE - log_surgeon:: - DESTINATION - ${LOG_SURGEON_INSTALL_CONFIG_DIR} - ) + EXPORT log_surgeon-targets + NAMESPACE log_surgeon:: + DESTINATION ${LOG_SURGEON_INSTALL_CONFIG_DIR} +) install( DIRECTORY - "${PROJECT_SOURCE_DIR}/src/log_surgeon" - DESTINATION - "${LOG_SURGEON_INSTALL_INCLUDE_DIR}" + "${PROJECT_SOURCE_DIR}/src/log_surgeon" + DESTINATION "${LOG_SURGEON_INSTALL_INCLUDE_DIR}" FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" PATTERN "*.tpp" - ) +) configure_package_config_file( ${CMAKE_CURRENT_LIST_DIR}/cmake/log_surgeon-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/log_surgeon-config.cmake - INSTALL_DESTINATION - ${LOG_SURGEON_INSTALL_CONFIG_DIR} + INSTALL_DESTINATION ${LOG_SURGEON_INSTALL_CONFIG_DIR} PATH_VARS - LOG_SURGEON_INSTALL_INCLUDE_DIR - ) + LOG_SURGEON_INSTALL_INCLUDE_DIR +) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/log_surgeon-config-version.cmake - COMPATIBILITY - SameMajorVersion - ) + COMPATIBILITY SameMajorVersion +) install( FILES - ${CMAKE_CURRENT_BINARY_DIR}/log_surgeon-config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/log_surgeon-config-version.cmake - DESTINATION - ${LOG_SURGEON_INSTALL_CONFIG_DIR} - ) + ${CMAKE_CURRENT_BINARY_DIR}/log_surgeon-config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/log_surgeon-config-version.cmake + DESTINATION ${LOG_SURGEON_INSTALL_CONFIG_DIR} +) -if (log_surgeon_ENABLE_TESTS) +if(log_surgeon_ENABLE_TESTS) add_subdirectory(tests) endif() diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 05b9cd31..3d0d855d 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -8,7 +8,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS FORCE ) -if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(default_build_type "Release") message(STATUS "No build type specified. Setting to '${default_build_type}'.") set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Choose the type of build." FORCE) @@ -27,16 +27,32 @@ message(STATUS "Found log_surgeon ${log_surgeon_VERSION}.") function(add_to_target target libraries) target_link_libraries(${target} ${libraries}) target_compile_features(${target} PRIVATE cxx_std_20) - target_compile_options(${target} PRIVATE - $<$:/W4 /WX> - $<$>:-Wall -Wextra -Wpedantic -Werror> - ) + target_compile_options( + ${target} + PRIVATE + $<$:/W4 + /WX> + $<$>:-Wall + -Wextra + -Wpedantic + -Werror> + ) endfunction() -add_library(common OBJECT common.cpp common.hpp) +add_library( + common + OBJECT + common.cpp + common.hpp +) add_to_target(common log_surgeon::log_surgeon) -list(APPEND libraries log_surgeon::log_surgeon common) +list( + APPEND + libraries + log_surgeon::log_surgeon + common +) add_executable(buffer-parser buffer-parser.cpp) add_to_target(buffer-parser "${libraries}") diff --git a/lint-requirements.txt b/lint-requirements.txt index e812cd91..dbf21dec 100644 --- a/lint-requirements.txt +++ b/lint-requirements.txt @@ -1,3 +1,4 @@ clang-format>=20.1 clang-tidy>=20.1 +gersemi>=0.16.2 yamllint>=1.35.1 diff --git a/taskfiles/lint.yaml b/taskfiles/lint.yaml index ed17b635..22a736fb 100644 --- a/taskfiles/lint.yaml +++ b/taskfiles/lint.yaml @@ -1,6 +1,9 @@ version: "3" includes: + deps: + internal: true + taskfile: "deps.yaml" examples: internal: true taskfile: "examples.yaml" @@ -14,7 +17,11 @@ includes: vars: # General linting variables G_LINT_VENV_DIR: "{{.G_BUILD_DIR}}/lint-venv" - G_UTILS_CONFIGS_DIR: "{{.ROOT_DIR}}/tools/yscope-dev-utils/exports/lint-configs" + + # Utils directories + G_UTILS_EXPORTS_DIR: "{{.ROOT_DIR}}/tools/yscope-dev-utils/exports" + G_UTILS_CONFIGS_DIR: "{{.G_UTILS_EXPORTS_DIR}}/lint-configs" + G_UTILS_YSTDLIB_PY_DIR: "{{.G_UTILS_EXPORTS_DIR}}/ystdlib-py" # Root paths for source files G_LOG_SURGEON_ROOT_PATHS: @@ -39,9 +46,16 @@ vars: tasks: check: cmds: + - task: "check-cmake" - task: "check-cpp" - task: "check-yaml" + check-cmake: + cmds: + - task: "gersemi" + vars: + FLAGS: "--check" + check-cpp: cmds: - task: "check-cpp-format-examples" @@ -179,9 +193,16 @@ tasks: fix: cmds: + - task: "fix-cmake" - task: "fix-cpp" - task: "fix-yaml" + fix-cmake: + cmds: + - task: "gersemi" + vars: + FLAGS: "--in-place" + fix-cpp: cmds: - task: "fix-cpp-format-examples" @@ -247,6 +268,25 @@ tasks: ref: ".G_LOG_SURGEON_ROOT_PATHS" VENV_DIR: "{{.G_LINT_VENV_DIR}}" + gersemi: + internal: true + label: "{{.TASK}}:{{.FLAGS}}" + requires: + vars: + - "FLAGS" + deps: + - "deps:install-all" + - "venv" + cmd: |- + . "{{.G_LINT_VENV_DIR}}/bin/activate" + uv run --project "{{.G_UTILS_YSTDLIB_PY_DIR}}" pyfind \ + "{{.ROOT_DIR}}" \ + --exclude "build/**/*" \ + --exclude "tools/**/*" \ + --filename "CMakeLists.txt" \ + --filename "*.cmake" \ + | xargs gersemi {{.FLAGS}} + venv: internal: true vars: diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e54a47ab..0129a1d2 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,17 +1,23 @@ add_executable(unit-test) -target_sources(unit-test +target_sources( + unit-test PRIVATE - test-buffer-parser.cpp - test-capture.cpp - test-dfa.cpp - test-nfa.cpp - test-prefix-tree.cpp - test-regex-ast.cpp - test-register-handler.cpp - test-schema.cpp + test-buffer-parser.cpp + test-capture.cpp + test-dfa.cpp + test-nfa.cpp + test-prefix-tree.cpp + test-regex-ast.cpp + test-register-handler.cpp + test-schema.cpp ) -target_link_libraries(unit-test PRIVATE Catch2::Catch2WithMain log_surgeon::log_surgeon) +target_link_libraries( + unit-test + PRIVATE + Catch2::Catch2WithMain + log_surgeon::log_surgeon +) target_compile_features(unit-test PRIVATE cxx_std_20) catch_discover_tests(unit-test)