Files
draugnorak/package.sh
T

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