From 3d75ed06a3aa962ede1f5b67a0f30cfb4a61778e Mon Sep 17 00:00:00 2001 From: Lars Melchior Date: Sat, 22 Jun 2019 13:31:32 +0200 Subject: [PATCH] add unit tests and determine version from GIT_TAG (#66) * add unit tests * determine package version from git tag. closes #54. * update readme * bugfix * update example * update gitignore --- .gitignore | 1 + .travis.yml | 4 +++ README.md | 4 +-- cmake/CPM.cmake | 41 ++++++++++++++++++++++----- cmake/testing.cmake | 10 +++++++ examples/doctest/CMakeLists.txt | 1 - examples/sol2/CMakeLists.txt | 3 +- test/CMakeLists.txt | 14 +++++++++ test/unit/dependency_properties.cmake | 30 ++++++++++++++++++++ test/unit/version_from_git_tag.cmake | 16 +++++++++++ 10 files changed, 113 insertions(+), 11 deletions(-) create mode 100644 cmake/testing.cmake create mode 100644 test/CMakeLists.txt create mode 100644 test/unit/dependency_properties.cmake create mode 100644 test/unit/version_from_git_tag.cmake diff --git a/.gitignore b/.gitignore index a43b24e..8884dfa 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ install_manifest.txt compile_commands.json CTestTestfile.cmake build +.vscode \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 80ce570..d69cf03 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,5 +44,9 @@ before_install: - cmake --version script: + # unit tests + - cmake -Htest -Bbuild/test + - CTEST_OUTPUT_ON_FAILURE=1 cmake --build build/test --target test + # examples - python3 examples/run_all.py \ No newline at end of file diff --git a/README.md b/README.md index 24605ef..8384458 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,6 @@ CPMAddPackage( CPMAddPackage( NAME doctest GITHUB_REPOSITORY onqtam/doctest - VERSION 2.3.2 GIT_TAG 2.3.2 ) ``` @@ -205,7 +204,8 @@ CPMAddPackage( CPMAddPackage( NAME lua GIT_REPOSITORY https://github.com/lua/lua.git - VERSION 5-3-4 + GIT_TAG v5-3-4 + VERSION 5.3.4 DOWNLOAD_ONLY YES ) diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index 693179d..75bf636 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -28,7 +28,7 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR) -set(CURRENT_CPM_VERSION 0.11.1) +set(CURRENT_CPM_VERSION 0.12) if(CPM_DIRECTORY) if(NOT ${CPM_DIRECTORY} MATCHES ${CMAKE_CURRENT_LIST_DIR}) @@ -42,10 +42,12 @@ endif() set(CPM_VERSION ${CURRENT_CPM_VERSION} CACHE INTERNAL "") set(CPM_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} CACHE INTERNAL "") set(CPM_PACKAGES "" CACHE INTERNAL "") +set(CPM_DRY_RUN OFF CACHE INTERNAL "Don't download or configure dependencies (for testing)") option(CPM_USE_LOCAL_PACKAGES "Use locally installed packages (find_package)" OFF) option(CPM_LOCAL_PACKAGES_ONLY "Use only locally installed packages" OFF) + include(FetchContent) include(CMakeParseArguments) @@ -64,6 +66,7 @@ function(CPMAddPackage) DOWNLOAD_ONLY GITHUB_REPOSITORY GITLAB_REPOSITORY + DRY # for testing ) set(multiValueArgs @@ -89,11 +92,16 @@ function(CPMAddPackage) endif() endif() - if (NOT CPM_ARGS_VERSION) - set(CPM_ARGS_VERSION 0) + if (NOT DEFINED CPM_ARGS_VERSION) + if (DEFINED CPM_ARGS_GIT_TAG) + CPM_GET_VERSION_FROM_GIT_TAG("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION) + endif() + if (NOT DEFINED CPM_ARGS_VERSION) + set(CPM_ARGS_VERSION 0) + endif() endif() - if (NOT CPM_ARGS_GIT_TAG) + if (NOT DEFINED CPM_ARGS_GIT_TAG) set(CPM_ARGS_GIT_TAG v${CPM_ARGS_VERSION}) endif() @@ -114,7 +122,7 @@ function(CPMAddPackage) endif() if (${CPM_ARGS_NAME} IN_LIST CPM_PACKAGES) - CPM_GET_PACKAGE_VERSION(${CPM_ARGS_NAME}) + CPM_GET_PACKAGE_VERSION(${CPM_ARGS_NAME} CPM_PACKAGE_VERSION) if(${CPM_PACKAGE_VERSION} VERSION_LESS ${CPM_ARGS_VERSION}) message(WARNING "${CPM_INDENT} requires a newer version of ${CPM_ARGS_NAME} (${CPM_ARGS_VERSION}) than currently included (${CPM_PACKAGE_VERSION}).") endif() @@ -154,6 +162,11 @@ endfunction() function (CPM_DECLARE_PACKAGE PACKAGE VERSION GIT_TAG) message(STATUS "${CPM_INDENT} adding package ${PACKAGE}@${VERSION} (${GIT_TAG})") + if (${CPM_DRY_RUN}) + message(STATUS "${CPM_INDENT} package not declared (dry run)") + return() + endif() + FetchContent_Declare( ${PACKAGE} ${ARGN} @@ -161,6 +174,12 @@ function (CPM_DECLARE_PACKAGE PACKAGE VERSION GIT_TAG) endfunction() function (CPM_FETCH_PACKAGE PACKAGE DOWNLOAD_ONLY) + + if (${CPM_DRY_RUN}) + message(STATUS "${CPM_INDENT} package ${PACKAGE} not fetched (dry run)") + return() + endif() + set(CPM_OLD_INDENT "${CPM_INDENT}") set(CPM_INDENT "${CPM_INDENT} ${PACKAGE}:") if(${DOWNLOAD_ONLY}) @@ -174,6 +193,9 @@ function (CPM_FETCH_PACKAGE PACKAGE DOWNLOAD_ONLY) endfunction() function (CPMGetProperties PACKAGE) + if (${CPM_DRY_RUN}) + return() + endif() FetchContent_GetProperties(${PACKAGE}) string(TOLOWER ${PACKAGE} lpackage) SET(${PACKAGE}_SOURCE_DIR "${${lpackage}_SOURCE_DIR}" PARENT_SCOPE) @@ -186,8 +208,8 @@ function(CPMRegisterPackage PACKAGE VERSION) set("CPM_PACKAGE_${PACKAGE}_VERSION" ${VERSION} CACHE INTERNAL "") endfunction() -function(CPM_GET_PACKAGE_VERSION PACKAGE) - set(CPM_PACKAGE_VERSION "${CPM_PACKAGE_${PACKAGE}_VERSION}" PARENT_SCOPE) +function(CPM_GET_PACKAGE_VERSION PACKAGE OUTPUT) + set(${OUTPUT} "${CPM_PACKAGE_${PACKAGE}_VERSION}" PARENT_SCOPE) endfunction() function(CPM_PARSE_OPTION OPTION) @@ -199,6 +221,11 @@ function(CPM_PARSE_OPTION OPTION) set(OPTION_VALUE "${OPTION_VALUE}" PARENT_SCOPE) endfunction() +function(CPM_GET_VERSION_FROM_GIT_TAG GIT_TAG RESULT) + string(REGEX MATCH "v?([0123456789.]*).*" _ ${GIT_TAG}) + SET(${RESULT} ${CMAKE_MATCH_1} PARENT_SCOPE) +endfunction() + function (CPM_HANDLE_OLD_VERSION NEW_CPM_VERSION) message(AUTHOR_WARNING "${CPM_INDENT} \ diff --git a/cmake/testing.cmake b/cmake/testing.cmake new file mode 100644 index 0000000..9dc614e --- /dev/null +++ b/cmake/testing.cmake @@ -0,0 +1,10 @@ + +function(ASSERT_EQUAL) + if (NOT ARGC EQUAL 2) + message(FATAL_ERROR "assertion failed: invalid argument count: ${ARGC}") + endif() + + if (NOT ${ARGV0} EQUAL ${ARGV1}) + message(FATAL_ERROR "assertion failed: '${ARGV0}' != '${ARGV1}'") + endif() +endfunction() diff --git a/examples/doctest/CMakeLists.txt b/examples/doctest/CMakeLists.txt index 13657ff..c0c6a34 100644 --- a/examples/doctest/CMakeLists.txt +++ b/examples/doctest/CMakeLists.txt @@ -17,7 +17,6 @@ CPMAddPackage( CPMAddPackage( NAME doctest GITHUB_REPOSITORY onqtam/doctest - VERSION 2.3.2 GIT_TAG 2.3.2 ) diff --git a/examples/sol2/CMakeLists.txt b/examples/sol2/CMakeLists.txt index b9fad2d..dc8448b 100644 --- a/examples/sol2/CMakeLists.txt +++ b/examples/sol2/CMakeLists.txt @@ -7,7 +7,8 @@ include(../../cmake/CPM.cmake) CPMAddPackage( NAME lua GIT_REPOSITORY https://github.com/lua/lua.git - VERSION 5-3-4 + VERSION 5.3.4 + GIT_TAG v5-3-4 DOWNLOAD_ONLY YES ) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..1fe13e9 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.14 FATAL_ERROR) + +file(GLOB tests "${CMAKE_CURRENT_SOURCE_DIR}/unit/*.cmake") + +enable_testing() + +foreach(test ${tests}) + message(STATUS "adding test: ${test}") + add_test( + NAME ${test} + COMMAND ${CMAKE_COMMAND} -DCPM_PATH=${CMAKE_CURRENT_SOURCE_DIR}/../cmake -P "${test}" + ) + +endforeach() diff --git a/test/unit/dependency_properties.cmake b/test/unit/dependency_properties.cmake new file mode 100644 index 0000000..c1094ed --- /dev/null +++ b/test/unit/dependency_properties.cmake @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 3.14 FATAL_ERROR) + +include(${CPM_PATH}/CPM.cmake) +include(${CPM_PATH}/testing.cmake) + +set(CPM_DRY_RUN ON) + +CPMAddPackage( + NAME A + GIT_TAG 1.2.3 +) + +CPM_GET_PACKAGE_VERSION(A VERSION) +ASSERT_EQUAL(${VERSION} "1.2.3") + +CPMAddPackage( + NAME B + GIT_TAG v2.3.1 +) + +CPM_GET_PACKAGE_VERSION(B VERSION) +ASSERT_EQUAL(${VERSION} "2.3.1") + +CPMAddPackage( + NAME C + GIT_TAG v3.1.2-a +) + +CPM_GET_PACKAGE_VERSION(C VERSION) +ASSERT_EQUAL(${VERSION} "3.1.2") diff --git a/test/unit/version_from_git_tag.cmake b/test/unit/version_from_git_tag.cmake new file mode 100644 index 0000000..c25d22c --- /dev/null +++ b/test/unit/version_from_git_tag.cmake @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.14 FATAL_ERROR) + +include(${CPM_PATH}/CPM.cmake) +include(${CPM_PATH}/testing.cmake) + +CPM_GET_VERSION_FROM_GIT_TAG("1.2.3" VERSION) +ASSERT_EQUAL("1.2.3" ${VERSION}) + +CPM_GET_VERSION_FROM_GIT_TAG("v1.2.3" VERSION) +ASSERT_EQUAL("1.2.3" ${VERSION}) + +CPM_GET_VERSION_FROM_GIT_TAG("1.2.3-a" VERSION) +ASSERT_EQUAL("1.2.3" ${VERSION}) + +CPM_GET_VERSION_FROM_GIT_TAG("v1.2.3-a" VERSION) +ASSERT_EQUAL("1.2.3" ${VERSION})