Skip to content

Commit 8c9868f

Browse files
committed
Added functions for checking out repos at configure time for issue commontk#266.
For now, the repositories ExternalProjectsContrib and PluginsContrib are checked out during the super build if CTK_USE_CONTRIBUTED_PLUGINS is ON. Providing a _DIR variable disables the checkout and makes the build system use the repositories pointed to by the _DIR variable. Things to do: - Use a VCS agnostic way of providing checkout information - Use some kind of configuration file (CMake initial cache file?) to add a configurable amount of external repositories to the CTK build system.
1 parent 00694c9 commit 8c9868f

7 files changed

+177
-4
lines changed

CMake/ctkBlockCheckDependencies.cmake

+5-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,11 @@ if(NOT DEFINED CTK_POSSIBLE_DEPENDENCIES)
8787
message(FATAL_ERROR "error: CTK_POSSIBLE_DEPENDENCIES variable is not defined !")
8888
endif()
8989
foreach(p ${CTK_POSSIBLE_DEPENDENCIES})
90-
include(CMakeExternals/${p}.cmake)
90+
if(${p}_FILEPATH)
91+
include(${${p}_FILEPATH})
92+
else()
93+
include(CMakeExternals/${p}.cmake)
94+
endif()
9195
endforeach()
9296

9397
#message("CTK_POSSIBLE_DEPENDENCIES:")

CMake/ctkCheckoutRepo.cmake.in

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
project(${_NAME})
3+
4+
cmake_minimum_required(VERSION 2.8.4)
5+
6+
include(ExternalProject)
7+
8+
ExternalProject_Add(${_NAME}
9+
SOURCE_DIR ${_CHECKOUT_DIR}/${_NAME}
10+
BINARY_DIR bin
11+
PREFIX ep
12+
GIT_REPOSITORY ${_GIT_PROTOCOL}://${_GIT_URL}
13+
GIT_TAG ${_GIT_TAG}
14+
UPDATE_COMMAND ""
15+
CONFIGURE_COMMAND ""
16+
BUILD_COMMAND ""
17+
INSTALL_COMMAND ""
18+
)
19+

CMake/ctkFunctionAddPluginRepo.cmake

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
function(ctkFunctionAddPluginRepo)
2+
3+
ctkMacroParseArguments("" "NAME;GIT_URL;GIT_TAG;GIT_PROTOCOL" "" ${ARGN})
4+
5+
foreach(_required_arg NAME GIT_URL)
6+
if(NOT _${_required_arg})
7+
message(FATAL_ERROR "${_required_arg} is empty")
8+
endif()
9+
endforeach()
10+
11+
ctkFunctionCheckoutRepo(
12+
NAME ${_NAME}
13+
GIT_URL ${_GIT_URL}
14+
GIT_TAG ${_GIT_TAG}
15+
GIT_PROTOCOL ${_GIT_PROTOCOL}
16+
)
17+
18+
set(_gitmodules_files ${${_NAME}_DIR}/.gitmodules)
19+
if(NOT EXISTS ${_gitmodules_files})
20+
message(FATAL_ERROR "The repository at ${${_NAME}_DIR} does not contain a .gitmodules file")
21+
endif()
22+
23+
# Parse the .gitmodules file and add the submodules as contributed plugins
24+
file(STRINGS "${_gitmodules_files}" _plugin_paths REGEX "path =.*")
25+
foreach(_plugin_path ${_plugin_paths})
26+
string(REPLACE " = " ";" _plugin_path_list ${_plugin_path})
27+
list(GET _plugin_path_list 1 _plugin_name)
28+
ctk_plugin_option(${_plugin_name} "Build the ${_plugin_name} plugin." OFF)
29+
30+
# Push the value which might have been changed in ctk_plugin_option to the parent scope
31+
set(CTK_PLUGIN_${_plugin_name} ${CTK_PLUGIN_${_plugin_name}} PARENT_SCOPE)
32+
33+
set(${_plugin_name}_SOURCE_DIR ${${_NAME}_DIR}/${_plugin_name})
34+
set(${_plugin_name}_SOURCE_DIR ${${_plugin_name}_SOURCE_DIR} PARENT_SCOPE)
35+
36+
if(CTK_PLUGIN_${_plugin_name} AND NOT EXISTS ${${_plugin_name}_SOURCE_DIR})
37+
execute_process(
38+
COMMAND ${GIT_EXECUTABLE} submodule update ${_plugin_name}
39+
WORKING_DIRECTORY ${${_NAME}_DIR}
40+
RESULT_VARIABLE return_code
41+
ERROR_VARIABLE error_msg
42+
)
43+
if(return_code)
44+
message(FATAL_ERROR "Could not invoke git submodule update for ${${_plugin_name}_SOURCE_DIR}")
45+
endif()
46+
endif()
47+
endforeach()
48+
49+
set(CTK_PLUGINS ${CTK_PLUGINS} PARENT_SCOPE)
50+
set(${_NAME}_DIR ${${_NAME}_DIR} PARENT_SCOPE)
51+
52+
endfunction()

