build: Improve build system (#327)

* *Add top level CMakeLists.txt, to make it easier to use both independently and from within other projects
* Add a unit_test target, to attach all unit tests to

* * Fix unit tests for windows
* Silence cmake warning regarding missing top project
* update .gitignore for vscode

---------

Co-authored-by: BobSmun <6492115+BobSmun@users.noreply.github.com>
This commit is contained in:
BobSmun
2024-12-17 03:37:38 +08:00
committed by GitHub
parent 63504f59a1
commit e026ff187e
7 changed files with 53 additions and 30 deletions

View File

@@ -51,7 +51,6 @@ jobs:
- name: 🛠️ Build - name: 🛠️ Build
run: | run: |
cd tests
mkdir -p build mkdir -p build
cd build cd build
CC=gcc-12 CXX=g++-12 cmake \ CC=gcc-12 CXX=g++-12 cmake \
@@ -59,14 +58,15 @@ jobs:
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DCMAKE_C_FLAGS="-fuse-ld=lld --coverage" \ -DCMAKE_C_FLAGS="-fuse-ld=lld --coverage" \
-DCMAKE_CXX_FLAGS="-fuse-ld=lld --coverage" \ -DCMAKE_CXX_FLAGS="-fuse-ld=lld --coverage" \
-DIMHEX_PATTERNS_ENABLE_UNIT_TESTS=ON \
-DLIBPL_ENABLE_TESTS=OFF \ -DLIBPL_ENABLE_TESTS=OFF \
-DLIBPL_ENABLE_CLI=OFF \ -DLIBPL_ENABLE_CLI=OFF \
.. ..
make -j4 make -j4 unit_tests
- name: 🧪 Perform Unit Tests - name: 🧪 Perform Unit Tests
run: | run: |
cd tests/build cd build
ctest --output-on-failure -j 4 ctest --output-on-failure -j 4
- name: 📎 Validate JSON Files - name: 📎 Validate JSON Files

8
.gitignore vendored
View File

@@ -1,6 +1,12 @@
tests/cmake*/ tests/cmake*/
tests/build*/ tests/build*/
build/
.vscode/
.devcontainer/
.cache/
.idea/ .idea/
.DS_Store .DS_Store
compile_commands.json

30
CMakeLists.txt Normal file
View File

@@ -0,0 +1,30 @@
cmake_minimum_required(VERSION 3.16)
project(ImHex-Patterns)
option(IMHEX_PATTERNS_ENABLE_UNIT_TESTS "Enable building unit tests for ImHex-Patterns" OFF)
# if enabled, add a unit_test custom target for all the unit tests to be registered against
if(IMHEX_PATTERNS_ENABLE_UNIT_TESTS)
if(NOT TARGET unit_tests)
enable_testing()
add_custom_target(unit_tests)
endif()
endif()
# If this has been manually cloned into another project, libpl may already have been set up
if(NOT TARGET libpl)
include(FetchContent)
FetchContent_Declare(
pattern_language
GIT_REPOSITORY https://github.com/WerWolv/PatternLanguage
GIT_TAG master
)
FetchContent_MakeAvailable(pattern_language)
endif()
if(IMHEX_PATTERNS_ENABLE_UNIT_TESTS)
add_subdirectory(tests)
endif()

View File

@@ -1,23 +1,7 @@
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.16)
project(tests)
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD 20)
include(FetchContent)
FetchContent_Declare(
pattern_language
GIT_REPOSITORY https://github.com/WerWolv/PatternLanguage
GIT_TAG master
)
FetchContent_MakeAvailable(pattern_language)
enable_testing()
add_subdirectory(patterns) add_subdirectory(patterns)
add_subdirectory(includes) add_subdirectory(includes)
add_subdirectory(magic) add_subdirectory(magic)
add_custom_target(test_all DEPENDS patterns_tests includes_test magic_test)

View File

