Submodules: Only fetch required (#5182, closes #5105) + Non-shallow fallback (hotfix)

* Retry updating submodules non-shallow if shallow clone fails (master hotfix)
* Add `PLUGIN_LIST` support to CheckSubmodules (#5105)
* Remove `SKIP_SUBMODULES` switch (it's redundant to specifying `PLUGIN_LIST`)
* Add `NO_SHALLOW_CLONE` switch
This commit is contained in:
Tres Finocchiaro
2019-10-03 11:47:49 -04:00
committed by Johannes Lorenz
parent 9f0baab93a
commit 15fe551b1d
4 changed files with 188 additions and 130 deletions

View File

@@ -18,6 +18,7 @@ IF(COMMAND CMAKE_POLICY)
CMAKE_POLICY(SET CMP0057 NEW)
ENDIF(COMMAND CMAKE_POLICY)
INCLUDE(PluginList)
INCLUDE(CheckSubmodules)
INCLUDE(AddFileDependencies)
INCLUDE(CheckIncludeFiles)

View File

@@ -7,12 +7,12 @@
# INCLUDE(CheckSubmodules)
#
# Options:
# SET(SKIP_SUBMODULES "foo;bar")
# SET(PLUGIN_LIST "zynaddsubfx;...") # skips submodules for plugins not explicitely listed
#
# Or via command line:
# cmake -DSKIP_SUBMODULES=foo;bar
# cmake -PLUGIN_LIST=foo;bar
#
# Copyright (c) 2017, Tres Finocchiaro, <tres.finocchiaro@gmail.com>
# Copyright (c) 2019, Tres Finocchiaro, <tres.finocchiaro@gmail.com>
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
@@ -20,13 +20,15 @@
# Files which confirm a successful clone
SET(VALID_CRUMBS "CMakeLists.txt;Makefile;Makefile.in;Makefile.am;configure.ac;configure.py;autogen.sh;.gitignore;LICENSE;Home.md")
OPTION(NO_SHALLOW_CLONE "Disable shallow cloning of submodules" OFF)
# Try and use the specified shallow clone on submodules, if supported
SET(DEPTH_VALUE 100)
# Number of times git commands will retry before failing
SET(MAX_ATTEMPTS 2)
MESSAGE("\nValidating submodules...")
MESSAGE("\nChecking submodules...")
IF(NOT EXISTS "${CMAKE_SOURCE_DIR}/.gitmodules")
MESSAGE("Skipping the check because .gitmodules not detected."
"Please make sure you have all submodules in the source tree!"
@@ -41,74 +43,110 @@ SET(LANG_BACKUP "$ENV{LANG}")
SET(ENV{LC_ALL} "C")
SET(ENV{LANG} "en_US")
# Assume alpha-numeric paths
STRING(REGEX MATCHALL "path = [-0-9A-Za-z/]+" SUBMODULE_LIST ${SUBMODULE_DATA})
STRING(REGEX MATCHALL "url = [.:%-0-9A-Za-z/]+" SUBMODULE_URL_LIST ${SUBMODULE_DATA})
# Submodule list pairs, unparsed (WARNING: Assumes alpha-numeric paths)
STRING(REGEX MATCHALL "path = [-0-9A-Za-z/]+" SUBMODULE_LIST_RAW ${SUBMODULE_DATA})
STRING(REGEX MATCHALL "url = [.:%-0-9A-Za-z/]+" SUBMODULE_URL_RAW ${SUBMODULE_DATA})
FOREACH(_part ${SUBMODULE_LIST})
STRING(REPLACE "path = " "" SUBMODULE_PATH ${_part})
# Submodule list pairs, parsed
SET(SUBMODULE_LIST "")
SET(SUBMODULE_URL "")
LIST(FIND SUBMODULE_LIST ${_part} SUBMODULE_INDEX)
LIST(GET SUBMODULE_URL_LIST ${SUBMODULE_INDEX} _url)
STRING(REPLACE "url = " "" SUBMODULE_URL ${_url})
FOREACH(_path ${SUBMODULE_LIST_RAW})
# Parse SUBMODULE_PATH
STRING(REPLACE "path = " "" SUBMODULE_PATH "${_path}")
# Grab index for matching SUBMODULE_URL
LIST(FIND SUBMODULE_LIST_RAW "${_path}" SUBMODULE_INDEX)
LIST(GET SUBMODULE_URL_RAW ${SUBMODULE_INDEX} _url)
# Parse SUBMODULE_URL
STRING(REPLACE "url = " "" SUBMODULE_URL "${_url}")
# Remove submodules from validation as specified in -DSKIP_SUBMODULES=foo;bar
SET(SKIP false)
# Loop over skipped plugins, add to SKIP_SUBMODULES (e.g. -DPLUGIN_LIST=foo;bar)
IF(${SUBMODULE_PATH} MATCHES "^plugins/")
SET(REMOVE_PLUGIN true)
FOREACH(_plugin ${PLUGIN_LIST})
IF(_plugin STREQUAL "")
CONTINUE()
ENDIF()
IF(${SUBMODULE_PATH} MATCHES "${_plugin}")
SET(REMOVE_PLUGIN false)
ENDIF()
ENDFOREACH()
IF(REMOVE_PLUGIN)
LIST(APPEND SKIP_SUBMODULES "${SUBMODULE_PATH}")
ENDIF()
ENDIF()
# Finally, loop and mark "SKIP" on match
IF(SKIP_SUBMODULES)
FOREACH(_skip ${SKIP_SUBMODULES})
IF(${SUBMODULE_PATH} MATCHES ${_skip})
MESSAGE("-- Skipping ${SUBMODULE_PATH} matches \"${_skip}\"")
IF("${SUBMODULE_PATH}" MATCHES "${_skip}")
MESSAGE("-- Skipping ${SUBMODULE_PATH} matches \"${_skip}\" (absent in PLUGIN_LIST)")
SET(SKIP true)
BREAK()
ENDIF()
ENDFOREACH()
ENDIF()
IF(NOT SKIP)
LIST(INSERT SUBMODULE_LIST ${SUBMODULE_INDEX} ${SUBMODULE_PATH})
LIST(INSERT SUBMODULE_URL_LIST ${SUBMODULE_INDEX} ${SUBMODULE_URL})
ENDIF()
LIST(REMOVE_ITEM SUBMODULE_LIST ${_part})
LIST(REMOVE_ITEM SUBMODULE_URL_LIST ${_url})
ENDFOREACH()
IF(NOT SKIP)
LIST(APPEND SUBMODULE_LIST "${SUBMODULE_PATH}")
LIST(APPEND SUBMODULE_URL "${SUBMODULE_URL}")
ENDIF()
ENDFOREACH()
# Once called, status is stored in GIT_RESULT respectively.
# Note: Git likes to write to stderr. Don't assume stderr is error; Check GIT_RESULT instead.
MACRO(GIT_SUBMODULE SUBMODULE_PATH FORCE_DEINIT FORCE_REMOTE)
MACRO(GIT_SUBMODULE SUBMODULE_PATH FORCE_DEINIT FORCE_REMOTE FULL_CLONE)
FIND_PACKAGE(Git REQUIRED)
# Handle missing commits
SET(FORCE_REMOTE_FLAG "${FORCE_REMOTE}")
SET(FULL_CLONE_FLAG "${FULL_CLONE}")
IF(FORCE_REMOTE_FLAG)
MESSAGE("-- Adding remote submodulefix to ${SUBMODULE_PATH}")
EXECUTE_PROCESS(
COMMAND ${GIT_EXECUTABLE} remote rm submodulefix
COMMAND ${GIT_EXECUTABLE} remote add submodulefix ${FORCE_REMOTE}
COMMAND ${GIT_EXECUTABLE} fetch submodulefix
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/${SUBMODULE_PATH}
COMMAND "${GIT_EXECUTABLE}" remote rm submodulefix
COMMAND "${GIT_EXECUTABLE}" remote add submodulefix ${FORCE_REMOTE}
COMMAND "${GIT_EXECUTABLE}" fetch submodulefix
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/${SUBMODULE_PATH}"
OUTPUT_QUIET ERROR_QUIET
)
# Recurse
GIT_SUBMODULE(${SUBMODULE_PATH} false false)
GIT_SUBMODULE(${SUBMODULE_PATH} false false ${FULL_CLONE_FLAG})
ELSEIF(${FORCE_DEINIT})
MESSAGE("-- Resetting ${SUBMODULE_PATH}")
EXECUTE_PROCESS(
COMMAND ${GIT_EXECUTABLE} submodule deinit -f ${CMAKE_SOURCE_DIR}/${SUBMODULE_PATH}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMAND "${GIT_EXECUTABLE}" submodule deinit -f "${CMAKE_SOURCE_DIR}/${SUBMODULE_PATH}"
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_QUIET
)
# Recurse
GIT_SUBMODULE(${SUBMODULE_PATH} false false)
GIT_SUBMODULE(${SUBMODULE_PATH} false false ${FULL_CLONE_FLAG})
ELSE()
# Try to use the depth switch
SET(DEPTH_CMD "")
IF(NO_SHALLOW_CLONE OR GIT_VERSION_STRING VERSION_LESS "1.8.4")
# Shallow submodules were introduced in 1.8.4
MESSAGE("-- Fetching ${SUBMODULE_PATH}")
IF(DEPTH_VALUE)
SET(DEPTH_CMD "--depth" )
SET(DEPTH_CMD "")
SET(DEPTH_VAL "")
ELSEIF(FULL_CLONE_FLAG)
# Depth doesn't revert easily... It should be "--no-recommend-shallow"
# but it's ignored by nested submodules, use the highest value instead.
MESSAGE("-- Fetching ${SUBMODULE_PATH}")
SET(DEPTH_CMD "--depth")
SET(DEPTH_VAL "2147483647")
ELSE()
MESSAGE("-- Fetching ${SUBMODULE_PATH} @ --depth ${DEPTH_VALUE}")
SET(DEPTH_CMD "--depth")
SET(DEPTH_VAL "${DEPTH_VALUE}")
ENDIF()
EXECUTE_PROCESS(
COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive ${DEPTH_CMD} ${DEPTH_VALUE} ${CMAKE_SOURCE_DIR}/${SUBMODULE_PATH}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMAND "${GIT_EXECUTABLE}" submodule update --init --recursive ${DEPTH_CMD} ${DEPTH_VAL} "${CMAKE_SOURCE_DIR}/${SUBMODULE_PATH}"
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
RESULT_VARIABLE GIT_RESULT
OUTPUT_VARIABLE GIT_STDOUT
ERROR_VARIABLE GIT_STDERR
@@ -124,7 +162,7 @@ SET(RETRY_PHRASES "Failed to recurse;cannot create directory;already exists;${MI
# Attempt to do lazy clone
FOREACH(_submodule ${SUBMODULE_LIST})
STRING(REPLACE "/" ";" PATH_PARTS ${_submodule})
STRING(REPLACE "/" ";" PATH_PARTS "${_submodule}")
LIST(REVERSE PATH_PARTS)
LIST(GET PATH_PARTS 0 SUBMODULE_NAME)
@@ -138,7 +176,7 @@ FOREACH(_submodule ${SUBMODULE_LIST})
ENDIF()
ENDFOREACH()
IF(NOT CRUMB_FOUND)
GIT_SUBMODULE(${_submodule} false false)
GIT_SUBMODULE("${_submodule}" false false false)
SET(COUNTED 0)
SET(COUNTING "")
@@ -154,25 +192,22 @@ FOREACH(_submodule ${SUBMODULE_LIST})
ENDIF()
ENDFOREACH()
FOREACH(_phrase ${RETRY_PHRASES})
IF(${MISSING_COMMIT})
IF(${MISSING_COMMIT} AND COUNTED LESS 2)
LIST(FIND SUBMODULE_LIST ${_submodule} SUBMODULE_INDEX)
LIST(GET SUBMODULE_URL_LIST ${SUBMODULE_INDEX} SUBMODULE_URL)
MESSAGE("-- Retrying ${_submodule} using 'remote add submodulefix' (attempt ${COUNTED} of ${MAX_ATTEMPTS})...")
GIT_SUBMODULE(${_submodule} false "${SUBMODULE_URL}")
GIT_SUBMODULE("${_submodule}" false "${SUBMODULE_URL}" false)
BREAK()
ELSEIF("${GIT_MESSAGE}" MATCHES "${_phrase}")
MESSAGE("-- Retrying ${_submodule} using 'deinit' (attempt ${COUNTED} of ${MAX_ATTEMPTS})...")
# Shallow submodules were introduced in 1.8.4
# Shallow commits can fail to clone from non-default branches, only try once
IF(GIT_VERSION_STRING VERSION_GREATER "1.8.3" AND COUNTED LESS 2)
# Try a shallow submodule clone
IF(COUNTED LESS 2)
SET(FULL_CLONE false)
ELSE()
UNSET(DEPTH_VALUE)
SET(FULL_CLONE true)
ENDIF()
GIT_SUBMODULE(${_submodule} true false)
GIT_SUBMODULE("${_submodule}" true false ${FULL_CLONE})
BREAK()
ENDIF()
ENDFOREACH()

View File

@@ -0,0 +1,104 @@
# Provides a fast mechanism for filtering the plugins used at build-time
SET(PLUGIN_LIST "" CACHE STRING "List of plug-ins to build")
STRING(REPLACE " " ";" PLUGIN_LIST "${PLUGIN_LIST}")
OPTION(LMMS_MINIMAL "Build a minimal list of plug-ins" OFF)
OPTION(LIST_PLUGINS "Lists the available plugins for building" OFF)
SET(MINIMAL_LIST
audio_file_processor
kicker
triple_oscillator
)
IF(LMMS_MINIMAL)
IF("${PLUGIN_LIST}" STREQUAL "")
STRING(REPLACE ";" " " MINIMAL_LIST_STRING "${MINIMAL_LIST}")
MESSAGE(
"-- Using minimal plug-ins: ${MINIMAL_LIST_STRING}\n"
" Note: You can specify specific plug-ins using -DPLUGIN_LIST=\"foo bar\""
)
ENDIF()
SET(PLUGIN_LIST ${MINIMAL_LIST} ${PLUGIN_LIST})
ENDIF()
SET(LMMS_PLUGIN_LIST
${MINIMAL_LIST}
Amplifier
BassBooster
bit_invader
Bitcrush
carlabase
carlapatchbay
carlarack
CrossoverEQ
Delay
DualFilter
dynamics_processor
Eq
Flanger
HydrogenImport
ladspa_browser
LadspaEffect
lb302
MidiImport
MidiExport
MultitapEcho
monstro
nes
OpulenZ
organic
FreeBoy
patman
peak_controller_effect
GigPlayer
ReverbSC
sf2_player
sfxr
sid
SpectrumAnalyzer
stereo_enhancer
stereo_matrix
stk
vst_base
vestige
VstEffect
watsyn
waveshaper
vibed
Xpressive
zynaddsubfx
)
IF("${PLUGIN_LIST}" STREQUAL "")
SET(PLUGIN_LIST ${LMMS_PLUGIN_LIST})
ENDIF()
MACRO(LIST_ALL_PLUGINS)
MESSAGE("\n\nAll possible -DPLUGIN_LIST values")
MESSAGE("\n KEYWORD:")
MESSAGE(" -DLMMS_MINIMAL=True")
FOREACH(item IN LISTS MINIMAL_LIST)
MESSAGE(" ${item}")
ENDFOREACH()
MESSAGE("\n NAME:")
FOREACH(item IN LISTS LMMS_PLUGIN_LIST)
MESSAGE(" ${item}")
ENDFOREACH()
MESSAGE("\nNote: This value also impacts the fetching of git submodules.\n")
MESSAGE(FATAL_ERROR "Information was requested, aborting build!")
ENDMACRO()
IF(LIST_PLUGINS)
UNSET(LIST_PLUGINS CACHE)
LIST_ALL_PLUGINS()
ENDIF()
IF(MSVC)
SET(MSVC_INCOMPATIBLE_PLUGINS
LadspaEffect
zynaddsubfx
)
message(WARNING "Compiling with MSVC. The following plugins are not available: ${MSVC_INCOMPATIBLE_PLUGINS}")
LIST(REMOVE_ITEM PLUGIN_LIST ${MSVC_INCOMPATIBLE_PLUGINS})
ENDIF()

View File

@@ -14,89 +14,7 @@ INCLUDE_DIRECTORIES(
"${CMAKE_BINARY_DIR}/src"
)
SET(PLUGIN_LIST "" CACHE STRING "List of plug-ins to build")
STRING(REPLACE " " ";" PLUGIN_LIST "${PLUGIN_LIST}")
OPTION(LMMS_MINIMAL "Build a minimal list of plug-ins" OFF)
SET(MINIMAL_LIST
audio_file_processor
kicker
triple_oscillator
)
IF(LMMS_MINIMAL)
IF("${PLUGIN_LIST}" STREQUAL "")
STRING(REPLACE ";" " " MINIMAL_LIST_STRING "${MINIMAL_LIST}")
MESSAGE(
"-- Using minimal plug-ins: ${MINIMAL_LIST_STRING}\n"
" Note: You can specify specific plug-ins using -DPLUGIN_LIST=\"foo bar\""
)
ENDIF()
SET(PLUGIN_LIST ${MINIMAL_LIST} ${PLUGIN_LIST})
ENDIF()
IF("${PLUGIN_LIST}" STREQUAL "")
SET(PLUGIN_LIST
${MINIMAL_LIST}
Amplifier
BassBooster
bit_invader
Bitcrush
carlabase
carlapatchbay
carlarack
CrossoverEQ
Delay
DualFilter
dynamics_processor
Eq
Flanger
HydrogenImport
ladspa_browser
LadspaEffect
lb302
MidiImport
MidiExport
MultitapEcho
monstro
nes
OpulenZ
organic
FreeBoy
patman
peak_controller_effect
GigPlayer
ReverbSC
sf2_player
sfxr
sid
SpectrumAnalyzer
stereo_enhancer
stereo_matrix
stk
vst_base
vestige
VstEffect
watsyn
waveshaper
vibed
Xpressive
zynaddsubfx
)
ENDIF("${PLUGIN_LIST}" STREQUAL "")
IF(MSVC)
SET(MSVC_INCOMPATIBLE_PLUGINS
LadspaEffect
zynaddsubfx
)
message(WARNING "Compiling with MSVC. The following plugins are not available: ${MSVC_INCOMPATIBLE_PLUGINS}")
LIST(REMOVE_ITEM PLUGIN_LIST ${MSVC_INCOMPATIBLE_PLUGINS})
ENDIF()
# See cmake/modules/PluginList.cmake
FOREACH(PLUGIN ${PLUGIN_LIST})
ADD_SUBDIRECTORY(${PLUGIN})
ENDFOREACH()