From eda3d853097c753c68d99de655b6e1cedc36875c Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 9 Dec 2013 17:01:11 -0500 Subject: [PATCH] Update 'mark_as_superbuild' to support ALL_PROJECTS parameter See #418 --- CMake/Testing/SuperBuildTest/CMakeLists.txt | 19 +++- .../SuperBuildTest/LibA/CMakeLists.txt | 4 +- .../SuperBuildTest/LibB/CMakeLists.txt | 20 +++++ .../TheExternals/TheExternal_LibB.cmake | 8 +- ...kMacroCheckExternalProjectDependency.cmake | 90 ++++++++++++------- 5 files changed, 106 insertions(+), 35 deletions(-) create mode 100644 CMake/Testing/SuperBuildTest/LibB/CMakeLists.txt diff --git a/CMake/Testing/SuperBuildTest/CMakeLists.txt b/CMake/Testing/SuperBuildTest/CMakeLists.txt index 2f753fa2e3..8f6dc4dcba 100644 --- a/CMake/Testing/SuperBuildTest/CMakeLists.txt +++ b/CMake/Testing/SuperBuildTest/CMakeLists.txt @@ -33,14 +33,23 @@ if(${PROJECT_NAME}_SUPERBUILD) set(LibA_VAR "LibA") mark_as_superbuild(VARS LibA_VAR PROJECTS LibA) + set(LibB_VAR "LibB") + mark_as_superbuild(VARS LibB_VAR PROJECTS LibB) + set(LibA_VAR_WITH_LABELS "LibAWithLabels") mark_as_superbuild(VARS LibA_VAR_WITH_LABELS PROJECTS LibA LABELS "LABEL_A") set(MULTIPROJECT_VAR "MultiProjectVar") - mark_as_superbuild(VARS MULTIPROJECT_VAR PROJECTS ${PROJECT_NAME} LibA) + mark_as_superbuild(VARS MULTIPROJECT_VAR PROJECTS ${PROJECT_NAME} LibA LibB) set(MULTIPROJECT_VAR_WITH_LABELS "MultiProjectVarWithLabels") - mark_as_superbuild(VARS MULTIPROJECT_VAR_WITH_LABELS PROJECTS ${PROJECT_NAME} LibA LABELS "MULTIPROJECT") + mark_as_superbuild(VARS MULTIPROJECT_VAR_WITH_LABELS PROJECTS ${PROJECT_NAME} LibA LibB LABELS "MULTIPROJECT") + + set(ALL_PROJECTS_VAR "AllProjectsVar") + mark_as_superbuild(VARS ALL_PROJECTS_VAR ALL_PROJECTS) + + #set(MULTIPROJECT_VAR_WITH_LABELS "MultiProjectVarWithLabels") + #mark_as_superbuild(VARS MULTIPROJECT_VAR_WITH_LABELS PROJECTS ${PROJECT_NAME} LibA LABELS "MULTIPROJECT") # Since LibC depends on LibD, LibD will also be expected to be found on the system set(${CMAKE_PROJECT_NAME}_USE_SYSTEM_LibC 1) @@ -88,6 +97,10 @@ check_variable(SuperBuildTest_EP_LABEL_FIND_PACKAGE "LibA_DIR") get_filename_component(expected_LibA_DIR "${CMAKE_CURRENT_BINARY_DIR}/../LibA-build" REALPATH) check_variable(LibA_DIR ${expected_LibA_DIR}) +check_variable(SuperBuildTest_EP_LABEL_FIND_PACKAGE "LibB_DIR") +get_filename_component(expected_LibB_DIR "${CMAKE_CURRENT_BINARY_DIR}/../LibB-build" REALPATH) +check_variable(LibB_DIR ${expected_LibB_DIR}) + check_variable(SuperBuildTest_EP_LABEL_USE_SYSTEM "${CMAKE_PROJECT_NAME}_USE_SYSTEM_LibA;${CMAKE_PROJECT_NAME}_USE_SYSTEM_LibB;${CMAKE_PROJECT_NAME}_USE_SYSTEM_LibC;${CMAKE_PROJECT_NAME}_USE_SYSTEM_LibD") check_variable(${CMAKE_PROJECT_NAME}_USE_SYSTEM_LibA "") @@ -99,3 +112,5 @@ check_variable(MULTIPROJECT_VAR "MultiProjectVar") check_variable(SuperBuildTest_EP_LABEL_MULTIPROJECT "MULTIPROJECT_VAR_WITH_LABELS") check_variable(MULTIPROJECT_VAR_WITH_LABELS "MultiProjectVarWithLabels") + +check_variable(ALL_PROJECTS_VAR "AllProjectsVar") diff --git a/CMake/Testing/SuperBuildTest/LibA/CMakeLists.txt b/CMake/Testing/SuperBuildTest/LibA/CMakeLists.txt index dd361b33ae..6c81d4756b 100644 --- a/CMake/Testing/SuperBuildTest/LibA/CMakeLists.txt +++ b/CMake/Testing/SuperBuildTest/LibA/CMakeLists.txt @@ -17,4 +17,6 @@ check_variable(LibA_EP_LABEL_LABEL_A "LibA_VAR_WITH_LABELS") check_variable(MULTIPROJECT_VAR "MultiProjectVar") check_variable(LibA_EP_LABEL_MULTIPROJECT "MULTIPROJECT_VAR_WITH_LABELS") -check_variable(MULTIPROJECT_VAR_WITH_LABELS "MultiProjectVarWithLabels") \ No newline at end of file +check_variable(MULTIPROJECT_VAR_WITH_LABELS "MultiProjectVarWithLabels") + +check_variable(ALL_PROJECTS_VAR "AllProjectsVar") \ No newline at end of file diff --git a/CMake/Testing/SuperBuildTest/LibB/CMakeLists.txt b/CMake/Testing/SuperBuildTest/LibB/CMakeLists.txt new file mode 100644 index 0000000000..4377e1ef6c --- /dev/null +++ b/CMake/Testing/SuperBuildTest/LibB/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 2.8.7) + +project(LibB NONE) + +function(check_variable var_name expected_value) + if(NOT "x${${var_name}}" STREQUAL "x${expected_value}") + message(FATAL_ERROR "Problem with mark_as_superbuild() - CMake variable [${var_name}] is incorrectly set !\n" + "current:${${var_name}}\n" + "expected:${expected_value}") + endif() +endfunction() + +check_variable(LibB_VAR "LibB") + +check_variable(MULTIPROJECT_VAR "MultiProjectVar") + +check_variable(LibB_EP_LABEL_MULTIPROJECT "MULTIPROJECT_VAR_WITH_LABELS") +check_variable(MULTIPROJECT_VAR_WITH_LABELS "MultiProjectVarWithLabels") + +check_variable(ALL_PROJECTS_VAR "AllProjectsVar") \ No newline at end of file diff --git a/CMake/Testing/SuperBuildTest/TheExternals/TheExternal_LibB.cmake b/CMake/Testing/SuperBuildTest/TheExternals/TheExternal_LibB.cmake index 1177a7df61..b848fa3b92 100644 --- a/CMake/Testing/SuperBuildTest/TheExternals/TheExternal_LibB.cmake +++ b/CMake/Testing/SuperBuildTest/TheExternals/TheExternal_LibB.cmake @@ -11,7 +11,7 @@ set(${proj}_DEPENDENCIES LibA) superbuild_include_dependencies(PROJECT_VAR proj) if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj}) - message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !") + message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !") endif() mark_as_superbuild( @@ -28,9 +28,9 @@ if(NOT DEFINED LibB_DIR AND NOT ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj}) ExternalProject_Add(${proj} ${${proj}_EXTERNAL_PROJECT_ARGS} + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${proj} BINARY_DIR ${proj}-build DOWNLOAD_COMMAND "" - CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" DEPENDS @@ -42,3 +42,7 @@ else() superbuild_add_empty_external_project(${proj} "${${proj}_DEPENDENCIES}") endif() +mark_as_superbuild( + VARS LibB_DIR:PATH + LABELS "FIND_PACKAGE" + ) \ No newline at end of file diff --git a/CMake/ctkMacroCheckExternalProjectDependency.cmake b/CMake/ctkMacroCheckExternalProjectDependency.cmake index ecaa9170a3..c6d0f94b6e 100644 --- a/CMake/ctkMacroCheckExternalProjectDependency.cmake +++ b/CMake/ctkMacroCheckExternalProjectDependency.cmake @@ -68,7 +68,7 @@ endmacro() #! #! mark_as_superbuild( #! VARS [:] [[:] [...]] -#! [PROJECTS [ [...]]] +#! [PROJECTS [ [...]] | ALL_PROJECTS] #! [LABELS [ [...]]] #! [CMAKE_CMD] #! ) @@ -76,6 +76,7 @@ endmacro() #! PROJECTS corresponds to a list of that will be added using 'ExternalProject_Add' function. #! If not specified and called within a project file, it defaults to the value of 'SUPERBUILD_TOPLEVEL_PROJECT' #! Otherwise, it defaults to 'CMAKE_PROJECT_NAME'. +#! If instead 'ALL_PROJECTS' is specified, the variables and labels will be passed to all projects. #! #! VARS is an expected list of variables specified as : to pass to #! @@ -86,7 +87,7 @@ endmacro() #! -D_EP_LABEL_=;[...] #! function(mark_as_superbuild) - set(options CMAKE_CMD) + set(options ALL_PROJECTS CMAKE_CMD) set(oneValueArgs) set(multiValueArgs VARS PROJECTS LABELS) cmake_parse_arguments(_sb "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -94,7 +95,7 @@ function(mark_as_superbuild) set(_vars ${_sb_UNPARSED_ARGUMENTS}) set(_named_parameters_expected 0) - if(_sb_PROJECTS OR _sb_LABELS OR _sb_VARS) + if(_sb_PROJECTS OR _sb_ALL_PROJECTS OR _sb_LABELS OR _sb_VARS) set(_named_parameters_expected 1) set(_vars ${_sb_VARS}) endif() @@ -103,6 +104,10 @@ function(mark_as_superbuild) message(FATAL_ERROR "Arguments '${_sb_UNPARSED_ARGUMENTS}' should be associated with VARS parameter !") endif() + if(_sb_PROJECTS AND _sb_ALL_PROJECTS) + message(FATAL_ERROR "Arguments 'PROJECTS' and 'ALL_PROJECTS' are mutually exclusive !") + endif() + foreach(var ${_vars}) set(_type_specified 0) if(${var} MATCHES ":") @@ -126,7 +131,14 @@ function(mark_as_superbuild) set(optional_arg_CMAKE_CMD "CMAKE_CMD") endif() - _sb_append_to_cmake_args(VARS ${_vars_with_type} PROJECTS ${_sb_PROJECTS} LABELS ${_sb_LABELS} ${optional_arg_CMAKE_CMD}) + if(_sb_ALL_PROJECTS) + set(optional_arg_ALL_PROJECTS "ALL_PROJECTS") + else() + set(optional_arg_ALL_PROJECTS PROJECTS ${_sb_PROJECTS}) + endif() + + _sb_append_to_cmake_args( + VARS ${_vars_with_type} LABELS ${_sb_LABELS} ${optional_arg_ALL_PROJECTS} ${optional_arg_CMAKE_CMD}) endfunction() #! @@ -194,10 +206,12 @@ function(_sb_cmakevar_to_cmakearg cmake_varname_and_type cmake_arg_var cmake_arg endif() endfunction() +set(_ALL_PROJECT_IDENTIFIER "ALLALLALL") + #! #! _sb_append_to_cmake_args( #! VARS : [: [...]] -#! [PROJECTS [ [...]]] +#! [PROJECTS [ [...]] | ALL_PROJECTS] #! [LABELS [ [...]]] #! [CMAKE_CMD] #! ) @@ -205,6 +219,7 @@ endfunction() #! PROJECTS corresponds to a list of that will be added using 'ExternalProject_Add' function. #! If not specified and called within a project file, it defaults to the value of 'SUPERBUILD_TOPLEVEL_PROJECT' #! Otherwise, it defaults to 'CMAKE_PROJECT_NAME'. +#! If instead 'ALL_PROJECTS' is specified, the variables and labels will be passed to all projects. #! #! VARS is an expected list of variables specified as : to pass to #! @@ -215,12 +230,12 @@ endfunction() #! -D_EP_LABEL_=;[...] #! function(_sb_append_to_cmake_args) - set(options CMAKE_CMD) + set(options ALL_PROJECTS CMAKE_CMD) set(oneValueArgs) set(multiValueArgs VARS PROJECTS LABELS) cmake_parse_arguments(_sb "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - if(NOT _sb_PROJECTS) + if(NOT _sb_PROJECTS AND NOT _sb_ALL_PROJECTS) if(SUPERBUILD_TOPLEVEL_PROJECT) set(_sb_PROJECTS ${SUPERBUILD_TOPLEVEL_PROJECT}) else() @@ -228,6 +243,10 @@ function(_sb_append_to_cmake_args) endif() endif() + if(_sb_ALL_PROJECTS) + set(_sb_PROJECTS ${_ALL_PROJECT_IDENTIFIER}) + endif() + foreach(_sb_PROJECT ${_sb_PROJECTS}) set(_cmake_arg_type "CMAKE_CACHE") if(_sb_CMAKE_CMD) @@ -260,40 +279,51 @@ function(_sb_get_external_project_arguments proj varname) mark_as_superbuild(${SUPERBUILD_TOPLEVEL_PROJECT}_USE_SYSTEM_${proj}:BOOL) - # Set list of CMake args associated with each label - get_property(_labels GLOBAL PROPERTY ${proj}_EP_LABELS) - if(_labels) - list(REMOVE_DUPLICATES _labels) - foreach(label ${_labels}) - get_property(${proj}_EP_LABEL_${label} GLOBAL PROPERTY ${proj}_EP_LABEL_${label}) - list(REMOVE_DUPLICATES ${proj}_EP_LABEL_${label}) - _sb_append_to_cmake_args(PROJECTS ${proj} - VARS ${proj}_EP_LABEL_${label}:STRING) - endforeach() - endif() + function(_sb_collect_args proj) + # Set list of CMake args associated with each label + get_property(_labels GLOBAL PROPERTY ${proj}_EP_LABELS) + if(_labels) + list(REMOVE_DUPLICATES _labels) + foreach(label ${_labels}) + get_property(${proj}_EP_LABEL_${label} GLOBAL PROPERTY ${proj}_EP_LABEL_${label}) + list(REMOVE_DUPLICATES ${proj}_EP_LABEL_${label}) + _sb_append_to_cmake_args(PROJECTS ${proj} + VARS ${proj}_EP_LABEL_${label}:STRING) + endforeach() + endif() - foreach(cmake_arg_type CMAKE_CMD CMAKE_CACHE) + foreach(cmake_arg_type CMAKE_CMD CMAKE_CACHE) - set(_ep_property "CMAKE_CACHE_ARGS") - if(cmake_arg_type STREQUAL "CMAKE_CMD") - set(_ep_property "CMAKE_ARGS") - endif() + set(_ep_property "CMAKE_CACHE_ARGS") + if(cmake_arg_type STREQUAL "CMAKE_CMD") + set(_ep_property "CMAKE_ARGS") + endif() + + get_property(_args GLOBAL PROPERTY ${proj}_EP_${_ep_property}) + foreach(var ${_args}) + _sb_cmakevar_to_cmakearg(${var} cmake_arg ${cmake_arg_type}) + set_property(GLOBAL APPEND PROPERTY ${proj}_EP_PROPERTY_${_ep_property} ${cmake_arg}) + endforeach() - get_property(_args GLOBAL PROPERTY ${proj}_EP_${_ep_property}) - foreach(var ${_args}) - _sb_cmakevar_to_cmakearg(${var} cmake_arg ${cmake_arg_type}) - set_property(GLOBAL APPEND PROPERTY ${proj}_EP_PROPERTY_${_ep_property} ${cmake_arg}) endforeach() + endfunction() - endforeach() + _sb_collect_args(${proj}) + _sb_collect_args(${_ALL_PROJECT_IDENTIFIER}) set(_ep_arguments "") - get_property(_properties GLOBAL PROPERTY ${proj}_EP_PROPERTIES) + get_property(_proj_properties GLOBAL PROPERTY ${proj}_EP_PROPERTIES) + get_property(_all_properties GLOBAL PROPERTY ${_ALL_PROJECT_IDENTIFIER}_EP_PROPERTIES) + set(_properties ${_proj_properties} ${_all_properties}) if(_properties) list(REMOVE_DUPLICATES _properties) foreach(property ${_properties}) get_property(${proj}_EP_PROPERTY_${property} GLOBAL PROPERTY ${proj}_EP_PROPERTY_${property}) - list(APPEND _ep_arguments ${property} ${${proj}_EP_PROPERTY_${property}}) + get_property(${_ALL_PROJECT_IDENTIFIER}_EP_PROPERTY_${property} GLOBAL PROPERTY ${_ALL_PROJECT_IDENTIFIER}_EP_PROPERTY_${property}) + if(${proj}_EP_PROPERTY_${property} OR ${_ALL_PROJECT_IDENTIFIER}_EP_PROPERTY_${property}) + list(APPEND _ep_arguments ${property} + ${${proj}_EP_PROPERTY_${property}} ${${_ALL_PROJECT_IDENTIFIER}_EP_PROPERTY_${property}}) + endif() endforeach() endif()