Skip to content
This repository was archived by the owner on Jun 30, 2025. It is now read-only.

Commit c0463b1

Browse files
committed
added cmake package config unit test
1 parent 9a43cfb commit c0463b1

File tree

7 files changed

+182
-8
lines changed

7 files changed

+182
-8
lines changed

.gitignore

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1+
/*.cmake
2+
/*.filters
3+
/*.sln
4+
/*.vcxproj
15
autom4te.cache
2-
glog-*.tar.gz
3-
packages/rpm-unknown
4-
packages/debian-*
6+
bazel-*
57
CMakeCache.txt
68
CMakeFiles/
7-
*.cmake
89
config.h
9-
*.sln
10-
*.vcxproj
11-
*.filters
12-
bazel-*
10+
glog-*.tar.gz
11+
packages/debian-*
12+
packages/rpm-unknown

CMakeLists.txt

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ include (CMakePushCheckState)
5252
include (CPack)
5353
include (CTest)
5454
include (DetermineGflagsNamespace)
55+
include (GetCacheVariables)
5556
include (GNUInstallDirs)
5657

5758
set (CMAKE_DEBUG_POSTFIX d)
@@ -703,6 +704,57 @@ if (BUILD_TESTING)
703704
if (TARGET symbolize_unittest)
704705
add_test (NAME symbolize COMMAND symbolize_unittest)
705706
endif (TARGET symbolize_unittest)
707+
708+
# Generate an initial cache
709+
710+
get_cache_variables (_CACHEVARS EXCLUDE CMAKE_MAKE_PROGRAM)
711+
712+
set (_INITIAL_CACHE
713+
${CMAKE_CURRENT_BINARY_DIR}/test_package_config/glog_package_config_initial_cache.cmake)
714+
715+
# Package config test
716+
717+
add_test (NAME cmake_package_config_init COMMAND ${CMAKE_COMMAND}
718+
-DTEST_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}/test_package_config
719+
-DINITIAL_CACHE=${_INITIAL_CACHE}
720+
-DCACHEVARS=${_CACHEVARS}
721+
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestInitPackageConfig.cmake
722+
)
723+
724+
add_test (NAME cmake_package_config_generate COMMAND ${CMAKE_COMMAND}
725+
-DPATH=$ENV{PATH}
726+
-DINITIAL_CACHE=${_INITIAL_CACHE}
727+
-DTEST_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}/test_package_config/working_config
728+
-DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}/src/package_config_unittest/working_config
729+
-DPACKAGE_DIR=${CMAKE_CURRENT_BINARY_DIR}
730+
-DGENERATOR=${CMAKE_GENERATOR}
731+
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestPackageConfig.cmake
732+
)
733+
734+
add_test (NAME cmake_package_config_build COMMAND
735+
${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/test_package_config/working_config
736+
)
737+
738+
add_test (NAME cmake_package_config_cleanup COMMAND ${CMAKE_COMMAND} -E
739+
remove_directory
740+
${CMAKE_CURRENT_BINARY_DIR}/test_package_config
741+
)
742+
743+
# Fixtures setup
744+
set_tests_properties (cmake_package_config_init PROPERTIES FIXTURES_SETUP
745+
cmake_package_config)
746+
set_tests_properties (cmake_package_config_generate PROPERTIES FIXTURES_SETUP
747+
cmake_package_config_working)
748+
749+
# Fixtures cleanup
750+
set_tests_properties (cmake_package_config_cleanup PROPERTIES FIXTURES_CLEANUP
751+
cmake_package_config)
752+
753+
# Fixture requirements
754+
set_tests_properties (cmake_package_config_generate PROPERTIES
755+
FIXTURES_REQUIRED cmake_package_config)
756+
set_tests_properties (cmake_package_config_build PROPERTIES
757+
FIXTURES_REQUIRED "cmake_package_config;cmake_package_config_working")
706758
endif (BUILD_TESTING)
707759

708760
install (TARGETS glog

cmake/GetCacheVariables.cmake

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
cmake_policy (PUSH)
2+
cmake_policy (VERSION 3.3)
3+
4+
include (CMakeParseArguments)
5+
6+
function (get_cache_variables _CACHEVARS)
7+
set (_SINGLE)
8+
set (_MULTI EXCLUDE)
9+
set (_OPTIONS)
10+
11+
cmake_parse_arguments (_ARGS "${_OPTIONS}" "${_SINGLE}" "${_MULTI}" ${ARGS} ${ARGN})
12+
13+
get_cmake_property (_VARIABLES VARIABLES)
14+
15+
set (CACHEVARS)
16+
17+
foreach (_VAR ${_VARIABLES})
18+
if (DEFINED _ARGS_EXCLUDE)
19+
if ("${_VAR}" IN_LIST _ARGS_EXCLUDE)
20+
continue ()
21+
endif ("${_VAR}" IN_LIST _ARGS_EXCLUDE)
22+
endif (DEFINED _ARGS_EXCLUDE)
23+
24+
get_property (_CACHEVARTYPE CACHE ${_VAR} PROPERTY TYPE)
25+
26+
if ("${_CACHEVARTYPE}" STREQUAL INTERNAL OR
27+
"${_CACHEVARTYPE}" STREQUAL STATIC OR
28+
"${_CACHEVARTYPE}" STREQUAL UNINITIALIZED)
29+
continue ()
30+
endif ("${_CACHEVARTYPE}" STREQUAL INTERNAL OR
31+
"${_CACHEVARTYPE}" STREQUAL STATIC OR
32+
"${_CACHEVARTYPE}" STREQUAL UNINITIALIZED)
33+
34+
get_property (_CACHEVARVAL CACHE ${_VAR} PROPERTY VALUE)
35+
36+
if ("${_CACHEVARVAL}" STREQUAL "")
37+
continue ()
38+
endif ("${_CACHEVARVAL}" STREQUAL "")
39+
40+
get_property (_CACHEVARDOC CACHE ${_VAR} PROPERTY HELPSTRING)
41+
42+
# Escape " in values
43+
string (REPLACE "\"" "\\\"" _CACHEVARVAL "${_CACHEVARVAL}")
44+
# Escape " in help strings
45+
string (REPLACE "\"" "\\\"" _CACHEVARDOC "${_CACHEVARDOC}")
46+
# Escape ; in values
47+
string (REPLACE ";" "\\\;" _CACHEVARVAL "${_CACHEVARVAL}")
48+
# Escape backslash in values
49+
string (REGEX REPLACE "\\\\([^\"])" "\\\\\\1" _CACHEVARVAL "${_CACHEVARVAL}")
50+
51+
if (NOT "${_CACHEVARTYPE}" STREQUAL BOOL)
52+
set (_CACHEVARVAL "\"${_CACHEVARVAL}\"")
53+
endif (NOT "${_CACHEVARTYPE}" STREQUAL BOOL)
54+
55+
if (NOT "${_CACHEVARTYPE}" STREQUAL "" AND NOT "${_CACHEVARVAL}" STREQUAL "")
56+
set (CACHEVARS "${CACHEVARS}set (${_VAR} ${_CACHEVARVAL} CACHE ${_CACHEVARTYPE} \"${_CACHEVARDOC}\")\n")
57+
endif (NOT "${_CACHEVARTYPE}" STREQUAL "" AND NOT "${_CACHEVARVAL}" STREQUAL "")
58+
endforeach (_VAR)
59+
60+
set (${_CACHEVARS} ${CACHEVARS} PARENT_SCOPE)
61+
endfunction (get_cache_variables)
62+
63+
cmake_policy (POP)

cmake/TestInitPackageConfig.cmake

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Create the build directory
2+
execute_process (
3+
COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_BINARY_DIR}
4+
RESULT_VARIABLE _DIRECTORY_CREATED_SUCCEEDED
5+
)
6+
7+
if (NOT _DIRECTORY_CREATED_SUCCEEDED EQUAL 0)
8+
message (FATAL_ERROR "Failed to create build directory")
9+
endif (NOT _DIRECTORY_CREATED_SUCCEEDED EQUAL 0)
10+
11+
file (WRITE ${INITIAL_CACHE} "${CACHEVARS}")
12+

cmake/TestPackageConfig.cmake

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Create the build directory
2+
execute_process (
3+
COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_BINARY_DIR}
4+
RESULT_VARIABLE _DIRECTORY_CREATED_SUCCEEDED
5+
)
6+
7+
if (NOT _DIRECTORY_CREATED_SUCCEEDED EQUAL 0)
8+
message (FATAL_ERROR "Failed to create build directory")
9+
endif (NOT _DIRECTORY_CREATED_SUCCEEDED EQUAL 0)
10+
11+
# Capture the PATH environment variable content set during project
12+
# generation stage. This is required because later during the build stage
13+
# the PATH is modified again (e.g., for MinGW AppVeyor CI builds) by adding
14+
# back the directory containing git.exe. Incidently, the Git installation
15+
# directory also contains sh.exe which causes MinGW Makefile generation to
16+
# fail.
17+
set (ENV{PATH} ${PATH})
18+
19+
# Run CMake
20+
execute_process (
21+
COMMAND ${CMAKE_COMMAND} -C ${INITIAL_CACHE}
22+
-G ${GENERATOR}
23+
-DCMAKE_PREFIX_PATH=${PACKAGE_DIR}
24+
-DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON
25+
-DCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY=ON
26+
${SOURCE_DIR}
27+
WORKING_DIRECTORY ${TEST_BINARY_DIR}
28+
RESULT_VARIABLE _GENERATE_SUCCEEDED
29+
)
30+
31+
if (NOT _GENERATE_SUCCEEDED EQUAL 0)
32+
message (FATAL_ERROR "Failed to generate project files using CMake")
33+
endif (NOT _GENERATE_SUCCEEDED EQUAL 0)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
cmake_minimum_required (VERSION 3.1)
2+
project (glog_package_config)
3+
4+
find_package (glog REQUIRED NO_MODULE)
5+
6+
add_executable (glog_package_config glog_package_config.cc)
7+
8+
target_link_libraries (glog_package_config PRIVATE glog::glog)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#include <glog/logging.h>
2+
3+
int main(int /*argc*/, char** argv)
4+
{
5+
google::InitGoogleLogging(argv[0]);
6+
}

0 commit comments

Comments
 (0)