Skip to content

Commit 77d3511

Browse files
committed
Squashed 'src/cmake/modules/' changes from c77e4360..2b8470d2
2b8470d2 enh: Add BASIS_UNINSTALLER option which is OFF by default dd0490bc enh: Add basis_project_args helper for top-level project() 980ba9bc fix: get_filename_component support for PROGRAM_ARGS and BASE_DIR [BASIS] 6ce89dfb fix: Deprecated CMake policy regarding PROJECT_VERSION setting [Basis] 78fd7ef5 fix: Add INSTALL_<LANG>_SITE_DIR to script module paths [Basis] 69ff6606 fix: Language C++11 requires -std=c++11 flag, not just -std=c++0x [Basis] git-subtree-dir: src/cmake/modules git-subtree-split: 2b8470d29d42aee321a22dfd9ae56653d508a27a
1 parent e9e3155 commit 77d3511

File tree

4 files changed

+113
-51
lines changed

4 files changed

+113
-51
lines changed

BasisSettings.cmake

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ if (POLICY CMP0042)
6464
cmake_policy (SET CMP0042 NEW)
6565
endif ()
6666

67+
if (POLICY CMP0074)
68+
cmake_policy (SET CMP0074 NEW)
69+
endif ()
70+
6771
# ============================================================================
6872
# required modules
6973
# ============================================================================
@@ -833,6 +837,10 @@ mark_as_advanced (BASIS_DEBUG)
833837
option (BASIS_BUILD_ONLY "Request configuration of software build only, skipping steps related to packaging and installation." OFF)
834838
mark_as_advanced (BASIS_BUILD_ONLY)
835839

840+
## @brief Request generation of package uninstaller script upon installation.
841+
option (BASIS_UNINSTALLER "Request generation of default package uninstall script upon installation." OFF)
842+
mark_as_advanced (BASIS_UNINSTALLER)
843+
836844
# ============================================================================
837845
# build configuration
838846
# ============================================================================

CommonTools.cmake

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,35 +1100,38 @@ endmacro ()
11001100
#
11011101
# @sa http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:get_filename_component
11021102
# @sa basis_get_filename_component()
1103-
function (get_filename_component)
1104-
if (ARGC LESS 3)
1105-
message (FATAL_ERROR "[basis_]get_filename_component(): At least three arguments required!")
1106-
elseif (ARGC GREATER 4)
1107-
message (FATAL_ERROR "[basis_]get_filename_component(): Too many arguments!")
1108-
endif ()
1109-
list (GET ARGN 0 VAR)
1110-
list (GET ARGN 1 STR)
1111-
list (GET ARGN 2 CMD)
1112-
if (CMD MATCHES "^EXT")
1113-
_get_filename_component (${VAR} "${STR}" ${CMD})
1103+
function (get_filename_component VAR STR CMP)
1104+
list (FIND ARGN "CACHE" IDX)
1105+
if (IDX EQUAL -1)
1106+
set (OPT_CACHE 0)
1107+
else ()
1108+
list (REMOVE_ITEM ARGN "CACHE")
1109+
set (OPT_CACHE 1)
1110+
endif ()
1111+
if (CMP MATCHES "^EXT")
1112+
_get_filename_component (${VAR} "${STR}" ${CMP} ${ARGN})
11141113
string (REGEX MATCHALL "\\.[^.]*" PARTS "${${VAR}}")
11151114
list (LENGTH PARTS LEN)
11161115
if (LEN GREATER 1)
11171116
math (EXPR LEN "${LEN} - 1")
11181117
list (GET PARTS ${LEN} ${VAR})
11191118
endif ()
1120-
elseif (CMD MATCHES "NAME_WE")
1121-
_get_filename_component (${VAR} "${STR}" NAME)
1119+
elseif (CMP MATCHES "NAME_WE")
1120+
_get_filename_component (${VAR} "${STR}" NAME ${ARGN})
11221121
string (REGEX REPLACE "\\.[^.]*$" "" ${VAR} ${${VAR}})
11231122
else ()
1124-
_get_filename_component (${VAR} "${STR}" ${CMD})
1125-
endif ()
1126-
if (ARGC EQUAL 4)
1127-
if (NOT "^${ARGV3}$" STREQUAL "^CACHE$")
1128-
message (FATAL_ERROR "[basis_]get_filename_component(): Invalid fourth argument: ${ARGV3}!")
1129-
else ()
1130-
set (${VAR} "${${VAR}}" CACHE STRING "")
1123+
_get_filename_component (${VAR} "${STR}" ${CMP} ${ARGN})
1124+
if (CMP MATCHES "PROGRAM")
1125+
list (FIND ARGN "PROGRAM_ARGS" IDX)
1126+
if (NOT IDX EQUAL -1)
1127+
math (EXPR IDX "${IDX} + 1")
1128+
list (GET ARGN ${IDX} ARG_VAR)
1129+
set (${ARG_VAR} "${${ARG_VAR}}" PARENT_SCOPE)
1130+
endif ()
11311131
endif ()
1132+
endif ()
1133+
if (OPT_CACHE)
1134+
set (${VAR} "${${VAR}}" CACHE STRING "")
11321135
else ()
11331136
set (${VAR} "${${VAR}}" PARENT_SCOPE)
11341137
endif ()

