203 lines
5.2 KiB
Bash
Executable File
203 lines
5.2 KiB
Bash
Executable File
#!/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) <DESTINATION_DIR> <linux/macos/windows>"
|
|
}
|
|
|
|
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 '<parent-directory-name>-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
|