Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ IF(COMMAND CMAKE_POLICY)
CMAKE_POLICY(SET CMP0020 NEW)
ENDIF(COMMAND CMAKE_POLICY)

INCLUDE(PluginList)
INCLUDE(CheckSubmodules)
INCLUDE(AddFileDependencies)
INCLUDE(CheckIncludeFiles)
Expand Down
103 changes: 82 additions & 21 deletions cmake/modules/CheckSubmodules.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
# INCLUDE(CheckSubmodules)
#
# Options:
# SET(SKIP_SUBMODULES "foo;bar")
# SET(PLUGIN_LIST "zynaddsubfx;...") # skips submodules for plugins not explicitely listed
# SET(SKIP_SUBMODULES "plugins/Xpressive/exprtk;...") # manually skip based on full path
#
# Or via command line:
# cmake -DSKIP_SUBMODULES=foo;bar
Expand All @@ -20,13 +21,16 @@
# 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(LIST_SUBMODULES "Lists the available git submodules for automatic cloning" OFF)
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!"
Expand All @@ -45,20 +49,42 @@ SET(ENV{LANG} "en_US")
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})

SET(SKIP_COUNT 0)
FOREACH(_part ${SUBMODULE_LIST})
STRING(REPLACE "path = " "" SUBMODULE_PATH ${_part})

LIST(FIND SUBMODULE_LIST ${_part} SUBMODULE_INDEX)
LIST(GET SUBMODULE_URL_LIST ${SUBMODULE_INDEX} _url)
STRING(REPLACE "url = " "" SUBMODULE_URL ${_url})

# Remove submodules from validation as specified in -DSKIP_SUBMODULES=foo;bar
SET(SKIP false)
SET(SKIP_REASON "(via SKIP_SUBMODULES)")
# Remove unwanted submodules from validation by comparing against -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)
SET(SKIP_REASON "(absent in PLUGIN_LIST)")
LIST(APPEND SKIP_SUBMODULES ${SUBMODULE_PATH})
ENDIF()
ENDIF()

# Remove submodules from validation as specified in -DSKIP_SUBMODULES=foo;bar
IF(SKIP_SUBMODULES)
FOREACH(_skip ${SKIP_SUBMODULES})
IF(${SUBMODULE_PATH} MATCHES ${_skip})
MESSAGE("-- Skipping ${SUBMODULE_PATH} matches \"${_skip}\"")
MESSAGE("-- Skipping ${SUBMODULE_PATH} matches \"${_skip}\" ${SKIP_REASON}")
SET(SKIP true)
MATH(EXPR SKIP_COUNT "${SKIP_COUNT}+1")
BREAK()
ENDIF()
ENDFOREACH()
ENDIF()
Expand All @@ -70,13 +96,41 @@ FOREACH(_part ${SUBMODULE_LIST})
LIST(REMOVE_ITEM SUBMODULE_URL_LIST ${_url})
ENDFOREACH()

# Count provided values
SET(SKIP_SUBMODULES_LENGTH 0)
FOREACH(_skip ${SKIP_SUBMODULES})
MATH(EXPR SKIP_SUBMODULES_LENGTH "${SKIP_SUBMODULES_LENGTH}+1")
ENDFOREACH()

# Abort if skip count differs from provided values
IF(NOT SKIP_SUBMODULES_LENGTH EQUAL SKIP_COUNT)
SET(FATAL_MSG "One or more submodule(s) \"${SKIP_SUBMODULES}\" was not found, aborting.\
\nFor a list of supported values try -DLIST_SUBMODULES=True\n")
UNSET(SKIP_SUBMODULES CACHE)
MESSAGE(FATAL_ERROR "${FATAL_MSG}")
ENDIF()

IF(LIST_SUBMODULES)
UNSET(LIST_SUBMODULES CACHE)
MESSAGE("\nAll possible -DSKIP_SUBMODULES values")
FOREACH(item IN LISTS SUBMODULE_LIST)
MESSAGE(" ${item}")
ENDFOREACH()
MESSAGE(
"\n"
"NOTE: A simple and more effective way to skip submodules is via -DPLUGIN_LIST.\n\n"
"See also -DLIST_PLUGINS=True for a complete list.\n"
)
MESSAGE(FATAL_ERROR "Information was requested, aborting build!")
ENDIF()

# 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(
Expand All @@ -87,7 +141,7 @@ MACRO(GIT_SUBMODULE SUBMODULE_PATH FORCE_DEINIT FORCE_REMOTE)
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(
Expand All @@ -96,18 +150,28 @@ MACRO(GIT_SUBMODULE SUBMODULE_PATH FORCE_DEINIT FORCE_REMOTE)
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}
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
Expand Down Expand Up @@ -138,7 +202,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 "")
Expand All @@ -154,25 +218,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()
Expand Down
104 changes: 104 additions & 0 deletions cmake/modules/PluginList.cmake
Original file line number Diff line number Diff line change
@@ -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(" LMMS_MINIMAL")
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()

Loading