Skip to content

Commit

Permalink
Update 'mark_as_superbuild' to support ALL_PROJECTS parameter
Browse files Browse the repository at this point in the history
  • Loading branch information
jcfr committed Dec 9, 2013
1 parent a8701dd commit eda3d85
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 35 deletions.
19 changes: 17 additions & 2 deletions CMake/Testing/SuperBuildTest/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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 "")
Expand All @@ -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")
4 changes: 3 additions & 1 deletion CMake/Testing/SuperBuildTest/LibA/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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")
check_variable(MULTIPROJECT_VAR_WITH_LABELS "MultiProjectVarWithLabels")

check_variable(ALL_PROJECTS_VAR "AllProjectsVar")
20 changes: 20 additions & 0 deletions CMake/Testing/SuperBuildTest/LibB/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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")
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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
Expand All @@ -42,3 +42,7 @@ else()
superbuild_add_empty_external_project(${proj} "${${proj}_DEPENDENCIES}")
endif()

mark_as_superbuild(
VARS LibB_DIR:PATH
LABELS "FIND_PACKAGE"
)
90 changes: 60 additions & 30 deletions CMake/ctkMacroCheckExternalProjectDependency.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,15 @@ endmacro()
#!
#! mark_as_superbuild(
#! VARS <varname1>[:<vartype1>] [<varname2>[:<vartype2>] [...]]
#! [PROJECTS <projectname> [<projectname> [...]]]
#! [PROJECTS <projectname> [<projectname> [...]] | ALL_PROJECTS]
#! [LABELS <label1> [<label2> [...]]]
#! [CMAKE_CMD]
#! )
#!
#! PROJECTS corresponds to a list of <projectname> 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 <varname>:<vartype> to pass to <projectname>
#!
Expand All @@ -86,15 +87,15 @@ endmacro()
#! -D<projectname>_EP_LABEL_<label2>=<varname1>;<varname2>[...]
#!
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})

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()
Expand All @@ -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 ":")
Expand All @@ -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()

#!
Expand Down Expand Up @@ -194,17 +206,20 @@ 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 <varname1>:<vartype1> [<varname2>:<vartype2> [...]]
#! [PROJECTS <projectname> [<projectname> [...]]]
#! [PROJECTS <projectname> [<projectname> [...]] | ALL_PROJECTS]
#! [LABELS <label1> [<label2> [...]]]
#! [CMAKE_CMD]
#! )
#!
#! PROJECTS corresponds to a list of <projectname> 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 <varname>:<vartype> to pass to <projectname>
#!
Expand All @@ -215,19 +230,23 @@ endfunction()
#! -D<projectname>_EP_LABEL_<label2>=<varname1>;<varname2>[...]
#!
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()
set(_sb_PROJECTS ${CMAKE_PROJECT_NAME})
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)
Expand Down Expand Up @@ -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()

Expand Down

0 comments on commit eda3d85

Please sign in to comment.