diff options
author | NIIBE Yutaka <[email protected]> | 2018-08-28 06:37:07 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2018-08-28 06:37:07 +0000 |
commit | e91365ef38ce020651353691c53c17c662f6c890 (patch) | |
tree | 462eaa8529156ea155ce869dae017792c012d50a | |
parent | build: use EXEEXT_FOR_BUILD everywhere. (diff) | |
download | libgpg-error-e91365ef38ce020651353691c53c17c662f6c890.tar.gz libgpg-error-e91365ef38ce020651353691c53c17c662f6c890.zip |
pkg-config compatible .pc file support.
Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r-- | configure.ac | 16 | ||||
-rw-r--r-- | src/gpg-error-config.in | 86 | ||||
-rw-r--r-- | src/gpg-error.pc.in | 15 | ||||
-rw-r--r-- | src/pkgconf-funcs.sh | 119 |
4 files changed, 197 insertions, 39 deletions
diff --git a/configure.ac b/configure.ac index b5c01ba..1ea2135 100644 --- a/configure.ac +++ b/configure.ac @@ -491,13 +491,26 @@ else fi GPG_ERROR_CONFIG_ISUBDIRAFTER="" GPG_ERROR_CONFIG_HOST="$host" +case "$includedir" in + '${prefix}/include'|/usr/include|/include) GPG_ERROR_CONFIG_INCLUDEDIR="" ;; + *) GPG_ERROR_CONFIG_INCLUDEDIR="-I$includedir" ;; +esac +case "$libdir" in + '${exec_prefix}/lib'|/usr/lib|/usr/lib64|/lib|/lib64) GPG_ERROR_CONFIG_LIBDIR="" ;; + *) GPG_ERROR_CONFIG_LIBDIR="-L$libdir" ;; +esac + +PKGCONF_FUNCS_SH_CONTENT=$(cat $srcdir/src/pkgconf-funcs.sh) + AC_SUBST(GPG_ERROR_CONFIG_LIBS) AC_SUBST(GPG_ERROR_CONFIG_CFLAGS) AC_SUBST(GPG_ERROR_CONFIG_MT_LIBS) AC_SUBST(GPG_ERROR_CONFIG_MT_CFLAGS) AC_SUBST(GPG_ERROR_CONFIG_ISUBDIRAFTER) AC_SUBST(GPG_ERROR_CONFIG_HOST) - +AC_SUBST(GPG_ERROR_CONFIG_INCLUDEDIR) +AC_SUBST(GPG_ERROR_CONFIG_LIBDIR) +AC_SUBST(PKGCONF_FUNCS_SH_CONTENT) # # Special defines for certain platforms @@ -625,6 +638,7 @@ AC_CONFIG_FILES([src/Makefile tests/Makefile]) AC_CONFIG_FILES([lang/Makefile lang/cl/Makefile lang/cl/gpg-error.asd]) AC_CONFIG_FILES([src/versioninfo.rc src/gpg-error.w32-manifest]) AC_CONFIG_FILES([src/gpg-error-config], [chmod +x src/gpg-error-config]) +AC_CONFIG_FILES([src/gpg-error.pc]) AC_OUTPUT diff --git a/src/gpg-error-config.in b/src/gpg-error-config.in index aa7cb67..a0a0141 100644 --- a/src/gpg-error-config.in +++ b/src/gpg-error-config.in @@ -11,10 +11,11 @@ # SPDX-License-Identifier: FSFULLR prefix=@prefix@ -exec_prefix=@exec_prefix@ -includedir=@includedir@ -libdir=@libdir@ -isubdirafter="@GPG_ERROR_CONFIG_ISUBDIRAFTER@" +datarootdir=@datarootdir@ +datadir=@datadir@ +PKG_CONFIG_PATH="${datadir}/pkgconfig" + +@PKGCONF_FUNCS_SH_CONTENT@ if echo "$0" | grep gpg-error-config 2>/dev/null >/dev/null; then myname="gpg-error-config" @@ -22,8 +23,14 @@ else myname="gpgrt-config" fi +if find_file_in_path ${myname%-config}.pc $PKG_CONFIG_PATH; then + CONFIG_FILE=$RESULT +else + echo "Can't find ${myname%-config}.pc" 1>&2 + exit 1 +fi + output="" -mt=no usage() { @@ -44,6 +51,15 @@ if test $# -eq 0; then usage 1 1>&2 fi +if [ "$1" != "--mt" ]; then + mt=no +else + mt=yes + shift +fi + +read_config_file < "$CONFIG_FILE" + while test $# -gt 0; do case "$1" in -*=*) @@ -55,54 +71,48 @@ while test $# -gt 0; do esac case $1 in - --mt) - mt=yes - ;; - --prefix) - output="$output $prefix" + --prefix) + output="$output $(get_var prefix)" ;; - --exec-prefix) - output="$output $exec_prefix" + --exec-prefix) + output="$output $(get_var exec_prefix)" ;; - --version) - echo "@PACKAGE_VERSION@" + --version) + echo "$(get_attr Version)" exit 0 ;; - --cflags) - if test "x$includedir" != "x/usr/include" -a "x$includedir" != "x/include"; then - output="$output -I$includedir" - fi - # Note: -idirafter is a gcc extension. It is only used on - # systems where gcc is the only compiler we support (WindowsCE). - for i in $isubdirafter; do - output="$output -idirafter ${includedir}/${i}" - done - output="$output @GPG_ERROR_CONFIG_CFLAGS@" + --cflags) + output="$output $(get_attr Cflags)" if test $mt = yes ; then - output="$output @GPG_ERROR_CONFIG_MT_CFLAGS@" + output="$output $(get_var mtcflags)" fi ;; --libs) - case "$libdir" in - /usr/lib|/usr/lib64|/lib|/lib64) ;; - *) - output="$output -L$libdir" - ;; - esac - output="$output @GPG_ERROR_CONFIG_LIBS@" + output="$output $(get_attr Libs)" if test $mt = yes ; then - output="$output @GPG_ERROR_CONFIG_MT_LIBS@" + output="$output $(get_var mtlibs)" fi ;; - --host) - echo "@GPG_ERROR_CONFIG_HOST@" - exit 0 - ;; + --variable=*) + echo "$(get_var ${1#*=})" + exit 0 + ;; + --host) + echo "$(get_var host)" + exit 0 + ;; *) - usage 1 1>&2 + usage 1 1>&2 ;; esac shift done +# +# Clean up +# +# eval unset $VAR_list VAR_list +# eval unset $ATTR_list ATTR_list +# + echo $output diff --git a/src/gpg-error.pc.in b/src/gpg-error.pc.in new file mode 100644 index 0000000..fe8b553 --- /dev/null +++ b/src/gpg-error.pc.in @@ -0,0 +1,15 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +includedir=@includedir@ +libdir=@libdir@ +isubdirafter=@GPG_ERROR_CONFIG_ISUBDIRAFTER@ +host=@GPG_ERROR_CONFIG_HOST@ +mtcflags=@GPG_ERROR_CONFIG_MT_CFLAGS@ +mtlibs=@GPG_ERROR_CONFIG_MT_LIBS@ + +Name: gpg-error +Description: GPG Runtime +Version: @PACKAGE_VERSION@ +Cflags: @GPG_ERROR_CONFIG_INCLUDEDIR@ @GPG_ERROR_CONFIG_CFLAGS@ +Libs: @GPG_ERROR_CONFIG_LIBDIR@ @GPG_ERROR_CONFIG_LIBS@ +URL: https://www.gnupg.org/software/libgpg-error/index.html diff --git a/src/pkgconf-funcs.sh b/src/pkgconf-funcs.sh new file mode 100644 index 0000000..381243c --- /dev/null +++ b/src/pkgconf-funcs.sh @@ -0,0 +1,119 @@ +#################### start of pkgconf-funcs + +# +# Bourne shell functions for config file in pkg-config style, so that +# we can share such a config file between pkg-config and script +# + +# +# get_var: Get the variable value of NAME +# +# Variables are recorded in the shell variables named "VAR_<NAME>" +# +get_var () { + local name=$1 + + eval echo \$VAR_$name +} + +# +# get_attr: Get the attribute value of KEY +# +# Attributes are recorded in the shell variables named "ATTR_<KEY>" +# +get_attr () { + local name=$1 + + eval echo \$ATTR_$name +} + +# Remove ${varname} part in the beginning of a string. +remove_var_expr () { + local varname=$1 + shift + + eval echo \"\${@#\\\$\\\{$varname\\\}}\" +} + +# Given a string, substitute variables. +substitute_vars () { + local string="$1" + local line + local varname + local result + + while [ -n "$string" ]; do + case "$string" in + \$\$*) + result="$result\$" + string="${string#\$\$}" + ;; + \${*}*) + varname="${string#\$\{}" + varname="${varname%%\}*}" + result="$result$(get_var ${varname})" + string=$(remove_var_expr ${varname} ${string}) + ;; + *) + result="${result}$(printf %c "$string")" + string="${string#$(printf %c "$string")}" + ;; + esac + done + + echo "$result" +} + +# +# Read a config file +# +# Variables: +# For VAR=VALUE, value is stored in the shell variable VAR_*. +# +# Attributes: +# For KEY: VALUE, value is stored in the shell variable ATTR_*. +# +read_config_file () { + local line + local varname + local value + local key + + while read line; do + case "$line" in + *=*) + varname="${line%%=*}" + value="${line#*=}" + VAR_list="$VAR_list VAR_$varname" + read VAR_$varname <<EOF1 +$(substitute_vars "$value") +EOF1 + ;; + *:\ *) + key="${line%%:\ *}" + value="${line#*:\ }" + ATTR_list="$ATTR_list ATTR_$key" + read ATTR_$key <<EOF2 +$(substitute_vars "$value") +EOF2 + ;; + esac + done +} + + +find_file_in_path () { + local f=$1 + local p=$2 + local IFS=":" # On Windows it should be ";"??? + + for d in $p; do + if [ -e $d/$f ]; then + RESULT="$d/$f" + return 0 + fi + done + RESULT="" + return 1 +} +#################### end of pkgconf-funcs |