#!/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>.
###############################################################################

. "$(dirname "${0}")/../prologue.sh"

defaultPackageName="brltty"
variableNames=()

processExtraProgramParameters() {
   variableNames+=( "${@}" )
}

addProgramOption b string.directory buildRoot "the root directory of the build"
addProgramOption p string.name packageName "the name of the package" "${defaultPackageName}"
optionalProgramParameters
parseProgramArguments "${@}"

if [ -n "${buildRoot}" ]
then
   verifyInputDirectory "${buildRoot}"
else
   setBuildRoot
fi

[ -n "${packageName}" ] || packageName="${defaultPackageName}"

pkgConfig() {
   pkg-config "${@}" -- "${packageName}" || return "${?}"
}

export PKG_CONFIG_PATH="${buildRoot}"
pkgConfig --exists || semanticError "package not found: ${packageName}"

if [ "${#variableNames[*]}" -eq 0 ]
then
   pkgConfig --print-variables | sort
else
   for variableName in "${variableNames[@]}"
   do
      pkgConfig --variable="${variableName}"
   done
fi

exit 0
