Skip to content

Commit

Permalink
Merge pull request xbmc#17755 from fuzzard/cmake_exclusionregex
Browse files Browse the repository at this point in the history
[cmake] ADDONS_TO_BUILD exclusion regex and better exact match handling
  • Loading branch information
fuzzard authored Sep 26, 2020
2 parents 2106a2e + 6a8a8f7 commit 8e7b9d3
Show file tree
Hide file tree
Showing 8 changed files with 75 additions and 15 deletions.
72 changes: 63 additions & 9 deletions cmake/addons/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
8 changes: 5 additions & 3 deletions cmake/addons/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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>`)
Expand Down
1 change: 1 addition & 0 deletions docs/README.Android.md
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ Build a specific group of add-ons:
```
make -j$(getconf _NPROCESSORS_ONLN) -C tools/depends/target/binary-addons ADDONS="pvr.*"
```
For additional information on regular expression usage for ADDONS_TO_BUILD, view ADDONS_TO_BUILD section located at [Kodi add-ons CMake based buildsystem](../cmake/addons/README.md)

**[back to top](#table-of-contents)**

Expand Down
1 change: 1 addition & 0 deletions docs/README.FreeBSD.md
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ Build a specific group of add-ons:
```
sudo gmake -j$(sysctl hw.ncpu | awk '{print $2}') -C tools/depends/target/binary-addons PREFIX=/usr/local ADDONS="pvr.*"
```
For additional information on regular expression usage for ADDONS_TO_BUILD, view ADDONS_TO_BUILD section located at [Kodi add-ons CMake based buildsystem](../cmake/addons/README.md)

**NOTE:** `PREFIX=/usr/local` should match Kodi's `-DCMAKE_INSTALL_PREFIX=` prefix used in **[section 4.1](#41-configure-build)**.

Expand Down
1 change: 1 addition & 0 deletions docs/README.Linux.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ Build a specific group of add-ons:
```
sudo make -j$(getconf _NPROCESSORS_ONLN) -C tools/depends/target/binary-addons PREFIX=/usr/local ADDONS="pvr.*"
```
For additional information on regular expression usage for ADDONS_TO_BUILD, view ADDONS_TO_BUILD section located here [Kodi add-ons CMake based buildsystem](../cmake/addons/README.md)

**NOTE:** `PREFIX=/usr/local` should match Kodi's `-DCMAKE_INSTALL_PREFIX=` prefix used in **[section 4.1](#41-configure-build)**.

Expand Down
5 changes: 2 additions & 3 deletions docs/README.iOS.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ Build a specific group of add-ons:
```
make -j$(getconf _NPROCESSORS_ONLN) -C tools/depends/target/binary-addons ADDONS="pvr.*"
```
For additional information on regular expression usage for ADDONS_TO_BUILD, view ADDONS_TO_BUILD section located here [Kodi add-ons CMake based buildsystem](../cmake/addons/README.md)

## 5.2. Xcode project building

Expand All @@ -146,9 +147,7 @@ Generate Xcode project to build a specific group of add-ons:
make -C tools/depends/target/cmakebuildsys CMAKE_EXTRA_ARGUMENTS="-DENABLE_XCODE_ADDONBUILD=ON -DADDONS_TO_BUILD='pvr.*'"
```

**TIP:** When using addontype.* for -DADDONS_TO_BUILD argument, you cannot have multiple
addon types. ie -DADDONS_TO_BUILD='game.libretro.* peripheral.*' is not valid. You will
need to individually list the addons as per the first example for specific addon building.
For additional information on regular expression usage for ADDONS_TO_BUILD, view ADDONS_TO_BUILD section located at [Kodi add-ons CMake based buildsystem](../cmake/addons/README.md)

Generate Xcode project to build all add-ons automatically:
```sh
Expand Down
1 change: 1 addition & 0 deletions docs/README.macOS.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ OR
```
make -j$(getconf _NPROCESSORS_ONLN) -C tools/depends/target/binary-addons ADDONS="pvr.*"
```
For additional information on regular expression usage for ADDONS_TO_BUILD, view ADDONS_TO_BUILD section located at [Kodi add-ons CMake based buildsystem](../cmake/addons/README.md)

**[back to top](#table-of-contents)**

Expand Down
1 change: 1 addition & 0 deletions docs/README.tvOS.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ Generate Xcode project to build a specific group of add-ons:
```
make -C tools/depends/target/cmakebuildsys CMAKE_EXTRA_ARGUMENTS="-DENABLE_XCODE_ADDONBUILD=ON -DADDONS_TO_BUILD='pvr.*'"
```
For additional information on regular expression usage for ADDONS_TO_BUILD, view ADDONS_TO_BUILD section located at [Kodi add-ons CMake based buildsystem](../cmake/addons/README.md)

Generate Xcode project to build all add-ons automatically:
```
Expand Down

0 comments on commit 8e7b9d3

Please sign in to comment.