# shellcheck shell=bash disable=SC2154,SC2164

# BSD makefiles should be able to detect this
# but without they end up using gcc on Darwin stdenv
addMakeFlags() {
  export setOutputFlags=

  export LIBCRT0=
  export LIBCRTI=
  export LIBCRTEND=
  export LIBCRTBEGIN=
  export LIBC=
  export LIBUTIL=
  export LIBSSL=
  export LIBCRYPTO=
  export LIBCRYPT=
  export LIBCURSES=
  export LIBTERMINFO=
  export LIBM=
  export LIBL=

  export _GCC_CRTBEGIN=
  export _GCC_CRTBEGINS=
  export _GCC_CRTEND=
  export _GCC_CRTENDS=
  export _GCC_LIBGCCDIR=
  export _GCC_CRTI=
  export _GCC_CRTN=
  export _GCC_CRTDIR=

  # Definitions passed to share/mk/*.mk. Should be pretty simple -
  # eventually maybe move it to a configure script.
  export USETOOLS=never
  export NOCLANGERROR=yes
  export NOGCCERROR=yes
  export LEX=flex
  export MKUNPRIVED=yes
  export EXTERNAL_TOOLCHAIN=yes

  prependToVar makeFlags "MACHINE=$MACHINE"
  prependToVar makeFlags "MACHINE_ARCH=$MACHINE_ARCH"
  prependToVar makeFlags "AR=$AR"
  prependToVar makeFlags "CC=$CC"
  prependToVar makeFlags "CPP=$CPP"
  prependToVar makeFlags "CXX=$CXX"
  prependToVar makeFlags "LD=$LD"
  prependToVar makeFlags "STRIP=$STRIP"

  prependToVar makeFlags "BINDIR=${!outputBin}/bin"
  prependToVar makeFlags "LIBDIR=${!outputLib}/lib"
  prependToVar makeFlags "SHLIBDIR=${!outputLib}/lib"
  prependToVar makeFlags "SHAREDIR=${!outputLib}/share"
  prependToVar makeFlags "INFODIR=${!outputInfo}/share/info"
  prependToVar makeFlags "DOCDIR=${!outputDoc}/share/doc"
  prependToVar makeFlags "LOCALEDIR=${!outputLib}/share/locale"

  # Parallel building. Needs the space.
  prependToVar makeFlags "-j $NIX_BUILD_CORES"
}

setBSDSourceDir() {
  sourceRoot=$PWD/$sourceRoot
  export BSDSRCDIR=$sourceRoot
  export _SRC_TOP_=$BSDSRCDIR
  cd "$sourceRoot"
}

cdBSDPath() {
  if [ -d "$COMPONENT_PATH" ]
    then sourceRoot=$sourceRoot/$COMPONENT_PATH
    cd "$COMPONENT_PATH"
  fi
}

includesPhase() {
  if [ -z "${skipIncludesPhase:-}" ]; then
    runHook preIncludes

    local flagsArray=()
    concatTo flagsArray makeFlags makeFlagsArray
    flagsArray+=(includes)

    echoCmd 'includes flags' "${flagsArray[@]}"
    make ${makefile:+-f $makefile} "${flagsArray[@]}"

    moveUsrDir

    runHook postIncludes
  fi
}

moveUsrDir() {
  if [ -d "$prefix" ]; then
    # Remove lingering /usr references
    if [ -d "$prefix/usr" ]; then
      # Didn't try using rsync yet because per
      # https://unix.stackexchange.com/questions/127712/merging-folders-with-mv,
      # it's not neessarily better.
      pushd "$prefix/usr"
      find . -type d -exec mkdir -p "$out/{}" \;
      find . \( -type f -o -type l \) -exec mv "{}" "$out/{}" \;
      popd
    fi

    find "$prefix" -type d -empty -delete
  fi
}

postUnpackHooks+=(setBSDSourceDir)
postPatchHooks+=(cdBSDPath)
preConfigureHooks+=(addMakeFlags)
preInstallHooks+=(includesPhase)
fixupOutputHooks+=(moveUsrDir)