#!/usr/bin/env bash

#
# Generate the static-stdlib-args.lnk used by the -static-stdlib option for
# 'GenericUnix' (eg linux) plaforms. Tries to find static .a files for libs
# not normally installed by default (currently libicu)
# If libicu is built locally then include libicudata
#

# SDK=$1
OUTPUTFILE=$2
ICU_STATIC_LIB=$3
# libdirs from pkg-config
ICU_UC_LIBDIR=$4
ICU_I18N_LIBDIR=$5


# Try and find the libicu .a library files to directly link in using the
# fullpath to the files otherwise fullback to the default
function find_static_iculibs {
    if [ -n "${ICU_I18N_LIBDIR}" ]; then
        LIBICU_I18N_A=${ICU_I18N_LIBDIR}/libicui18n.a
    fi

    if [ -n "${ICU_UC_LIBDIR}" ]; then
        LIBICU_UC_A=${ICU_UC_LIBDIR}/libicuuc.a
        LIBICU_DATA_A=${ICU_UC_LIBDIR}/libicudata.a
    fi

    if [ -f "${LIBICU_I18N_A}" ] && [ -f "${LIBICU_UC_A}" ] &&
       [ -f "${LIBICU_DATA_A}" ]; then
        read -d '' ICU_LIBS <<EOF
$LIBICU_I18N_A
$LIBICU_UC_A
$LIBICU_DATA_A
EOF
    else
        read -d '' ICU_LIBS <<EOF
-licui18n
-licuuc
EOF
    fi
}


# If libicu was compiled as part of the swift build then link the libs as normal
function use_local_iculibs {
   read -d '' ICU_LIBS <<EOF
-licui18n
-licuuc
-licudata
EOF
}


function write_linkfile {
    if [ -z "${OUTPUTFILE}" ]; then
        echo $0: No outputfile specified
        exit 1
    fi
    cat >$OUTPUTFILE <<EOF
-ldl
-lpthread
-latomic
-lswiftCore
-latomic
-lswiftImageInspectionShared
$ICU_LIBS
-Xlinker
-export-dynamic
-Xlinker
--exclude-libs
-Xlinker
ALL
EOF
}


if [ "${ICU_STATIC_LIB}" == "TRUE" ]; then
    use_local_iculibs
else
    find_static_iculibs
fi
write_linkfile
