From 4630008fa139b69875faf027ad290b985b694373 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 15 Jan 2018 22:41:06 +0100 Subject: [PATCH] CMake: don't copy over modules with unsupported interfaces. If Python isn't found, or PythonQt isn't found, there is no point in copying over the modules into the build tree; this may even be misleading because the files are there, but won't work and this will be noticed at runtime only. Instead, skip the modules and explain why. --- .../CalamaresAddModuleSubdirectory.cmake | 104 ++++++++++-------- 1 file changed, 61 insertions(+), 43 deletions(-) diff --git a/CMakeModules/CalamaresAddModuleSubdirectory.cmake b/CMakeModules/CalamaresAddModuleSubdirectory.cmake index f85de36e9..2d891a6bb 100644 --- a/CMakeModules/CalamaresAddModuleSubdirectory.cmake +++ b/CMakeModules/CalamaresAddModuleSubdirectory.cmake @@ -24,61 +24,79 @@ function( calamares_add_module_subdirectory ) set( SKIPPED_MODULES ) set( MODULE_CONFIG_FILES "" ) + set( _mod_dir "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}" ) # If this subdirectory has a CMakeLists.txt, we add_subdirectory it... - if( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/CMakeLists.txt" ) + if( EXISTS "${_mod_dir}/CMakeLists.txt" ) add_subdirectory( ${SUBDIRECTORY} ) - file( GLOB MODULE_CONFIG_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY} "${SUBDIRECTORY}/*.conf" ) + file( GLOB MODULE_CONFIG_FILES RELATIVE ${_mod_dir} "${SUBDIRECTORY}/*.conf" ) # Module has indicated it should be skipped, show that in # the calling CMakeLists (which is src/modules/CMakeLists.txt normally). if ( SKIPPED_MODULES ) set( SKIPPED_MODULES ${SKIPPED_MODULES} PARENT_SCOPE ) endif() # ...otherwise, we look for a module.desc. - elseif( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/module.desc" ) + elseif( EXISTS "${_mod_dir}/module.desc" ) set( MODULES_DIR ${CMAKE_INSTALL_LIBDIR}/calamares/modules ) set( MODULE_DESTINATION ${MODULES_DIR}/${SUBDIRECTORY} ) - # We glob all the files inside the subdirectory, and we make sure they are - # synced with the bindir structure and installed. - file( GLOB MODULE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY} "${SUBDIRECTORY}/*" ) - foreach( MODULE_FILE ${MODULE_FILES} ) - if( NOT IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/${MODULE_FILE} ) - configure_file( ${SUBDIRECTORY}/${MODULE_FILE} ${SUBDIRECTORY}/${MODULE_FILE} COPYONLY ) - - get_filename_component( FLEXT ${MODULE_FILE} EXT ) - if( "${FLEXT}" STREQUAL ".conf" AND INSTALL_CONFIG) - install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/${MODULE_FILE} - DESTINATION ${MODULE_DATA_DESTINATION} ) - list( APPEND MODULE_CONFIG_FILES ${MODULE_FILE} ) - else() - install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/${MODULE_FILE} - DESTINATION ${MODULE_DESTINATION} ) - endif() - endif() - endforeach() - - message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} module: ${BoldRed}${SUBDIRECTORY}${ColorReset}" ) - if( NOT CMAKE_BUILD_TYPE STREQUAL "Release" ) - message( " ${Green}TYPE:${ColorReset} jobmodule" ) -# message( " ${Green}FILES:${ColorReset} ${MODULE_FILES}" ) - message( " ${Green}MODULE_DESTINATION:${ColorReset} ${MODULE_DESTINATION}" ) - if( MODULE_CONFIG_FILES ) - if ( INSTALL_CONFIG ) - message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => ${MODULE_DATA_DESTINATION}" ) - else() - message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => [Skipping installation]" ) - endif() - endif() - message( "" ) + # Read module.desc, check that the interface type is supported. + file(STRINGS "${_mod_dir}/module.desc" MODULE_INTERFACE REGEX "^interface") + if ( MODULE_INTERFACE MATCHES "pythonqt" ) + set( _mod_enabled ${WITH_PYTHONQT} ) + set( _mod_reason "No PythonQt support" ) + elseif ( MODULE_INTERFACE MATCHES "python" ) + set( _mod_enabled ${WITH_PYTHON} ) + set( _mod_reason "No Python support" ) + else() + set( _mod_enabled ON ) + set( _mod_reason "" ) endif() - # We copy over the lang directory, if any - if( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/lang" ) - install_calamares_gettext_translations( - ${SUBDIRECTORY} - SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/lang" - FILENAME ${SUBDIRECTORY}.mo - RENAME calamares-${SUBDIRECTORY}.mo - ) + + if ( _mod_enabled ) + # We glob all the files inside the subdirectory, and we make sure they are + # synced with the bindir structure and installed. + file( GLOB MODULE_FILES RELATIVE ${_mod_dir} "${SUBDIRECTORY}/*" ) + foreach( MODULE_FILE ${MODULE_FILES} ) + if( NOT IS_DIRECTORY ${_mod_dir}/${MODULE_FILE} ) + configure_file( ${SUBDIRECTORY}/${MODULE_FILE} ${SUBDIRECTORY}/${MODULE_FILE} COPYONLY ) + + get_filename_component( FLEXT ${MODULE_FILE} EXT ) + if( "${FLEXT}" STREQUAL ".conf" AND INSTALL_CONFIG) + install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/${MODULE_FILE} + DESTINATION ${MODULE_DATA_DESTINATION} ) + list( APPEND MODULE_CONFIG_FILES ${MODULE_FILE} ) + else() + install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/${MODULE_FILE} + DESTINATION ${MODULE_DESTINATION} ) + endif() + endif() + endforeach() + + message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} module: ${BoldRed}${SUBDIRECTORY}${ColorReset}" ) + if( NOT CMAKE_BUILD_TYPE STREQUAL "Release" ) + message( " ${Green}TYPE:${ColorReset} jobmodule" ) + message( " ${Green}MODULE_DESTINATION:${ColorReset} ${MODULE_DESTINATION}" ) + if( MODULE_CONFIG_FILES ) + if ( INSTALL_CONFIG ) + message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => ${MODULE_DATA_DESTINATION}" ) + else() + message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => [Skipping installation]" ) + endif() + endif() + message( "" ) + endif() + # We copy over the lang directory, if any + if( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/lang" ) + install_calamares_gettext_translations( + ${SUBDIRECTORY} + SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/lang" + FILENAME ${SUBDIRECTORY}.mo + RENAME calamares-${SUBDIRECTORY}.mo + ) + endif() + else() + # Module disabled due to missing dependencies / unsupported interface + set( SKIPPED_MODULES "${SUBDIRECTORY} (${_mod_reason})" PARENT_SCOPE ) endif() else() message( "-- ${BoldYellow}Warning:${ColorReset} tried to add module subdirectory ${BoldRed}${SUBDIRECTORY}${ColorReset} which has no CMakeLists.txt or module.desc." )