ProjectTools.cmake

Lines changed: 75 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1795,6 +1795,69 @@ function (basis_find_logo OUTPUT_VARIABLE SPECIFIED_LOGO DEFAULT_NAME)
17951795
endif ()
17961796
endfunction()
17971797

1798+
1799+
# ----------------------------------------------------------------------------
1800+
## @brief Load project command arguments from BasisProject.cmake file.
1801+
function (basis_project_args VAR)
1802+
1803+
# hide it here to avoid that it shows up in the GUI on error
1804+
set (CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" CACHE INTERNAL "" FORCE)
1805+
1806+
# project meta-data
1807+
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/BasisProject.cmake")
1808+
set (BASIS_basis_project_CALLED FALSE)
1809+
set (PROJECT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
1810+
include ("${CMAKE_CURRENT_SOURCE_DIR}/BasisProject.cmake")
1811+
if (NOT BASIS_basis_project_CALLED)
1812+
message (FATAL_ERROR "Missing basis_project() command in BasisProject.cmake!")
1813+
endif ()
1814+
else ()
1815+
message (FATAL_ERROR "Missing BasisProject.cmake file!")
1816+
endif ()
1817+
1818+
# project command arguments
1819+
set (LANGUAGES)
1820+
foreach (lang IN LISTS PROJECT_LANGUAGES)
1821+
if (lang MATCHES "^(C|CXX)$")
1822+
list (APPEND LANGUAGES ${lang})
1823+
elseif (lang MATCHES "^CXX-?[0-9][0-9x]+$")
1824+
list (APPEND LANGUAGES CXX)
1825+
endif ()
1826+
endforeach ()
1827+
1828+
if (POLICY CMP0048)
1829+
cmake_policy (SET CMP0048 NEW)
1830+
set (_args "${PROJECT_NAME}" VERSION "${PROJECT_VERSION}" LANGUAGES ${LANGUAGES})
1831+
if (CMAKE_VERSION VERSION_LESS 3.9)
1832+
set (PROJECT_DESCRIPTION "${PROJECT_DESCRIPTION}" PARENT_SCOPE)
1833+
elseif (PROJECT_DESCRIPTION)
1834+
list(APPEND _args DESCRIPTION "${PROJECT_DESCRIPTION}")
1835+
endif ()
1836+
if (CMAKE_VERSION VERSION_LESS 3.12)
1837+
set (PROJECT_HOMEPAGE_URL "${PROJECT_PACKAGE_WEBSITE}" PARENT_SCOPE)
1838+
elseif (PROJECT_PACKAGE_WEBSITE)
1839+
list(APPEND _args HOMEPAGE_URL "${PROJECT_PACKAGE_WEBSITE}")
1840+
endif ()
1841+
else ()
1842+
set (_args "${PROJECT_NAME}" ${LANGUAGES})
1843+
basis_version_numbers (
1844+
"${PROJECT_VERSION}"
1845+
PROJECT_VERSION_MAJOR
1846+
PROJECT_VERSION_MINOR
1847+
PROJECT_VERSION_PATCH
1848+
)
1849+
set (PROJECT_VERSION "${PROJECT_VERSION}" PARENT_SCOPE)
1850+
set (PROJECT_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}" PARENT_SCOPE)
1851+
set (PROJECT_VERSION_MINOR "${PROJECT_VERSION_MINOR}" PARENT_SCOPE)
1852+
set (PROJECT_VERSION_PATCH "${PROJECT_VERSION_PATCH}" PARENT_SCOPE)
1853+
set (PROJECT_DESCRIPTION "${PROJECT_DESCRIPTION}" PARENT_SCOPE)
1854+
set (PROJECT_HOMEPAGE_URL "${PROJECT_PACKAGE_WEBSITE}" PARENT_SCOPE)
1855+
endif ()
1856+
1857+
set ("${VAR}" "${_args}" PARENT_SCOPE)
1858+
1859+
endfunction()
1860+
17981861
# ----------------------------------------------------------------------------
17991862
## @brief Initialize project, calls CMake's project() command.
18001863
#
@@ -1830,11 +1893,6 @@ macro (basis_project_initialize)
18301893
cmake_policy (SET CMP0017 NEW)
18311894
endif ()
18321895

1833-
if (POLICY CMP0048)
1834-
# PROJECT_VERSION et al. variables are set by basis_project instead
1835-
cmake_policy (SET CMP0048 OLD)
1836-
endif ()
1837-
18381896
# --------------------------------------------------------------------------
18391897
# reset
18401898

@@ -1863,21 +1921,16 @@ macro (basis_project_initialize)
18631921
endif ()
18641922

18651923
# --------------------------------------------------------------------------
1866-
# project()
1867-
set (LANGUAGES)
1868-
foreach (lang IN LISTS PROJECT_LANGUAGES)
1869-
if (lang MATCHES "^(C|CXX)$")
1870-
list (APPEND LANGUAGES ${lang})
1871-
elseif (lang MATCHES "^CXX-?[0-9][0-9x]+$")
1872-
list (APPEND LANGUAGES CXX)
1873-
endif ()
1874-
endforeach ()
1875-
1876-
project ("${PROJECT_NAME}" ${LANGUAGES})
1924+
# project command
1925+
basis_project_args (_args)
1926+
project (${_args})
1927+
unset (_args)
18771928

18781929
# work-around for issue with CMAKE_PROJECT_NAME always being set to 'Project'
1879-
if ("${PROJECT_SOURCE_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}")
1880-
set_property (CACHE CMAKE_PROJECT_NAME PROPERTY VALUE "${PROJECT_NAME}")
1930+
if (CMAKE_PROJECT_NAME STREQUAL "Project" AND "${PROJECT_SOURCE_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}")
1931+
basis_update_value (CMAKE_PROJECT_NAME "${PROJECT_NAME}")
1932+
basis_update_value (CMAKE_PROJECT_VERSION "${PROJECT_VERSION}")
1933+
basis_update_value (CMAKE_PROJECT_DESCRIPTION "${PROJECT_DESCRIPTION}")
18811934
endif ()
18821935

18831936
# C++ standard
@@ -1888,9 +1941,6 @@ macro (basis_project_initialize)
18881941
if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
18891942
include(CheckCXXCompilerFlag)
18901943
CHECK_CXX_COMPILER_FLAG("-std=c++${CXX_VERSION}" COMPILER_SUPPORTS_CXX${CXX_VERSION})
1891-
if (CXX_VERSION STREQUAL "11" AND NOT COMPILER_SUPPORTS_CXX${CXX_VERSION})
1892-
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX${CXX_VERSION})
1893-
endif ()
18941944
if (COMPILER_SUPPORTS_CXX${CXX_VERSION})
18951945
if (NOT CMAKE_CXX_FLAGS MATCHES "-std=c\\+\\+${CXX_VERSION}")
18961946
if (CMAKE_CXX_FLAGS)
@@ -1899,7 +1949,7 @@ macro (basis_project_initialize)
18991949
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-std=c++${CXX_VERSION}")
19001950
endif ()
19011951
else ()
1902-
message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++${CXX_VERSION} support. Please use a different C++ compiler.")
1952+
message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no full C++${CXX_VERSION} support. Please use a different C++ compiler.")
19031953
endif ()
19041954
endif ()
19051955
else ()
@@ -1927,14 +1977,6 @@ macro (basis_project_initialize)
19271977
set (PROJECT_REVISION 0)
19281978
endif ()
19291979

1930-
# extract version numbers from version string
1931-
basis_version_numbers (
1932-
"${PROJECT_VERSION}"
1933-
PROJECT_VERSION_MAJOR
1934-
PROJECT_VERSION_MINOR
1935-
PROJECT_VERSION_PATCH
1936-
)
1937-
19381980
if (NOT DEFINED PROJECT_SOVERSION OR PROJECT_SOVERSION STREQUAL "")
19391981
set (PROJECT_SOVERSION "${PROJECT_VERSION_MAJOR}")
19401982
endif ()
@@ -2675,7 +2717,9 @@ macro (basis_project_end)
26752717
# Attention: add_uninstall must be called last in a separate file via an
26762718
# add_subdirectory call. This ensures that the code is executed
26772719
# at the end of the root cmake_install.cmake file.
2678-
add_subdirectory ("${BASIS_MODULE_PATH}/uninstall" "${PROJECT_BINARY_DIR}/uninstall")
2720+
if (BASIS_UNINSTALLER)
2721+
add_subdirectory ("${BASIS_MODULE_PATH}/uninstall" "${PROJECT_BINARY_DIR}/uninstall")
2722+
endif ()
26792723
endif ()
26802724

26812725
endif ()

TargetTools.cmake

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2879,6 +2879,13 @@ function (basis_build_script TARGET_UID)
28792879
if (BINARY_${LANGUAGE}_LIBRARY_DIR)
28802880
list (INSERT BUILD_LINK_DEPENDS 0 "${BINARY_${LANGUAGE}_LIBRARY_DIR}")
28812881
endif ()
2882+
if (INSTALL_${LANGUAGE}_SITE_DIR AND NOT BASIS_INSTALL_SITE_PACKAGES)
2883+
if (IS_ABSOLUTE "${INSTALL_${LANGUAGE}_SITE_DIR}")
2884+
list (INSERT INSTALL_LINK_DEPENDS 0 "${INSTALL_${LANGUAGE}_SITE_DIR}")
2885+
else ()
2886+
list (INSERT INSTALL_LINK_DEPENDS 0 "relative ${CMAKE_INSTALL_PREFIX}/${INSTALL_${LANGUAGE}_SITE_DIR}")
2887+
endif ()
2888+
endif ()
28822889
if (INSTALL_${LANGUAGE}_LIBRARY_DIR)
28832890
list (INSERT INSTALL_LINK_DEPENDS 0 "relative ${CMAKE_INSTALL_PREFIX}/${INSTALL_${LANGUAGE}_LIBRARY_DIR}")
28842891
endif ()

0 commit comments

Comments
 (0)