@@ -17,7 +17,7 @@ add_executable(includes_test
target_include_directories(includes_test PRIVATE include) target_include_directories(includes_test PRIVATE include)
target_link_libraries(includes_test PRIVATE libpl fmt::fmt-header-only) target_link_libraries(includes_test PRIVATE libpl fmt::fmt-header-only)
set_target_properties(includes_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set_target_properties(includes_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
message(STATUS "Adding Include Tests") message(STATUS "Adding Include Tests")
foreach (include IN LISTS INCLUDES) foreach (include IN LISTS INCLUDES)
@@ -25,6 +25,7 @@ foreach (include IN LISTS INCLUDES)
set(TEST_NAME "Includes/${INCLUDE_NAME}") set(TEST_NAME "Includes/${INCLUDE_NAME}")
add_test(NAME ${TEST_NAME} COMMAND includes_test "${INCLUDE_NAME}" "${include}" "${PATTERN_INCLUDES}" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_test(NAME ${TEST_NAME} COMMAND includes_test "${INCLUDE_NAME}" "${include}" "${PATTERN_INCLUDES}" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set_tests_properties(${TEST_NAME} PROPERTIES SKIP_RETURN_CODE 77) set_tests_properties(${TEST_NAME} PROPERTIES SKIP_RETURN_CODE 77)
endforeach () endforeach ()
add_dependencies(unit_tests ${PROJECT_NAME})

View File

@@ -19,7 +19,7 @@ pkg_search_module(MAGIC libmagic>=5.39 REQUIRED)
target_include_directories(magic_test PRIVATE include ${MAGIC_INCLUDE_DIRS}) target_include_directories(magic_test PRIVATE include ${MAGIC_INCLUDE_DIRS})
target_link_libraries(magic_test PRIVATE libpl ${MAGIC_LINK_LIBRARIES} fmt::fmt-header-only) target_link_libraries(magic_test PRIVATE libpl ${MAGIC_LINK_LIBRARIES} fmt::fmt-header-only)
set_target_properties(magic_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set_target_properties(magic_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
message(STATUS "Adding Magic Tests") message(STATUS "Adding Magic Tests")
foreach (magic_file IN LISTS MAGIC_FILES) foreach (magic_file IN LISTS MAGIC_FILES)
@@ -27,6 +27,7 @@ foreach (magic_file IN LISTS MAGIC_FILES)
set(TEST_NAME "Magic/${MAGIC_NAME}") set(TEST_NAME "Magic/${MAGIC_NAME}")
add_test(NAME ${TEST_NAME} COMMAND magic_test "${MAGIC_NAME}" "${magic_file}" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_test(NAME ${TEST_NAME} COMMAND magic_test "${MAGIC_NAME}" "${magic_file}" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set_tests_properties(${TEST_NAME} PROPERTIES SKIP_RETURN_CODE 77) set_tests_properties(${TEST_NAME} PROPERTIES SKIP_RETURN_CODE 77)
endforeach () endforeach ()
add_dependencies(unit_tests ${PROJECT_NAME})

View File

@@ -17,7 +17,7 @@ add_executable(patterns_tests
target_include_directories(patterns_tests PRIVATE include) target_include_directories(patterns_tests PRIVATE include)
target_link_libraries(patterns_tests PRIVATE libpl fmt::fmt-header-only) target_link_libraries(patterns_tests PRIVATE libpl fmt::fmt-header-only)
set_target_properties(patterns_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set_target_properties(patterns_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
message(STATUS "Adding Pattern Tests") message(STATUS "Adding Pattern Tests")
foreach (pattern IN LISTS PATTERNS) foreach (pattern IN LISTS PATTERNS)
@@ -33,13 +33,14 @@ foreach (pattern IN LISTS PATTERNS)
foreach (TEST_FILE IN LISTS TEST_FILES) foreach (TEST_FILE IN LISTS TEST_FILES)
get_filename_component(TEST_FILENAME ${TEST_FILE} NAME) get_filename_component(TEST_FILENAME ${TEST_FILE} NAME)
set(TEST_NAME "Patterns/${PATTERN_NAME}/${TEST_FILENAME}") set(TEST_NAME "Patterns/${PATTERN_NAME}/${TEST_FILENAME}")
add_test(NAME ${TEST_NAME} COMMAND patterns_tests "${PATTERN_NAME}" "${pattern}" "${PATTERN_INCLUDES}" "${TEST_FILE}" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_test(NAME ${TEST_NAME} COMMAND patterns_tests "${PATTERN_NAME}" "${pattern}" "${PATTERN_INCLUDES}" "${TEST_FILE}" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set_tests_properties(${TEST_NAME} PROPERTIES SKIP_RETURN_CODE 77) set_tests_properties(${TEST_NAME} PROPERTIES SKIP_RETURN_CODE 77)
endforeach () endforeach ()
else () else ()
set(TEST_NAME "Patterns/${PATTERN_NAME}") set(TEST_NAME "Patterns/${PATTERN_NAME}")
add_test(NAME ${TEST_NAME} COMMAND patterns_tests "${PATTERN_NAME}" "${pattern}" "${PATTERN_INCLUDES}" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_test(NAME ${TEST_NAME} COMMAND patterns_tests "${PATTERN_NAME}" "${pattern}" "${PATTERN_INCLUDES}" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set_tests_properties(${TEST_NAME} PROPERTIES SKIP_RETURN_CODE 77) set_tests_properties(${TEST_NAME} PROPERTIES SKIP_RETURN_CODE 77)
message(STATUS " No test file available for ${PATTERN_NAME} pattern") message(STATUS " No test file available for ${PATTERN_NAME} pattern")
endif () endif ()
endforeach () endforeach ()
add_dependencies(unit_tests ${PROJECT_NAME})