Files
ThirdParty-6/ParaView-5.0.1/CMake/ParaViewModuleTop.cmake

287 lines
9.5 KiB
CMake

#------------------------------------------------------------------------------
# This file is based on vtkModuleTop.cmake. The role of this is to kick start
# the processing of all modules.
#
# When using internal-VTK, this simply adds the VTK subdir and lets VTK do it's
# thing after having ensured that VTK can find and detect the additional modules
# ParaView adds.
#
# When using external-VTK, this behaves a lot like vtkModuleTop.cmake,
# processing the modules that ParaView adds, ensuring we use modules from
# external VTK as applicable.
#------------------------------------------------------------------------------
# Figure out which languages are being wrapped, and add them to the list.
if(BUILD_TESTING)
set(_test_languages "Cxx")
if(PARAVIEW_ENABLE_PYTHON)
list(APPEND _test_languages "Python")
endif()
if(VTK_WRAP_JAVA)
list(APPEND _test_languages "Java")
endif()
else()
set(_test_languages "")
endif()
#----------------------------------------------------------------------
# Load the module DAG.
# Assess modules, and tests in the repository.
foreach (source_dir IN LISTS PARAVIEW_MODULE_ROOTS)
file(GLOB_RECURSE files RELATIVE
"${CMAKE_CURRENT_SOURCE_DIR}" "${source_dir}/module.cmake")
foreach (module_cmake IN LISTS files)
get_filename_component(base "${module_cmake}" PATH)
if (PARAVIEW_USING_EXTERNAL_VTK)
vtk_add_module(
"${CMAKE_CURRENT_SOURCE_DIR}/${base}"
module.cmake
"${CMAKE_CURRENT_BINARY_DIR}/${base}"
${_test_languages})
else()
# Simply add to module-search paths for VTK and let VTK deal with it.
vtk_add_to_module_search_path(
"${CMAKE_CURRENT_SOURCE_DIR}/${base}"
"${CMAKE_CURRENT_BINARY_DIR}/${base}")
endif()
endforeach()
endforeach()
if (NOT PARAVIEW_USING_EXTERNAL_VTK)
# include VTK
set (old_build_examples ${BUILD_EXAMPLES})
set (BUILD_EXAMPLES FALSE CACHE BOOL "" FORCE)
add_subdirectory(VTK)
set (BUILD_EXAMPLES ${old_build_examples} CACHE BOOL "" FORCE)
include(${ParaView_BINARY_DIR}/VTK/VTKConfig.cmake)
return()
endif()
include(vtkGroups)
# Validate the module DAG.
macro(vtk_module_check vtk-module _needed_by stack)
list(FIND VTK_MODULES_ENABLED ${vtk-module} _found)
if (_found EQUAL -1)
if(NOT ${vtk-module}_DECLARED)
# Check if the module has been imported.
#message(FATAL_ERROR "No such module \"${vtk-module}\" needed by \"${_needed_by}\"")
set(check_finished_${vtk-module} 1)
endif()
if(check_started_${vtk-module} AND NOT check_finished_${vtk-module})
# We reached a module while traversing its own dependencies recursively.
set(msg "")
foreach(entry ${stack})
set(msg " ${entry} =>${msg}")
if("${entry}" STREQUAL "${vtk-module}")
break()
endif()
endforeach()
message(FATAL_ERROR "Module dependency cycle detected:\n ${msg} ${vtk-module}")
elseif(NOT check_started_${vtk-module})
# Traverse dependencies of this module. Mark the start and finish.
set(check_started_${vtk-module} 1)
foreach(dep IN LISTS ${vtk-module}_DEPENDS)
vtk_module_check(${dep} ${vtk-module} "${vtk-module};${stack}")
endforeach()
set(check_finished_${vtk-module} 1)
endif()
endif()
endmacro()
foreach(vtk-module ${VTK_MODULES_ALL})
vtk_module_check("${vtk-module}" "" "")
endforeach()
#----------------------------------------------------------------------
# Provide an option for each module.
foreach(vtk-module ${VTK_MODULES_ALL})
if(NOT ${vtk-module}_IS_TEST)
option(Module_${vtk-module} "Request building ${vtk-module}"
${${vtk-module}_DEFAULT})
mark_as_advanced(Module_${vtk-module})
if(${vtk-module}_EXCLUDE_FROM_ALL)
set(${vtk-module}_IN_ALL 0)
else()
set(${vtk-module}_IN_ALL ${VTK_BUILD_ALL_MODULES})
endif()
endif()
endforeach()
# Follow dependencies.
macro(vtk_module_enable vtk-module _needed_by)
if(NOT Module_${vtk-module})
list(APPEND ${vtk-module}_NEEDED_BY ${_needed_by})
endif()
if(NOT ${vtk-module}_ENABLED)
set(${vtk-module}_ENABLED 1)
foreach(dep IN LISTS ${vtk-module}_DEPENDS)
vtk_module_enable(${dep} ${vtk-module})
endforeach()
# If VTK_BUILD_ALL_MODULES_FOR_TESTS is true, then and then
# alone do we include the test modules in building build the dependency
# graph for enabled modules (BUG #13297).
if (VTK_BUILD_ALL_MODULES_FOR_TESTS)
foreach(test IN LISTS ${vtk-module}_TESTED_BY)
vtk_module_enable(${test} "")
endforeach()
elseif (BUILD_TESTING)
# identify vtkTesting<> dependencies on the test module and enable them.
# this ensures that core testing modules such as vtkTestingCore,
# vtkTestingRendering which many test modules depend on, are automatically
# enabled.
foreach(test IN LISTS ${vtk-module}_TESTED_BY)
foreach(test-depends IN LISTS ${test}_DEPENDS)
if (test-depends MATCHES "^vtkTesting.*")
vtk_module_enable(${test-depends} "")
endif()
endforeach()
endforeach()
endif()
endif()
endmacro()
foreach(vtk-module ${VTK_MODULES_ALL})
if(Module_${vtk-module} OR ${vtk-module}_IN_ALL)
vtk_module_enable("${vtk-module}" "")
elseif(${vtk-module}_REQUEST_BY)
vtk_module_enable("${vtk-module}" "${${vtk-module}_REQUEST_BY}")
endif()
endforeach()
foreach(vtk-module ${VTK_MODULES_ALL})
# Exclude modules that exist only to test this module
# from the report of modules that need this one. They
# are enabled exactly because this module is enabled.
if(${vtk-module}_NEEDED_BY AND ${vtk-module}_TESTED_BY)
list(REMOVE_ITEM ${vtk-module}_NEEDED_BY "${${vtk-module}_TESTED_BY}")
endif()
endforeach()
# Build final list of enabled modules.
set(PV_MODULES_ENABLED "")
set(PV_MODULES_DISABLED "")
foreach(vtk-module ${VTK_MODULES_ALL})
if(${vtk-module}_ENABLED)
list(APPEND PV_MODULES_ENABLED ${vtk-module})
else()
list(APPEND PV_MODULES_DISABLED ${vtk-module})
endif()
endforeach()
if (NOT PV_MODULES_ENABLED)
message(WARNING "No modules enabled!")
return()
endif()
list(SORT PV_MODULES_ENABLED) # Deterministic order.
list(SORT PV_MODULES_DISABLED) # Deterministic order.
# Order list to satisfy dependencies.
include(TopologicalSort)
topological_sort(PV_MODULES_ENABLED "" _DEPENDS)
# topological_sort() ends up bringing in VTK modules that were imported, so we
# explicitly remove them before proceeding further.
if (VTK_MODULES_ENABLED)
list(REMOVE_ITEM PV_MODULES_ENABLED ${VTK_MODULES_ENABLED})
list(REMOVE_ITEM PV_MODULES_DISABLED ${VTK_MODULES_ENABLED})
endif()
# Report what will be built.
set(_modules_enabled_alpha "${PV_MODULES_ENABLED}")
list(SORT _modules_enabled_alpha)
list(REMOVE_ITEM _modules_enabled_alpha vtkWrappingJava vtkWrappingPythonCore)
list(LENGTH _modules_enabled_alpha _length)
message(STATUS "Enabled ${_length} modules:")
foreach(vtk-module ${_modules_enabled_alpha})
if(NOT ${vtk-module}_IS_TEST)
if(Module_${vtk-module})
set(_reason ", requested by Module_${vtk-module}.")
elseif(${vtk-module}_IN_ALL)
set(_reason ", requested by VTK_BUILD_ALL_MODULES.")
else()
set(_needed_by "${${vtk-module}_NEEDED_BY}")
list(SORT _needed_by)
list(LENGTH _needed_by _length)
if(_length GREATER "1")
set(_reason ", needed by ${_length} modules:")
foreach(dep ${_needed_by})
set(_reason "${_reason}\n ${dep}")
endforeach()
else()
set(_reason ", needed by ${_needed_by}.")
endif()
endif()
message(STATUS " * ${vtk-module}${_reason}")
endif()
endforeach()
# Hide options for modules that will build anyway.
foreach(vtk-module ${VTK_MODULES_ALL})
if(NOT ${vtk-module}_IS_TEST)
if(${vtk-module}_IN_ALL OR ${vtk-module}_NEEDED_BY)
set_property(CACHE Module_${vtk-module} PROPERTY TYPE INTERNAL)
else()
set_property(CACHE Module_${vtk-module} PROPERTY TYPE BOOL)
endif()
endif()
endforeach()
if(NOT PV_MODULES_ENABLED)
message(WARNING "No modules enabled!")
return()
endif()
macro(verify_vtk_module_is_set)
if("" STREQUAL "${vtk-module}")
message(FATAL_ERROR "CMake variable vtk-module is not set")
endif()
endmacro()
macro(init_module_vars)
verify_vtk_module_is_set()
# set(${vtk-module}-targets VTKTargets)
# set(${vtk-module}-targets-install "${VTK_INSTALL_PACKAGE_DIR}/VTKTargets.cmake")
# set(${vtk-module}-targets-build "${VTK_BINARY_DIR}/VTKTargets.cmake")
endmacro()
# VTK_WRAP_PYTHON_MODULES can be used to explicitly control which modules
# get Python wrapped (no automatic dependency support is provided at this
# time). If it has been set mark the modules in the list as such.
# Note any wrap exclude entries in the module.cmake will take precedence
# If entry has not been set default to PV_MODULES_ENABLED.
if(VTK_WRAP_PYTHON)
if(NOT VTK_WRAP_PYTHON_MODULES)
set(VTK_WRAP_PYTHON_MODULES ${PV_MODULES_ENABLED})
endif()
foreach(_wrap_module ${VTK_WRAP_PYTHON_MODULES})
if(NOT ${_wrap_module}_EXCLUDE_FROM_WRAPPING)
set(${_wrap_module}_WRAP_PYTHON ON)
endif()
endforeach()
endif()
# Build all modules.
set (VTK_MODULES_ENABLED ${VTK_MODULES_ENABLED} ${PV_MODULES_ENABLED})
foreach(vtk-module ${PV_MODULES_ENABLED})
set(_module ${vtk-module})
if(NOT ${_module}_IS_TEST)
init_module_vars()
else()
set(vtk-module ${${_module}_TESTS_FOR})
endif()
#message("vtk-module = ${vtk-module}")
include("${${_module}_SOURCE_DIR}/vtk-module-init.cmake" OPTIONAL)
add_subdirectory("${${_module}_SOURCE_DIR}" "${${_module}_BINARY_DIR}")
endforeach()
vtk_module_config(VTK ${VTK_MODULES_ENABLED})