lazarus/components/compilers/delphi/script/dcc.sh
2023-05-23 13:58:01 +02:00

225 lines
5.2 KiB
Bash
Executable File

#!/bin/bash
#
# Defaults
#
#LIBROOT=/opt/delphi/linuxmint19.1.sdk
LIBROOT=
#opt/delphi/linuxmint19.1.sdk
DELPHIUNITS=~/.delphi_units.txt
DELPHILIBPATH=~/.delphi_libpath.txt
TARGET=linux64
DELPHIDIR=/opt/delphi/delphi-1101
#LINKARGS="-export-dynamic -z now -z relro -z noexecstack"
LINKARGS="-z now -z relro -z noexecstack"
BUILDCONFIG=debug
export WINEDEBUG="-all"
#
# Usage
#
function usage {
if [ ! -z $1 ]; then
echo "Error: $1"
fi
echo "Usage: $0 [options] project.dpr"
echo "Where options is one or more of: "
echo "-h help This help message"
echo "-c build-config One of debug or release (default: $BUILDCONFIG)"
echo "-dd DIR Delphi installation dir (default: $DELPHIDIR)"
echo "-la ARGS Extra linker args. (added to default args: $LINKARGS)"
echo "-lp FILE Set file with library paths (one per line, default: $DELPHILIBPATH)"
echo "-n only echo commands."
echo "-np do not set permissions on executable"
echo "-sr PATH Set sysroot (default: $LIBROOT)"
echo "-up FILE Set file with unit paths (one per line, default: $DELPHIUNITS)"
echo "-t TARGET Set OS target (default: $TARGET)"
echo "-v Be more verbose"
}
function info {
if [ "$VERBOSE" = YES ]; then
echo $*
fi
}
#
# Process command-line options
#
ARGS=
while test $# != 0
do
f=$1
case $f in
-c) shift
BUILDCONFIG=$1;;
-up) shift
DELPHIUNITS=$1;;
-dd) shift
DELPHIDIR=$1;;
-la) shift
EXTRALINKARGS=$1;;
-lp) shift
DELPHILIBPATH=$1;;
-sr) shift
LIBROOT=$1;;
-t) shift
TARGET=$1;;
-n) ECHO=YES;;
-np) NOPERMISSIONS=YES;;
-h) usage
exit 0;;
-v) VERBOSE=YES;;
-*)
ARGS="$ARGS $f";;
@*)
ARGS="$ARGS $f";;
*) PROJECT=$f
esac
shift
done
#
# Compiler & target os
#
case $TARGET in
win32)
DCC=dcc32
TARGETOSDIR=win
TARGETLIBDIR=win32;;
win64)
DCC=dcc64
TARGETOSDIR=win
TARGETLIBDIR=win64;;
linux|linux64)
DCC=dcclinux64
TARGETOSDIR="linux posix"
TARGETLIBDIR=linux64
TARGETSDKLIBPATHS="usr/lib/x86_64-linux-gnu/ lib/ lib/x86_64-linux-gnu/ usr/lib/"
NEEDPERMISSIONS=YES;;
osx|osx64)
DCC=dccosx64
TARGETOSDIR="osx posix"
TARGETLIBDIR=osx64
NEEDPERMISSIONS=YES;;
osxarm|osxarm64)
DCC=dccosxarm64
TARGETOSDIR="osx posix"
TARGETLIBDIR=osxarm64
NEEDPERMISSIONS=YES;;
ios|ios64)
DCC=dcciosarm64
TARGETOSDIR="ios posix"
TARGETLIBDIR="iosDevice64";;
android)
DCC=dccaarm
TARGETOSDIR="android posix"
TARGETLIBDIR="android";;
android64)
DCC=dccaarm64
TARGETOSDIR="android posix"
TARGETLIBDIR="android64";;
*) Usage "Unknown target: $TARGET"
exit 1;;
esac
info "Building for target: $TARGET, for config: $BUILDCONFIG"
#
# Check echo only
#
if [ "$ECHO" = "YES" ]; then
CMD=echo
fi
#
# Unit paths
#
UNITPATHS=.
if [ ! -f "$DELPHIUNITS" ]; then
info "Creating default unit paths based on $DELPHIDIR installation."
for d in lib lib/$TARGETLIBDIR/$BUILDCONFIG Imports include
do
UNITPATHS="$UNITPATHS;$DELPHIDIR/$d"
done
for d in fmx DUnit DUnit/src
do
UNITPATHS="$UNITPATHS;$DELPHIDIR/source/$d"
done
for d in $TARGETOSDIR
do
UNITPATHS="$UNITPATHS;$DELPHIDIR/source/rtl/$d"
done
else
info "Creating default unit paths based on $DELPHIUNITS file."
for U in $(cat $DELPHIUNITS)
do
eval "UD=$U"
UNITPATHS="$UNITPATHS;$UD"
done
fi
info "Unit paths: $UNITPATHS"
info ""
#
# Library paths
#
LIBPATHS=.
if [ ! -f "$DELPHILIBPATH" ]; then
info "Creating default delphi library paths based on $DELPHIDIR installation."
LIBPATHS=$DELPHIDIR/lib/$TARGETLIBDIR/$BUILDCONFIG
if [ ! -z "$TARGETSDKLIBPATHS" ]; then
for lp in $TARGETSDKLIBPATHS
do
LIBPATHS="$LIBPATHS;$LIBROOT/$lp"
done
fi
else
info "Creating default delphi library paths based on $DELPHILIBPATH file."
for L in $(cat $DELPHILIBPATH)
do
eval "LD=$L"
LIBPATHS="$LIBPATHS;$LD"
done
fi
info "Library paths: $LIBPATHS"
info ""
#
# Various linker args
#
case $TARGET in
linux|linux64)
LIBPATHARG=--libpath:"$LIBPATHS"
SYSROOTARG=--syslibroot:"$LIBROOT"
LINKEROPTIONSARG="--linker-option:$LINKARGS $EXTRALINKARGS"
esac
#
# Correct project file
#
UNIXPROJECT=$PROJECT
echo "$PROJECT" | grep \\\\ &> /dev/null
if [ $? != 0 ]; then
PROJECT=$(winepath -w "$PROJECT")
info "Converted project file to windows notation: $PROJECT";
fi
#
# Call compiler
#
info "Calling compiler ${DELPHIDIR}/bin/${DCC}.exe:"
#
# The ${var+"$var"} is needed to omit empty arguments, which will be interoreted by delphi as empty filenames :/
#
$CMD wine "${DELPHIDIR}/bin/${DCC}.exe" ${LIBPATHARG+"$LIBPATHARG"} ${SYSROOTARG+"$SYSROOTARG"} ${LINKEROPTIONSARG+"$LINKEROPTIONSARG"} "-U$UNITPATHS" $ARGS "$PROJECT"
E=$?
if [ "$E" = 0 ]; then
PROJEXE=$(dirname "$UNIXPROJECT")/$(basename "$UNIXPROJECT" .lpr)
if [ "$NEEDPERMISSIONS" = YES -a ! "$NOPERMISSIONS" = YES ]; then
if [ -f "$PROJEXE" ]; then
info "Setting permissions on $PROJEXE"
$CMD chmod 755 "$PROJEXE"
else
info "No output executable found: $PROJEXE"
fi
fi
fi
#
# Output a nice goodbye
#
info ""
info "All done!"
#
# That's all, folks!
#