224 lines
7.5 KiB
Bash
Executable File
224 lines
7.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
# create Draugnorak package for all platforms.
|
|
|
|
tmpAndroidToolsDir=""
|
|
tmpAndroidConfigBackup=""
|
|
createdAndroidConfig="0"
|
|
tmpAndroidWrapperSource=""
|
|
tmpAndroidPackFile=""
|
|
tmpAndroidPackBuilder=""
|
|
|
|
trap 'rm -fv README.html; if [[ -n "${tmpAndroidToolsDir}" && -d "${tmpAndroidToolsDir}" ]]; then rm -rf "${tmpAndroidToolsDir}"; fi; if [[ -n "${tmpAndroidConfigBackup}" && -f "${tmpAndroidConfigBackup}" ]]; then mv -f "${tmpAndroidConfigBackup}" draugnorak.properties; elif [[ "${createdAndroidConfig}" == "1" ]]; then rm -f draugnorak.properties; fi; if [[ -n "${tmpAndroidWrapperSource}" && -f "${tmpAndroidWrapperSource}" ]]; then rm -f "${tmpAndroidWrapperSource}"; fi; if [[ -n "${tmpAndroidPackBuilder}" && -f "${tmpAndroidPackBuilder}" ]]; then rm -f "${tmpAndroidPackBuilder}"; fi; if [[ -n "${tmpAndroidPackFile}" && -f "${tmpAndroidPackFile}" ]]; then rm -f "${tmpAndroidPackFile}"; fi' EXIT
|
|
|
|
escape_nvgt_string() {
|
|
local inputValue="$1"
|
|
inputValue="${inputValue//\\/\\\\}"
|
|
inputValue="${inputValue//\"/\\\"}"
|
|
printf '%s\n' "${inputValue}"
|
|
}
|
|
|
|
find_android_sdk_root() {
|
|
local sdkRoot
|
|
for sdkRoot in "${ANDROID_HOME:-}" "${ANDROID_SDK_HOME:-}" "/opt/android-sdk" "${HOME}/Android/Sdk" "${HOME}/Android/sdk"; do
|
|
if [[ -n "${sdkRoot}" && -d "${sdkRoot}" ]]; then
|
|
printf '%s\n' "${sdkRoot}"
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
find_latest_build_tools_dir() {
|
|
local sdkRoot="$1"
|
|
local buildToolsDir=""
|
|
if [[ ! -d "${sdkRoot}/build-tools" ]]; then
|
|
return 1
|
|
fi
|
|
buildToolsDir="$(find "${sdkRoot}/build-tools" -mindepth 1 -maxdepth 1 -type d | sort -V | tail -n 1)"
|
|
if [[ -z "${buildToolsDir}" ]]; then
|
|
return 1
|
|
fi
|
|
printf '%s\n' "${buildToolsDir}"
|
|
}
|
|
|
|
find_latest_android_jar() {
|
|
local sdkRoot="$1"
|
|
local androidJar=""
|
|
if [[ ! -d "${sdkRoot}/platforms" ]]; then
|
|
return 1
|
|
fi
|
|
androidJar="$(find "${sdkRoot}/platforms" -mindepth 2 -maxdepth 2 -type f -name android.jar | sort -V | tail -n 1)"
|
|
if [[ -z "${androidJar}" ]]; then
|
|
return 1
|
|
fi
|
|
printf '%s\n' "${androidJar}"
|
|
}
|
|
|
|
setup_android_tools_workaround() {
|
|
local sdkRoot="$1"
|
|
local buildToolsDir="$2"
|
|
local androidJar="$3"
|
|
local javaBin=""
|
|
local keytoolBin=""
|
|
local adbBin=""
|
|
|
|
tmpAndroidToolsDir="$(mktemp -d)"
|
|
|
|
ln -sf "${buildToolsDir}/zipalign" "${tmpAndroidToolsDir}/zipalign"
|
|
ln -sf "${buildToolsDir}/lib/apksigner.jar" "${tmpAndroidToolsDir}/apksigner.jar"
|
|
ln -sf "${androidJar}" "${tmpAndroidToolsDir}/android.jar"
|
|
|
|
if command -v java >/dev/null 2>&1; then
|
|
javaBin="$(command -v java)"
|
|
ln -sf "${javaBin}" "${tmpAndroidToolsDir}/java"
|
|
fi
|
|
|
|
if command -v keytool >/dev/null 2>&1; then
|
|
keytoolBin="$(command -v keytool)"
|
|
ln -sf "${keytoolBin}" "${tmpAndroidToolsDir}/keytool"
|
|
fi
|
|
|
|
if command -v adb >/dev/null 2>&1; then
|
|
adbBin="$(command -v adb)"
|
|
ln -sf "${adbBin}" "${tmpAndroidToolsDir}/adb"
|
|
fi
|
|
|
|
cat > "${tmpAndroidToolsDir}/aapt2" <<EOF
|
|
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
filteredArgs=()
|
|
for arg in "\$@"; do
|
|
if [[ -n "\${arg}" ]]; then
|
|
filteredArgs+=("\${arg}")
|
|
fi
|
|
done
|
|
|
|
exec "${buildToolsDir}/aapt2" "\${filteredArgs[@]}"
|
|
EOF
|
|
chmod +x "${tmpAndroidToolsDir}/aapt2"
|
|
|
|
echo "Using Android SDK at: ${sdkRoot}"
|
|
echo "Using build-tools: ${buildToolsDir}"
|
|
echo "Using android.jar: ${androidJar}"
|
|
}
|
|
|
|
build_android_sound_pack() {
|
|
local outputPackPath="$1"
|
|
local builderScriptPath="$2"
|
|
local sourcePath=""
|
|
local escapedSourcePath=""
|
|
local escapedOutputPath=""
|
|
|
|
escapedOutputPath="$(escape_nvgt_string "${outputPackPath}")"
|
|
cat > "${builderScriptPath}" <<EOF
|
|
void main() {
|
|
pack soundPack;
|
|
if (!soundPack.open("${escapedOutputPath}", PACK_OPEN_MODE_CREATE)) return;
|
|
EOF
|
|
|
|
while IFS= read -r sourcePath; do
|
|
escapedSourcePath="$(escape_nvgt_string "${sourcePath}")"
|
|
printf ' if (!soundPack.add_file("%s", "%s")) return;\n' "${escapedSourcePath}" "${escapedSourcePath}" >> "${builderScriptPath}"
|
|
done < <(find sounds -type f | sort)
|
|
|
|
cat >> "${builderScriptPath}" <<'EOF'
|
|
soundPack.close();
|
|
}
|
|
EOF
|
|
|
|
./nvgt "${builderScriptPath}"
|
|
if [[ ! -f "${outputPackPath}" ]]; then
|
|
echo "Failed to build Android sound pack: ${outputPackPath}"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Generate documentation
|
|
pandoc -s files/instructions.md -o README.html
|
|
|
|
# Create packages
|
|
for platformName in linux mac windows android; do
|
|
echo "Packaging Draugnorak for ${platformName^}..."
|
|
if [[ "${platformName}" == "android" ]]; then
|
|
androidKeystorePath="${DRAUGNORAK_ANDROID_KEYSTORE:-${PWD}/.nvgt_android.keystore}"
|
|
sdkRoot="$(find_android_sdk_root || true)"
|
|
if [[ -z "${sdkRoot}" ]]; then
|
|
echo "Android SDK not found. Set ANDROID_HOME or ANDROID_SDK_HOME."
|
|
exit 1
|
|
fi
|
|
buildToolsDir="$(find_latest_build_tools_dir "${sdkRoot}" || true)"
|
|
if [[ -z "${buildToolsDir}" || ! -x "${buildToolsDir}/aapt2" || ! -x "${buildToolsDir}/zipalign" || ! -f "${buildToolsDir}/lib/apksigner.jar" ]]; then
|
|
echo "Missing required Android build tools in ${sdkRoot}."
|
|
exit 1
|
|
fi
|
|
androidJar="$(find_latest_android_jar "${sdkRoot}" || true)"
|
|
if [[ -z "${androidJar}" ]]; then
|
|
echo "No android.jar found in ${sdkRoot}/platforms."
|
|
exit 1
|
|
fi
|
|
setup_android_tools_workaround "${sdkRoot}" "${buildToolsDir}" "${androidJar}"
|
|
|
|
if [[ -f draugnorak.properties ]]; then
|
|
tmpAndroidConfigBackup="$(mktemp)"
|
|
cp draugnorak.properties "${tmpAndroidConfigBackup}"
|
|
cat "${tmpAndroidConfigBackup}" > draugnorak.properties
|
|
else
|
|
createdAndroidConfig="1"
|
|
fi
|
|
{
|
|
printf '%s\n' "build.android_install = 0"
|
|
printf '%s\n' "build.android_signature_cert = ${androidKeystorePath}"
|
|
printf '%s\n' "build.output_basename = draugnorak"
|
|
} >> draugnorak.properties
|
|
|
|
tmpAndroidPackFile=".draugnorak_android_sounds.dat"
|
|
tmpAndroidPackBuilder=".draugnorak_make_android_pack.nvgt"
|
|
build_android_sound_pack "${tmpAndroidPackFile}" "${tmpAndroidPackBuilder}"
|
|
|
|
tmpAndroidWrapperSource=".draugnorak_android_bundle_pragmas.nvgt"
|
|
cat > "${tmpAndroidWrapperSource}" <<'EOF'
|
|
#pragma embed ".draugnorak_android_sounds.dat"
|
|
#pragma asset files
|
|
#pragma document "README.html"
|
|
|
|
pack@ androidSoundPack;
|
|
bool preglobals() {
|
|
@androidSoundPack = pack();
|
|
if (androidSoundPack.open("*.draugnorak_android_sounds.dat", PACK_OPEN_MODE_READ)) {
|
|
@sound_default_pack = @androidSoundPack;
|
|
}
|
|
return true;
|
|
}
|
|
EOF
|
|
|
|
PATH="${tmpAndroidToolsDir}:${PATH}" ./nvgt -c --platform "${platformName}" --include "${tmpAndroidWrapperSource}" draugnorak.nvgt
|
|
else
|
|
./nvgt -c --platform "${platformName}" draugnorak.nvgt
|
|
fi
|
|
case "${platformName}" in
|
|
"linux"|"windows")
|
|
zip -r draugnorak.zip files/ sounds/ README.html
|
|
mv draugnorak.zip "draugnorak-${platformName}.zip"
|
|
;;
|
|
"mac")
|
|
mkdir -p draugnorak.app/Contents/Resources
|
|
cp -r files draugnorak.app/Contents/Resources
|
|
cp -r sounds draugnorak.app/Contents/Resources
|
|
cp README.html draugnorak.app/Contents/Resources
|
|
zip -r draugnorak.app.zip draugnorak.app fix_mac.sh
|
|
rm -rfv draugnorak.app/
|
|
;;
|
|
"android")
|
|
zip -r draugnorak-android.zip draugnorak.apk files/ sounds/ README.html
|
|
;;
|
|
esac
|
|
done
|
|
|
|
echo "Packaging complete!"
|
|
|
|
exit 0
|