blob: bb7c24945170d7ca7a1a6d79198885d4a740b208 [file] [log] [blame] [edit]
#!/bin/bash
###############################################################################
# BRLTTY - A background process providing access to the console screen (when in
# text mode) for a blind person using a refreshable braille display.
#
# Copyright (C) 1995-2023 by The BRLTTY Developers.
#
# BRLTTY comes with ABSOLUTELY NO WARRANTY.
#
# This is free software, placed under the terms of the
# GNU Lesser General Public License, as published by the Free Software
# Foundation; either version 2.1 of the License, or (at your option) any
# later version. Please see the file LICENSE-LGPL for details.
#
# Web Page: http://brltty.app/
#
# This software is maintained by Dave Mielke <dave@mielke.cc>.
###############################################################################
set -e
shopt -s nullglob
defaultArchiveName="brltty-dos"
defaultInstallDirectory="BRLTTY"
. "`dirname "${0}"`/../prologue.sh"
addProgramOption a string.name archiveName "specify archive name" "${defaultArchiveName}"
addProgramOption i string.directory installDirectory "specify installation directory on target system" "${defaultInstallDirectory}"
addProgramOption o flag overwriteArchive "overwrite existing archive"
addProgramOption s flag invokeShell "invoke interactive shell to inspect/modify result"
addProgramOption T string.directory toolsRoot "specify tool chain root directory"
addProgramParameter source sourceDirectory "top-level directory of source tree"
parseProgramArguments "${@}"
[ -n "${archiveName}" ] || archiveName="${defaultArchiveName}"
[ -n "${installDirectory}" ] || installDirectory="${defaultInstallDirectory}"
[ -n "${toolsRoot}" ] && export DOS_TOOLS_ROOT="${toolsRoot}"
[ -n "${sourceDirectory}" ] || sourceDirectory="."
verifyInputDirectory "${sourceDirectory}" || semanticError
sourceDirectory="$(resolveDirectory "${sourceDirectory}")"
archivePath="${initialDirectory}/${archiveName}.zip"
[ ! -e "${archivePath}" ] || {
"${overwriteArchive}" ] || semanticError "archive already exists: ${archivePath}"
rm -f -r "${archivePath}"
}
function convertTextFile {
local file="${1}"
unix2dos -q -o "${file}"
}
function installFile {
local sourceFile="${1}"
local targetFile="${2}"
targetFile="${installDirectory}/${targetFile}"
local targetDirectory="${targetFile%/*}"
mkdir -p "${targetDirectory}"
cp "${sourceFile}" "${targetFile}"
}
function installCSV {
local oldName="${1}"
local newName="${2}"
local extension="csv"
installFile "${sourceDirectory}/${documentsSubdirectory}/${oldName}.${extension}" "${documentSubdirectory}/${newName}.${extension}"
}
function installManualFiles {
local directory="${1}"
cd "${directory}/Documents/Manual-BRLTTY"
local oldFile
for oldFile in $(find . -type f)
do
local newFile="${oldFile}"
local subdirectory="${oldFile%/*}"
local name="${oldFile##*/}"
local extension="${name##*.}"
name="${name%.*}"
case "${extension}"
in
html)
sed -r -e 's/"([[:alpha:]]+)(-([[:digit:]]+))?\.html(["#])/"\1\3.htm\4/g' -i "${oldFile}"
newFile="${subdirectory}/${name/-/}.${extension:0:3}"
;;
txt | htm | doc | pdf);;
*) continue;;
esac
installFile "${oldFile}" "${manualSubdirectory}/${newFile}"
done
}
needTemporaryDirectory
buildDirectory="${temporaryDirectory}/build"
mkdir -p "${buildDirectory}"
installDirectory="${temporaryDirectory}/intall/${installDirectory}"
mkdir -p "${installDirectory}"
documentSubdirectory="doc"
manualSubdirectory="${documentSubdirectory}/Manual"
cd "${buildDirectory}"
logMessage task "configuring build"
"${sourceDirectory}/cfg-dos" --prefix="${installDirectory}"
logMessage task "building programs"
make -s -C Programs all-commands
logMessage task "building documentation"
make -s -C Documents all
logMessage task "installing files"
make -s -C Programs install-commands install-tables
logMessage task "updating files"
cd "${installDirectory}/bin"
mv brltty-lscmds.exe brllscmd.exe
mv brltty-trtxt.exe brltrtxt.exe
mv brltty-ttb.exe brlttb.exe
mv brltty-ctb.exe brlctb.exe
mv brltty-atb.exe brlatb.exe
mv brltty-ktb.exe brlktb.exe
mv brltty-tune.exe brltune.exe
mv brltty-morse.exe brlmorse.exe
cd "${sourceDirectory}/DOS"
installFile cwsdpmi.exe "bin/cwsdpmi.exe"
cd "${sourceDirectory}/Drivers"
name=README
for driverType in Braille Speech
do
cd "${driverType}"
for driverName in *
do
cd "${driverName}"
typeset -u driverCode="$(sed -n -e '/^ *DRIVER_CODE *= */s/^.*= *//p' "Makefile.in")"
for file in "${name}"*
do
document="${file/#${name}/${driverCode}}"
document="${document//./-}"
installFile "${file}" "${documentSubdirectory}/Drivers/${driverType}/${document}.txt"
done
cd ..
done
cd ..
done
cd "${sourceDirectory}"
installFile "LICENSE-LGPL" "LIC-LGPL.txt"
installFile "README" "README.txt"
cd "${documentsSubdirectory}"
installFile "ChangeLog" "${documentSubdirectory}/CHG-LOG.txt"
for file in DOS
do
installFile "README.${file}" "${documentSubdirectory}/${file}.txt"
done
for file in BUGS CONTRIBUTORS HISTORY TODO
do
installFile "${file}" "${documentSubdirectory}/${file}.txt"
done
installCSV braille-driver BRL-DRV
installCSV speech-driver SPK-DRV
installCSV screen-driver SCR-DRV
installCSV text-table TEXT-TBL
installCSV contraction-table CONT-TBL
installCSV attributes-table ATTR-TBL
installCSV keyboard-table KBD-TBL
installManualFiles "${sourceDirectory}"
installManualFiles "${buildDirectory}"
cd "${buildDirectory}"
installFile "Documents/brltty.conf" "etc/brltty.cfg"
installFile "Programs/revision_identifier.auto.h" "REVISION.txt"
sed -e 's/"//g' -i "${installDirectory}/REVISION.txt"
logMessage task "converting text files"
cd "${installDirectory}"
find . -print |
while read path
do
handle="${path#.}"
[ -n "${handle}" ] || continue
name="${path##*/}"
extension="${name##*.}"
if [ "${name#*.*.}" != "${name}" ]
then
logWarning "name contains more than one dot: ${handle}"
elif [ "${name#.}" != "${name}" ]
then
logWarning "null name: ${handle}"
elif [ "${name%.}" != "${name}" ]
then
logWarning "null extension: ${handle}"
elif [ -f "${path}" ]
then
if [ "${extension}" = "${name}" ]
then
logWarning "file without an extension: ${handle}"
else
case "${extension}"
in
txt | html | htm | csv | cfg | [tcak]t[bi] | h) convertTextFile "${path}";;
exe | pdf | doc);;
*) logWarning "unexpected file extension: ${handle}";;
esac
fi
elif [ -d "${path}" ]
then
if [ "${extension}" != "${name}" ]
then
logWarning "directory with an extension: ${handle}"
fi
else
logWarning "unsupported special file: ${handle}"
fi
done
logMessage task "checking for name collisions"
cd "${installDirectory}"
find . -type d -print |
while read directory
do
declare -A shortNames=()
for longName in $(ls -1 --quote-name --quoting-style=shell "${directory}")
do
delimiter="."
prefix="${longName%${delimiter}*}"
if [ "${prefix}" = "${longName}" ]
then
suffix=""
delimiter=""
else
suffix="${longName:${#prefix}+${#delimiter}}"
fi
prefix="${prefix:0:8}"
suffix="${suffix:0:3}"
declare -u shortName="${prefix}${delimiter}${suffix}"
if [ "${#shortNames["${shortName}"]}" -eq 0 ]
then
shortNames["${shortName}"]="${longName}"
else
logWarning "name collision: ${directory#.}: ${shortNames["${shortName}"]} & ${longName}"
fi
done
done
! "${invokeShell}" || {
logMessage task "invoking shell"
cd "${installDirectory}"
"${SHELL:-/bin/sh}" || :
}
logMessage task "creating archive"
cd "${installDirectory}/.."
zip -q -r "${archivePath}" "${installDirectory##*/}"
logMessage task "done"
exit 0