diff --git a/components/compilers/delphi/script/README.md b/components/compilers/delphi/script/README.md new file mode 100644 index 0000000000..ea3000eb57 --- /dev/null +++ b/components/compilers/delphi/script/README.md @@ -0,0 +1,14 @@ +# Delphi compiling script + +This directory contains a script that will call the Delphi compiler using +wine. It will select the correct compiler based on the -t option. +The default compiler is the linux 64-bit compiler. + +You must adapt this script to configure the location of the Delphi +compiler(s) and the Delphi sources, dcu files and so on: the variables at the +start of the script can be used for this. + +The script will also change the file mode of the generated executable, +making it actually executable. + +Run the script with -h to get a list of supported options. diff --git a/components/compilers/delphi/script/dcc.sh b/components/compilers/delphi/script/dcc.sh new file mode 100755 index 0000000000..55090c2496 --- /dev/null +++ b/components/compilers/delphi/script/dcc.sh @@ -0,0 +1,224 @@ +#!/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! +#