CMake/ctkFunctionCheckoutRepo.cmake

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
function(ctkFunctionCheckoutRepo)
2+
3+
ctkMacroParseArguments("" "NAME;GIT_URL;GIT_TAG;GIT_PROTOCOL;CHECKOUT_DIR" "" ${ARGN})
4+
5+
if(${_NAME}_DIR)
6+
# if a *_DIR variable is supplied, the repository is not cloned.
7+
return()
8+
endif()
9+
10+
foreach(_required_arg NAME GIT_URL)
11+
if(NOT _${_required_arg})
12+
message(FATAL_ERROR "${_required_arg} is empty")
13+
endif()
14+
endforeach()
15+
16+
if(NOT _GIT_PROTOCOL)
17+
set(_GIT_PROTOCOL ${git_protocol})
18+
endif()
19+
if(NOT _CHECKOUT_DIR)
20+
set(_CHECKOUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
21+
endif()
22+
if(NOT IS_ABSOLUTE "${_CHECKOUT_DIR}")
23+
message(FATAL_ERROR "The value of the CHECKOUT_DIR argument must be an absolute path.")
24+
endif()
25+
26+
if(NOT _GIT_TAG)
27+
set(_GIT_TAG origin/master)
28+
endif()
29+
30+
set(_repo_build_dir ${CMAKE_CURRENT_BINARY_DIR}/${_NAME}-proj)
31+
configure_file(${CTK_CMAKE_DIR}/ctkCheckoutRepo.cmake.in
32+
${_repo_build_dir}/CMakeLists.txt)
33+
34+
execute_process(
35+
COMMAND ${CMAKE_COMMAND} .
36+
WORKING_DIRECTORY ${_repo_build_dir}
37+
RESULT_VARIABLE _result_code
38+
ERROR_VARIABLE _err_msg
39+
)
40+
if(_result_code)
41+
message(FATAL_ERROR "Configuring directory ${_repo_build_dir} failed: ${_err_msg}")
42+
endif()
43+
44+
execute_process(
45+
COMMAND ${CMAKE_COMMAND} --build ${_repo_build_dir}
46+
RESULT_VARIABLE _result_code
47+
ERROR_VARIABLE _err_msg
48+
)
49+
if(_result_code)
50+
message(FATAL_ERROR "Building directory ${_repo_build_dir} failed: ${_err_msg}")
51+
endif()
52+
53+
set(${_NAME}_DIR ${_CHECKOUT_DIR}/${_NAME} PARENT_SCOPE)
54+
55+
endfunction()

CMake/ctkMacroTargetLibraries.cmake

+5-1
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,11 @@ macro(ctkMacroCollectAllTargetLibraries targets subdir varname)
173173
set(option_name ${option_prefix}${target})
174174
#message(STATUS option_name:${option_name})
175175

176-
set(target_dir "${CTK_SOURCE_DIR}/${subdir}/${target}")
176+
if(${target}_SOURCE_DIR)
177+
set(target_dir "${${target}_SOURCE_DIR}")
178+
else()
179+
set(target_dir "${CTK_SOURCE_DIR}/${subdir}/${target}")
180+
endif()
177181
#message(STATUS target_dir:${target_dir})
178182

179183
set(target_libraries)

CMakeLists.txt

+38-2
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,9 @@ include(CMake/ctkFunctionGenerateDGraphInput.cmake)
197197
include(CMake/ctkFunctionGenerateProjectXml.cmake)
198198
include(CMake/ctkFunctionGeneratePluginManifest.cmake)
199199
include(CMake/ctkMacroGeneratePluginResourceFile.cmake)
200+
include(CMake/ctkFunctionAddPluginRepo.cmake)
200201
include(CMake/ctkFunctionCheckCompilerFlags.cmake)
202+
include(CMake/ctkFunctionCheckoutRepo.cmake)
201203
include(CMake/ctkFunctionGetIncludeDirs.cmake)
202204
include(CMake/ctkFunctionGetLibraryDirs.cmake)
203205
include(CMake/ctkFunctionGetGccVersion.cmake)
@@ -630,6 +632,13 @@ ctk_plugin_option(org.commontk.eventbus
630632
"Build the org.commontk.eventbus plugin." OFF
631633
CTK_APP_ctkEventBusDemo)
632634

635+
# Add the PluginsContrib repo to the build system
636+
option(CTK_USE_CONTRIBUTED_PLUGINS OFF "Use CTK plug-ins from the PluginsContrib repository")
637+
mark_as_advanced(CTK_USE_CONTRIBUTED_PLUGINS)
638+
if(CTK_USE_CONTRIBUTED_PLUGINS)
639+
ctkFunctionAddPluginRepo(NAME PluginsContrib GIT_URL github.com/commontk/PluginsContrib.git)
640+
endif()
641+
633642
#-----------------------------------------------------------------------------
634643
# Generate target_directories list - List of directory corresponding to the different
635644
# libraries, plugins and applications associated with the corresponding option name.
@@ -663,7 +672,11 @@ foreach(lib ${CTK_LIBS})
663672
endforeach()
664673

665674
foreach(plugin ${CTK_PLUGINS})
666-
list(APPEND target_directories "${CMAKE_CURRENT_SOURCE_DIR}/Plugins/${plugin}^^CTK_PLUGIN_${plugin}")
675+
if(${plugin}_SOURCE_DIR)
676+
list(APPEND target_directories "${${plugin}_SOURCE_DIR}^^CTK_PLUGIN_${plugin}")
677+
else()
678+
list(APPEND target_directories "${CMAKE_CURRENT_SOURCE_DIR}/Plugins/${plugin}^^CTK_PLUGIN_${plugin}")
679+
endif()
667680
endforeach()
668681

669682
foreach(app ${CTK_APPS})
@@ -800,6 +813,25 @@ set(CTK_POSSIBLE_DEPENDENCIES
800813
XIP
801814
ITK
802815
)
816+
817+
#-----------------------------------------------------------------------------
818+
# Check out the ExternalProjectsContrib repository
819+
if(CTK_USE_CONTRIBUTED_PLUGINS)
820+
if(CTK_SUPERBUILD)
821+
ctkFunctionCheckoutRepo(
822+
NAME ExternalProjectsContrib
823+
GIT_URL github.com/commontk/ExternalProjectsContrib.git
824+
)
825+
endif()
826+
827+
file(GLOB _contrib_scripts ${ExternalProjectsContrib_DIR}/*.cmake)
828+
foreach(_contrib_script ${_contrib_scripts})
829+
get_filename_component(_script_name ${_contrib_script} NAME_WE)
830+
list(APPEND CTK_POSSIBLE_DEPENDENCIES ${_script_name})
831+
set(${_script_name}_FILEPATH ${_contrib_script})
832+
endforeach()
833+
endif()
834+
803835
set(CTK_DEPENDENCIES) # This variable will contain the list of required CTK dependencies
804836
include(CMake/ctkBlockCheckDependencies.cmake)
805837

@@ -914,7 +946,11 @@ endif()
914946
#
915947
foreach(plugin ${CTK_PLUGINS})
916948
if(CTK_PLUGIN_${plugin})
917-
add_subdirectory(Plugins/${plugin})
949+
if(${plugin}_SOURCE_DIR)
950+
add_subdirectory(${${plugin}_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/Plugins/${plugin})
951+
else()
952+
add_subdirectory(Plugins/${plugin})
953+
endif()
918954
endif()
919955
endforeach()
920956

SuperBuild.cmake

+3
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ set(ctk_cmake_boolean_args
7979
CTK_BUILD_QTDESIGNER_PLUGINS
8080
CTK_USE_QTTESTING
8181
CTK_USE_KWSTYLE
82+
CTK_USE_CONTRIBUTED_PLUGINS
8283
WITH_COVERAGE
8384
DOCUMENTATION_TARGET_IN_ALL
8485
CTK_WRAP_PYTHONQT_FULL
@@ -156,6 +157,8 @@ ExternalProject_Add(${proj}
156157
-DCTK_INSTALL_INCLUDE_DIR:STRING=${CTK_INSTALL_INCLUDE_DIR}
157158
-DCTK_INSTALL_DOC_DIR:STRING=${CTK_INSTALL_DOC_DIR}
158159
-DCTK_EXTERNAL_LIBRARY_DIRS:STRING=${CTK_EXTERNAL_LIBRARY_DIRS}
160+
-DExternalProjectsContrib_DIR:STRING=${ExternalProjectsContrib_DIR}
161+
-DPluginsContrib_DIR:STRING=${PluginsContrib_DIR}
159162
-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}
160163
${CTK_SUPERBUILD_EP_ARGS}
161164
-DCTK_SUPERBUILD_EP_VARNAMES:STRING=${CTK_SUPERBUILD_EP_VARNAMES}

0 commit comments

Comments
 (0)