cmake_minimum_required(VERSION 3.20.0) project(superpro LANGUAGES NONE) add_subdirectory(superpro) include(Subproject.cmake) add_subproject(static_lib DIR subpro_a_static_lib) add_subproject(shared_lib DIR subpro_b_shared_lib) add_subproject(nested_lib DIR subpro_c_nested_lib NO_INSTALL) add_subproject(executable DIR subpro_d_executable DEPENDS static_lib shared_lib nested_lib ) include(CTest) if(BUILD_TESTING) enable_language(CXX) # required by GNUInstallDirs include(GNUInstallDirs) macro(testme _name _path _symlink) add_test( NAME "${_name}" WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" COMMAND "${CMAKE_COMMAND}" "-DFILE_PATH=${CMAKE_INSTALL_PREFIX}/${_path}" "-DEXPECT_SYMLINK:BOOL=${_symlink}" "-DEXPECT_ABSOLUTE:BOOL=${ARGN}" "-P" "${CMAKE_SOURCE_DIR}/Test.cmake" ) endmacro() set(_mode $ENV{CMAKE_INSTALL_MODE}) if(NOT "${_mode}" OR "${_mode}" STREQUAL "COPY") set(expect_symlink NO) elseif("${_mode}" MATCHES "(REL_)?SYMLINK(_OR_COPY)?") set(expect_symlink YES) set(expect_absolute NO) elseif("${_mode}" MATCHES "ABS_SYMLINK(_OR_COPY)?") set(expect_symlink YES) set(expect_absolute YES) endif() # toplevel project should respect CMAKE_INSTALL_MODE testme(superproj_file_copy "file_copy.txt" NO) testme(superproj_file_copy_file "file_copy_file.txt" NO) testme(superproj_file_install "file_install.txt" ${expect_symlink} ${expect_absolute}) testme(superproj_file_create_link_symbolic "file_create_link_symbolic.txt" YES YES) # subprojects should receive and respect CMAKE_INSTALL_MODE too testme(subpro_a_static_lib_header "${CMAKE_INSTALL_INCLUDEDIR}/static_lib.h" ${expect_symlink} ${expect_absolute} ) testme(subpro_a_static_lib_libfile "${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}the_static_lib${CMAKE_STATIC_LIBRARY_SUFFIX}" ${expect_symlink} ${expect_absolute} ) testme(subpro_b_shared_lib_header "${CMAKE_INSTALL_INCLUDEDIR}/shared_lib.h" ${expect_symlink} ${expect_absolute} ) if(CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG AND "${CMAKE_CXX_CREATE_SHARED_MODULE}" MATCHES "SONAME_FLAG") # due to semver, this is always a link testme(subpro_b_shared_lib_libfile "${CMAKE_INSTALL_LIBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}the_shared_lib${CMAKE_SHARED_LIBRARY_SUFFIX}" YES ${expect_absolute} ) # this is the actual shared lib, so should follow CMAKE_INSTALL_MODE rules testme(subpro_b_shared_lib_libfile_versuffix "${CMAKE_INSTALL_LIBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}the_shared_lib${CMAKE_SHARED_LIBRARY_SUFFIX}.2.3.4" ${expect_symlink} ${expect_absolute} ) endif() testme(subpro_d_executable_exefile "${CMAKE_INSTALL_BINDIR}/the_executable${CMAKE_EXECUTABLE_SUFFIX}" ${expect_symlink} ${expect_absolute} ) # nested subprojects should receive and respect CMAKE_INSTALL_MODE too testme(subsubpro_c1_header "${CMAKE_INSTALL_INCLUDEDIR}/c1_lib.h" ${expect_symlink} ${expect_absolute} ) testme(subsubpro_c1_libfile "${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}the_c1_lib${CMAKE_STATIC_LIBRARY_SUFFIX}" ${expect_symlink} ${expect_absolute} ) testme(subsubpro_c2_header "${CMAKE_INSTALL_INCLUDEDIR}/c2_lib.h" ${expect_symlink} ${expect_absolute} ) testme(subsubpro_c2_libfile "${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}the_c2_lib${CMAKE_STATIC_LIBRARY_SUFFIX}" ${expect_symlink} ${expect_absolute} ) endif()