aboutsummaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
authorfuzzard <fuzzard@users.noreply.github.com>2020-09-27 07:12:56 +1000
committerGitHub <noreply@github.com>2020-09-27 07:12:56 +1000
commit8e7b9d36d8436925feab69c87217e68e4d92a0c3 (patch)
tree39505d618b5e6a6d7ae38389272de3996bfed309 /cmake
parent2106a2e75492ce12468217076b2868c55dd0b903 (diff)
parent6a8a8f768c2b414f80b33da414ad19ca2f33a887 (diff)
Merge pull request #17755 from fuzzard/cmake_exclusionregex
[cmake] ADDONS_TO_BUILD exclusion regex and better exact match handling
Diffstat (limited to 'cmake')
-rw-r--r--cmake/addons/CMakeLists.txt72
-rw-r--r--cmake/addons/README.md8
2 files changed, 68 insertions, 12 deletions
diff --git a/cmake/addons/CMakeLists.txt b/cmake/addons/CMakeLists.txt
index 3dccc014b2..c1313d7458 100644
--- a/cmake/addons/CMakeLists.txt
+++ b/cmake/addons/CMakeLists.txt
@@ -244,26 +244,80 @@ endif()
# error either in ADDONS_TO_BUILD or in the directory configuration.
set(SUPPORTED_ADDON_FOUND FALSE)
+if(NOT ADDONS_TO_BUILD)
+ set(ADDONS_TO_BUILD "all")
+endif()
+
+if(NOT ADDONS_TO_BUILD STREQUAL "all")
+ # Exact addon match list
+ set(REGEX_ADDONS_TO_BUILD ${ADDONS_TO_BUILD})
+ set(EXACT_MATCH_ADDON_LIST "")
+ set(EXCLUDE_ADDONS "")
+
+ foreach(addon ${ADDONS_TO_BUILD})
+ set(FOUND_EXCLUSION "")
+ string(REGEX MATCH "^[-](.*)" FOUND_EXCLUSION "${addon}")
+ if(NOT FOUND_EXCLUSION STREQUAL "")
+ list(APPEND EXCLUDE_ADDONS ${CMAKE_MATCH_1})
+ list(REMOVE_ITEM REGEX_ADDONS_TO_BUILD "-${CMAKE_MATCH_1}")
+ else()
+ foreach(addonrepoitem ${addons})
+ if(NOT (addonrepoitem MATCHES platforms.txt))
+ # need to strip regex chars, or the filter regex will use
+ string(REPLACE "*" "" strippedregex ${addon})
+ if(${addonrepoitem} MATCHES "^.*\/(${strippedregex}).txt")
+ list(APPEND EXACT_MATCH_ADDON_LIST ${addon})
+ # remove exact matches from addons_to_build
+ list(REMOVE_ITEM REGEX_ADDONS_TO_BUILD "${addon}")
+ endif()
+ endif()
+ endforeach()
+ endif()
+ endforeach()
+
+ message(STATUS "Exclusion list: ${EXCLUDE_ADDONS}")
+ message(STATUS "Exact Match list: ${EXACT_MATCH_ADDON_LIST}")
+ message(STATUS "Regex list: ${REGEX_ADDONS_TO_BUILD}")
+endif()
+
foreach(addon ${addons})
if(NOT (addon MATCHES platforms.txt))
file(STRINGS ${addon} def)
string(REPLACE " " ";" def ${def})
list(GET def 0 id)
- set(ADDON_FOUND FALSE)
- # try to find a perfect match
- list(FIND ADDONS_TO_BUILD ${id} idx)
- if(idx GREATER -1 OR "${ADDONS_TO_BUILD}" STREQUAL "all")
+ if("${ADDONS_TO_BUILD}" STREQUAL "all")
set(ADDON_FOUND TRUE)
- # Maybe we have a regex
else()
- foreach(ADDONLISTITEM ${ADDONS_TO_BUILD})
- if(id MATCHES "${ADDONLISTITEM}")
- message(STATUS "Pattern ${ADDONLISTITEM} matches ${id}, building addon")
- set(ADDON_FOUND TRUE)
+ set(ADDON_EXCLUDE FALSE)
+ set(ADDON_FOUND FALSE)
+ foreach(exclusion ${EXCLUDE_ADDONS})
+ if(id MATCHES "${exclusion}")
+ set(ADDON_EXCLUDE TRUE)
+ message(STATUS "Addon ${id} matches exclusion rule -${exclusion}")
break()
endif()
endforeach()
+
+ if(ADDON_EXCLUDE)
+ continue()
+ endif()
+
+ list(FIND EXACT_MATCH_ADDON_LIST ${id} idx)
+ if(idx GREATER -1)
+ # exact match, so build
+ message(STATUS "Exact match ${id}, building addon")
+ set(ADDON_FOUND TRUE)
+ else()
+ # regex search
+ foreach(ADDONLISTITEM ${REGEX_ADDONS_TO_BUILD})
+ if(id MATCHES "${ADDONLISTITEM}")
+ message(STATUS "Pattern ${ADDONLISTITEM} matches ${id}, building addon")
+ set(ADDON_FOUND TRUE)
+ break()
+ endif()
+ endforeach()
+ endif()
endif()
if(ADDON_FOUND)
diff --git a/cmake/addons/README.md b/cmake/addons/README.md
index a723085bd1..ed1894e00a 100644
--- a/cmake/addons/README.md
+++ b/cmake/addons/README.md
@@ -25,9 +25,11 @@ If no add-on definitions could be found, the buildsystem assumes that the bootst
## Buildsystem variables
The buildsystem uses the following addon-related variables (which can be passed into it when executing cmake with the -D`<variable-name>=<value>` format) to manipulate the build process:
-- `ADDONS_TO_BUILD` has two variations, which are tested in order:
- - a quoted, space delimited list of `<addon-id>s` that you want to build (default is *all*)
- - a regular expression that every `<addon-id>` is matched against (e.g. `ADDONS_TO_BUILD="pvr.*"`) to build all pvr add-ons
+- `ADDONS_TO_BUILD` has four rules for matching a provided space delimited list:
+ - to build all addons, just use `all` (default is *all*)
+ - an exact match of an `<addon-id>` that you want to build (e.g. `ADDONS_TO_BUILD="game.libretro"`)
+ - a regular expression `<addon-id>` is matched against (e.g. `ADDONS_TO_BUILD="pvr.*"`) to build all pvr add-ons
+ - a regular expression exclusion can be made using `-<addon-id regex>` (e.g. `ADDONS_TO_BUILD="pvr.* -pvr.dvb"`) to exclude pvr.dvblink and pvr.dvbviewer, but build all other pvr add-ons
- `ADDONS_DEFINITION_DIR` points to the directory containing the definitions for the addons to be built
- `ADDON_SRC_PREFIX` can be used to override the add-on repository location. It must point to the locally available parent directory of the add-on(s) to build. `<addon-id>` will be appended to this path automatically
- `CMAKE_INSTALL_PREFIX` points to the directory where the built add-ons and their additional files (addon.xml, resources, ...) will be installed to (defaults to `<ADDON_DEPENDS_PATH>`)