#!/usr/bin/env bash set -ex # MANUAL ADJUSTMENTS # This variable will be used for testing if the target directory contains all the necessary licenses. # The name of every 'lib/*' directory (except 'resources'), 'lib/resources/libraries/*' file # (except '*-license') and proper OS-specific licenses are added automatically. REQUIRED_LICENSES=( libllvm-disas llvm nunit3 renode RobotoMono-Regular socket-cpp tcg tlib ) # Licenses for these directories and files won't be required. REQUIRED_LICENSES_EXCLUDE=( # CCTask is only used during building. cctask # There is 'IronPython-license' for 'IronPython.dll'. That's enough. IronPython.Modules.dll IronPython.StdLib.dll # License is named 'libopenlibm-license' and is only required on Linux. libopenlibm-Linux.a # There is 'Sprache-license' for 'Sprache.dll'. Sprache.xml ) # Custom names for the 'license*' files. It should be an associative array but macOSs use bash3... CUSTOM_TARGET_NAME_KEYS=( lib/bc-csharp/crypto/License.html LICENSE ) CUSTOM_TARGET_NAME_VALUES=( bc-csharp renode ) # Use target names without the '-license' suffix, e.g., 'renode' instead of 'LICENSE'. The OSs order # has to be synced with the 'get_os_specific_licenses' function. OS_SPECIFIC_LICENSES=( "libopenlibm" # Linux "macos_run.command" # macOS "mingw winpthreads" # Windows ) # HELPERS function exit_invalid_args { exit_with_error \ "Invalid arguments: $@" \ "" \ "Usage: $(basename $0) " } function exit_with_error { set +x echo "ERROR: License copying failed!" echo for message in "$@"; do echo $message done exit 1 } function get_custom_target_name { path=$1 i=0 for key in ${CUSTOM_TARGET_NAME_KEYS[@]}; do if [ "$key" = "$path" ]; then echo "${CUSTOM_TARGET_NAME_VALUES[$i]}" return fi let i++ done } function get_os_specific_licenses { if [ "$OS" = linux ]; then index=0 elif [ "$OS" = macos ]; then index=1 elif [ "$OS" = windows ]; then index=2 fi echo "${OS_SPECIFIC_LICENSES[$index]}" } # CHECK ARGUMENTS if [ $# -ne 2 ]; then exit_invalid_args $@ fi BASE="$(dirname $0)/../.." TARGET="$1" OS="$2" if [ "$OS" != linux ] && [ "$OS" != macos ] && [ "$OS" != windows ]; then exit_invalid_args $@ fi _resources_dir="lib/resources/libraries" if ! [ -d $BASE/$_resources_dir ]; then exit_with_error "No such directory: '$BASE/$_resources_dir'. Fetch 'renode-resources' first." fi # COPY LICENSES function is_license_skipped { # Extract the license name core if the argument is a full path. filename=${1##*/} name_core=${filename%-licen*} # The extra spaces are necessary to only have exact matches. if [[ " ${OS_SPECIFIC_LICENSES[@]} " =~ " $name_core " ]]; then if [[ " $(get_os_specific_licenses) " =~ " $name_core " ]]; then return 1 # Don't skip. else return 0 # Skip. fi else return 1 # Don't skip. fi } # Copy licenses which include the library name. LicenCe is a correct spelling as well (BrE). for license in $(find $BASE -type f -iname "*-licen[cs]e"); do if ! is_license_skipped $license; then cp $license $TARGET/ fi done # Copy other licenses as '-license' (see CUSTOM_TARGET_NAME* for exceptions). # The pattern isn't a simple '-iname "licen[cs]e*"' to prevent matching many potential non-license # files, e.g., "license-script.sh". for license in $(find $BASE -type f \( -iname "licen[cs]e" -or -iname "licen[cs]e.*" \)); do base_relative_path=${license#$BASE/} custom_name="$(get_custom_target_name $base_relative_path)" if [ -n "$custom_name" ]; then name="$custom_name" else full_dirname=${license%/*} parent_dirname=${full_dirname##*/} name=$parent_dirname fi if ! is_license_skipped $name; then cp $license $TARGET/$name-license fi done set +x # LIST TARGET DIRECTORY LICENSE_COUNT=$(ls $TARGET/*-license | wc -w) echo echo "The target directory for licenses ($TARGET) contains $LICENSE_COUNT license files:" ls $TARGET echo # TEST # There should be a license for every directory from 'lib' except 'resources' and for every file # from 'lib/resources/libraries' except the '*-license' files. for name in $(ls $BASE/lib) $(ls $BASE/lib/resources/libraries/); do if [ "$name" != "resources" ] && ! [[ "$name" =~ "-license" ]]; then REQUIRED_LICENSES+=( $name ) fi done # Don't use double quotes for the '$(get_os_specific_licenses)'. The value can contain multiple # names separated with spaces which should be checked separately. for name in ${REQUIRED_LICENSES[@]} $(get_os_specific_licenses); do # Check if the license isn't excluded. if [[ " ${REQUIRED_LICENSES_EXCLUDE[@]} " =~ " $name " ]]; then continue fi # Strip possible '.a' and '.dll' extensions and add the '-license' suffix. license=${name%.a} license=${license%.dll} license="$license-license" if ! [ -f "$TARGET/$license" ]; then exit_with_error "Required file not found: '$license'. Provide it or exclude '$name'." fi done