From 7a7caf4ba1c460c9c36f754fcd0ebfeb4aa5cc6a Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Tue, 18 Jun 2019 15:26:50 +0900 Subject: build: Take care of POSIX shell path. * configure.ac (INSTALLSHELLPATH): New. * src/Makefile.am: Change invocation of gpg-error-config-test.sh. * src/gpgrt-config.in (INSTALLSHELLPATH): To be substituted. * src/gpg-error-config-test.sh.in: Likewise. -- GnuPG-bug-id: 4574 Signed-off-by: NIIBE Yutaka --- configure.ac | 6 + src/Makefile.am | 2 +- src/gpg-error-config-test.sh | 90 ------ src/gpg-error-config-test.sh.in | 90 ++++++ src/gpg-error-config.in | 2 +- src/gpgrt-config | 626 ---------------------------------------- src/gpgrt-config.in | 626 ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 724 insertions(+), 718 deletions(-) delete mode 100755 src/gpg-error-config-test.sh create mode 100644 src/gpg-error-config-test.sh.in delete mode 100755 src/gpgrt-config create mode 100644 src/gpgrt-config.in diff --git a/configure.ac b/configure.ac index d56f4c1..dc93071 100644 --- a/configure.ac +++ b/configure.ac @@ -195,17 +195,21 @@ AC_CHECK_HEADERS([stdlib.h locale.h stdint.h sys/select.h sys/time.h \ AC_FUNC_STRERROR_R case "${host_os}" in mingw32*) + INSTALLSHELLPATH=/bin/sh AC_CHECK_FUNC([strerror_s]) ;; solaris*) + INSTALLSHELLPATH=/usr/xpg4/bin/sh # All versions of Solaris from 2.4 have a thread-safe strerror(). # Since Solaris 10, in addition strerror_r() exists. ;; *) + INSTALLSHELLPATH=/bin/sh AC_CHECK_FUNC([strerror_r], [], AC_MSG_WARN([[Without strerror_r, gpg_strerror_r might not be thread-safe]])) ;; esac +AC_SUBST(INSTALLSHELLPATH) AC_FUNC_FORK AC_CHECK_FUNCS([flockfile vasprintf mmap rand strlwr stpcpy setenv stat \ @@ -699,6 +703,8 @@ 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.pc]) AC_CONFIG_FILES([src/gpg-error-config-old:src/gpg-error-config.in], [chmod +x src/gpg-error-config-old]) +AC_CONFIG_FILES([src/gpgrt-config], [chmod +x src/gpgrt-config]) +AC_CONFIG_FILES([src/gpg-error-config-test.sh], [chmod +x src/gpg-error-config-test.sh]) AC_OUTPUT diff --git a/src/Makefile.am b/src/Makefile.am index 27d3dff..fb4ef48 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -338,7 +338,7 @@ gpgrt.h: gpg-error.h gpg-error-config: gpgrt-config gpg-error-config-old @echo $(ECHO_N) "Confirm gpg-error-config works... $(ECHO_C)" - @if $(srcdir)/gpg-error-config-test.sh --old-new; then \ + @if ./gpg-error-config-test.sh --old-new; then \ echo "good"; \ else \ echo "no"; \ diff --git a/src/gpg-error-config-test.sh b/src/gpg-error-config-test.sh deleted file mode 100755 index 7125e10..0000000 --- a/src/gpg-error-config-test.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/sh - -srcdir=${0%/*} - -PKG_CONFIG_PATH="." - -export PKG_CONFIG_PATH - -if [ "$1" = --old-new ]; then - PKG_CONFIG_CMD=./gpg-error-config-old -else - PKG_CONFIG_SYSROOT_DIR="/var/example-target" - export PKG_CONFIG_SYSROOT_DIR - PKG_CONFIG_CMD="pkg-config gpg-error" - if ! $PKG_CONFIG_CMD --exists >/dev/null; then - exit 77 # Skip tests - fi -fi - -test_failed="" - -failure () { - ( - echo "Test result: $*" - echo "====================: $PKG_CONFIG_CMD" - echo "$OUTPUT_OLD" - echo "====================: gpgrt-config" - echo "$OUTPUT_NEW" - echo "====================" - ) >> gpg-error-config-test.log - test_failed=yes -} - -rm -f gpg-error-config-test.log - -OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --libs)) -OUTPUT_NEW=$($srcdir/gpgrt-config --libs) -[ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --libs - -OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --cflags)) -OUTPUT_NEW=$($srcdir/gpgrt-config --cflags) -[ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --cflags - -OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --cflags --libs)) -OUTPUT_NEW=$($srcdir/gpgrt-config --cflags --libs) -[ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --cflags --libs - -if [ "$PKG_CONFIG_CMD" = ./gpg-error-config-old ]; then - OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --version)) - OUTPUT_NEW=$($srcdir/gpgrt-config --version) - [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --version - - OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --mt --libs)) - OUTPUT_NEW=$($srcdir/gpgrt-config --mt --libs) - [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --mt --libs - - OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --mt --cflags)) - OUTPUT_NEW=$($srcdir/gpgrt-config --mt --cflags) - [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --mt --cflags - - OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --cflags --libs)) - OUTPUT_NEW=$($srcdir/gpgrt-config --cflags --libs) - [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --cflags --libs - - OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --mt --cflags --libs)) - OUTPUT_NEW=$($srcdir/gpgrt-config --mt --cflags --libs) - [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --mt --cflags --libs - - OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --variable=mtcflags)) - OUTPUT_NEW=$($srcdir/gpgrt-config --variable=mtcflags) - [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --variable=mtcflags - - OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --variable=mtlibs)) - OUTPUT_NEW=$($srcdir/gpgrt-config --variable=mtlibs) - [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --variable=mtlibs - - OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --variable=host)) - OUTPUT_NEW=$($srcdir/gpgrt-config --variable=host) - [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --variable=host -fi - -if [ -n "$test_failed" ]; then - OUTPUT_OLD=$($PKG_CONFIG_CMD --version) - OUTPUT_NEW=$($srcdir/gpgrt-config --version) - failure --version - - exit 99 -fi - -exit 0 diff --git a/src/gpg-error-config-test.sh.in b/src/gpg-error-config-test.sh.in new file mode 100644 index 0000000..2a4ad7a --- /dev/null +++ b/src/gpg-error-config-test.sh.in @@ -0,0 +1,90 @@ +#!@INSTALLSHELLPATH@ + +srcdir=${0%/*} + +PKG_CONFIG_PATH="." + +export PKG_CONFIG_PATH + +if [ "$1" = --old-new ]; then + PKG_CONFIG_CMD=./gpg-error-config-old +else + PKG_CONFIG_SYSROOT_DIR="/var/example-target" + export PKG_CONFIG_SYSROOT_DIR + PKG_CONFIG_CMD="pkg-config gpg-error" + if ! $PKG_CONFIG_CMD --exists >/dev/null; then + exit 77 # Skip tests + fi +fi + +test_failed="" + +failure () { + ( + echo "Test result: $*" + echo "====================: $PKG_CONFIG_CMD" + echo "$OUTPUT_OLD" + echo "====================: gpgrt-config" + echo "$OUTPUT_NEW" + echo "====================" + ) >> gpg-error-config-test.log + test_failed=yes +} + +rm -f gpg-error-config-test.log + +OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --libs)) +OUTPUT_NEW=$($srcdir/gpgrt-config --libs) +[ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --libs + +OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --cflags)) +OUTPUT_NEW=$($srcdir/gpgrt-config --cflags) +[ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --cflags + +OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --cflags --libs)) +OUTPUT_NEW=$($srcdir/gpgrt-config --cflags --libs) +[ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --cflags --libs + +if [ "$PKG_CONFIG_CMD" = ./gpg-error-config-old ]; then + OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --version)) + OUTPUT_NEW=$($srcdir/gpgrt-config --version) + [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --version + + OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --mt --libs)) + OUTPUT_NEW=$($srcdir/gpgrt-config --mt --libs) + [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --mt --libs + + OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --mt --cflags)) + OUTPUT_NEW=$($srcdir/gpgrt-config --mt --cflags) + [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --mt --cflags + + OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --cflags --libs)) + OUTPUT_NEW=$($srcdir/gpgrt-config --cflags --libs) + [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --cflags --libs + + OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --mt --cflags --libs)) + OUTPUT_NEW=$($srcdir/gpgrt-config --mt --cflags --libs) + [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --mt --cflags --libs + + OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --variable=mtcflags)) + OUTPUT_NEW=$($srcdir/gpgrt-config --variable=mtcflags) + [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --variable=mtcflags + + OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --variable=mtlibs)) + OUTPUT_NEW=$($srcdir/gpgrt-config --variable=mtlibs) + [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --variable=mtlibs + + OUTPUT_OLD=$(echo $($PKG_CONFIG_CMD --variable=host)) + OUTPUT_NEW=$($srcdir/gpgrt-config --variable=host) + [ "$OUTPUT_OLD" = "$OUTPUT_NEW" ] || failure --variable=host +fi + +if [ -n "$test_failed" ]; then + OUTPUT_OLD=$($PKG_CONFIG_CMD --version) + OUTPUT_NEW=$($srcdir/gpgrt-config --version) + failure --version + + exit 99 +fi + +exit 0 diff --git a/src/gpg-error-config.in b/src/gpg-error-config.in index c1c771a..3b45928 100644 --- a/src/gpg-error-config.in +++ b/src/gpg-error-config.in @@ -1,4 +1,4 @@ -#!/bin/sh +#!@INSTALLSHELLPATH@ # Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives diff --git a/src/gpgrt-config b/src/gpgrt-config deleted file mode 100755 index 646224f..0000000 --- a/src/gpgrt-config +++ /dev/null @@ -1,626 +0,0 @@ -#!/bin/sh -# Copyright (C) 2018 g10 Code GmbH -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This file is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# SPDX-License-Identifier: FSFULLR - -#### start of functions for this script - -# -# 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_" -# -get_var () { - ___name=$1 - - eval echo \$VAR_$___name -} - -# -# get_attr: Get the attribute value of KEY -# -# Attributes are recorded in the shell variables named "ATTR_" -# -get_attr () { - ___name=$1 - - eval echo \$ATTR_$___name -} - -# Remove ${varname} part in the beginning of a string. -remove_var_expr () { - ___varname=$1 - shift - - expr "$*" : "\${$___varname}\\(.*\\)" -} - -# Given a string, substitute variables. -substitute_vars () { - __string="$1" - __varname="" - __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 from stdin -# -# 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_from_stdin () { - _filename=$1 - _line="" - _varname="" - _value="" - _key="" - _reading_attrs="" - - while read _line; do - if [ -z "$_line" ]; then - _reading_attrs=yes - continue - elif [ -z "$_reading_attrs" ]; then - case "$_line" in - *=*) - _varname="${_line%%=*}" - _value="${_line#*=}" - VAR_list="$VAR_list${VAR_list:+ }VAR_$_varname" - read VAR_$_varname <&2 - exit 1 - ;; - esac - fi - done -} - - -find_file_in_path () { - _f=$1 - _p=$2 - _saved_IFS="$IFS" - _arg="" - IFS=":" # On Windows it should be ";"??? - - for _arg in $_p; do - if [ -r $_arg/$_f ]; then - RESULT="$_arg/$_f" - IFS="$_saved_IFS" - return 0 - fi - done - IFS="$_saved_IFS" - RESULT="" - return 1 -} - -read_config_file () { - if ! find_file_in_path $1.pc $2; then - if [ -z "$want_exists" ]; then - echo "Can't find $1.pc" 1>&2 - fi - exit 1 - fi - read_config_from_stdin $RESULT < $RESULT -} - -cleanup_vars_attrs () { - eval unset $VAR_list VAR_list - eval unset $ATTR_list ATTR_list -} - -not_listed_yet () { - ___m=$1 - ___arg="" - shift - - for ___arg; do - if [ $___m = $___arg ]; then - return 1 - fi - done - - return 0 -} - -list_only_once () { - __result="" - __arg="" - - for __arg; do - if not_listed_yet $__arg $__result; then - __result="$__result${__result:+ }$__arg" - fi - done - - echo $__result -} - -list_only_once_for_libs () { - __result="" - __rev_list="" - __arg="" - - # Scan the list and eliminate duplicates for non-"-lxxx" - # the resulted list is in reverse order - for __arg; do - case "$__arg" in - -l*) - # As-is - __rev_list="$__arg${__rev_list:+ }$__rev_list" - ;; - *) - if not_listed_yet $__arg $__rev_list; then - __rev_list="$__arg${__rev_list:+ }$__rev_list" - fi - ;; - esac - done - - # Scan again - for __arg in $__rev_list; do - case "$__arg" in - -l*) - if not_listed_yet $__arg $__result; then - __result="$__arg${__result:+ }$__result" - fi - ;; - *) - # As-is - __result="$__arg${__result:+ }$__result" - ;; - esac - done - - echo $__result -} - -arg1_is_same () { - [ "$1" = "=" -o "$1" = ">=" -o "$1" = "<=" ] -} - -arg1_is_less () { - [ "$1" = "!=" -o "$1" = "<" -o "$1" = "<=" ] -} - -arg1_is_great () { - [ "$1" = "!=" -o "$1" = ">" -o "$1" = ">=" ] -} - -# -# Evaluate comparison between versions in RPM way -# -eval_compare_version () { - ___str1="$1" - ___cmp="$2" - ___str2="$3" - ___char1="" - ___char2="" - ___chunk1="" - ___chunk2="" - - while [ -n "$___str1" -a -n "$___str2" ]; do - # Trim anything that's not alnum or tilde from the front - ___str1="$(expr "$___str1" : '[^0-9A-Za-z~]*\(.*\)')" - ___str2="$(expr "$___str2" : '[^0-9A-Za-z~]*\(.*\)')" - - # Get the first character - ___char1=${___str1%${___str1#?}} - ___char2=${___str2%${___str2#?}} - - if [ "$___char1" = ~ -o "$___char2" = ~ ]; then - if [ "$___char1" != ~ ]; then - arg1_is_great $___cmp - return - fi - if [ "$___char2" != ~ ]; then - arg1_is_less $___cmp - return - fi - ___str1=${___str1#~} - ___str2=${___str2#~} - continue - fi - - if [ -z "$___char1" -o -z "$___char2" ]; then - break - fi - - case "$___char1$___char2" in - [0-9][A-Za-z]) - arg1_is_great $___cmp - return - ;; - [A-Za-z][0-9]) - arg1_is_less $___cmp - return - ;; - [0-9][0-9]) - ___chunk1="$(expr "$___str1" : '\([0-9]*\)')" - ___chunk2="$(expr "$___str2" : '\([0-9]*\)')" - ;; - [A-Za-z][A-Za-z]) - ___chunk1="$(expr "$___str1" : '\([A-Za-z]*\)')" - ___chunk2="$(expr "$___str2" : '\([A-Za-z]*\)')" - ;; - esac - - # Compare chunks numerically if digits, or lexicographically - if expr "$___chunk1" "!=" "$___chunk2" >/dev/null; then - if expr "$___chunk1" ">" "$___chunk2" >/dev/null; then - arg1_is_great $___cmp - return - else - arg1_is_less $___cmp - return - fi - fi - - # Remove the chunk - ___str1="${___str1#$___chunk1}" - ___str2="${___str2#$___chunk2}" - done - - # Either STR1, STR2 or both is empty here - if [ -n "$___str1" ]; then - case "$___str1" in - ~*) arg1_is_less $___cmp ;; - *) arg1_is_great $___cmp ;; - esac - elif [ -n "$___str2" ]; then - case "$___str2" in - ~*) arg1_is_great $___cmp ;; - *) arg1_is_less $___cmp ;; - esac - else - arg1_is_same $___cmp - fi -} - -# -# Recursively solve package dependencies -# -# Result is in the PKG_LIST variable -# -all_required_config_files () { - all_list="" - new_list="" - p="" - pkg="" - cmp="" - - list=$* - while [ -n "$list" ]; do - for p in $list; do - if [ -z "$pkg" ]; then - pkg=$p - elif [ -z "$cmp" ]; then - case "$p" in - "="|"!="|"<"|">"|"<="|">=") cmp=$p ;; - *) - read_config_file $pkg $PKG_CONFIG_PATH - all_list="$all_list${all_list:+ }$pkg" - new_list="$new_list${new_list:+ }$(get_attr Requires)" - cleanup_vars_attrs - pkg=$p - ;; - esac - else - read_config_file $pkg $PKG_CONFIG_PATH - if ! eval_compare_version "$(get_attr Version)" $cmp $p; then - echo "Version mismatch for $pkg $cmp $p: $(get_attr Version)" 1>&2 - exit 1 - fi - all_list="$all_list${all_list:+ }$pkg" - new_list="$new_list${new_list:+ }$(get_attr Requires)" - cleanup_vars_attrs - pkg="" - cmp="" - fi - done - if [ -n "$cmp" ]; then - echo "No version after comparison operator ($cmp): $pkg" 1>&2 - exit 1 - elif [ -n "$pkg" ]; then - read_config_file $pkg $PKG_CONFIG_PATH - all_list="$all_list${all_list:+ }$pkg" - new_list="$new_list${new_list:+ }$(get_attr Requires)" - cleanup_vars_attrs - fi - - list="$new_list" - new_list="" - done - - PKG_LIST=$(list_only_once $all_list) -} - -# -# Modify -I or -L by PKG_CONFIG_SYSROOT_DIR variable -# -sysroot () { - _opt="$1" - _result="" - shift - - while [ $# -gt 0 ]; do - if [ $1 = $_opt ]; then - _result="$_result${_result:+ }$_opt" - shift - _result="$_result $PKG_CONFIG_SYSROOT_DIR$1" - elif expr "x$1" : "^x$_opt" >/dev/null; then - _result="$_result${_result:+ }$_opt$PKG_CONFIG_SYSROOT_DIR$(expr "x$1" : "^x$_opt\(.*\)")" - else - _result="$_result${_result:+ }$1" - fi - shift - done - echo "$_result" -} - -# Show usage -usage () { - cat <&2 - exit 1 - fi -else - if [ -n "$libdir" ]; then - # --libdir option is available, it overrides existing PKG_CONFIG_LIBDIR - PKG_CONFIG_LIBDIR=$libdir/pkgconfig - fi - if [ -z "$PKG_CONFIG_LIBDIR" ]; then - if [ -z "$PKG_CONFIG_PATH" ]; then - echo "Please use --libdir=LIBDIR option or set PKG_CONFIG_LIBDIR" 1>&2 - echo "Or set PKG_CONFIG_PATH" 1>&2 - exit 1 - fi - else - # PKG_CONFIG_LIBDIR is available here - # Modify PKG_CONFIG_PATH, prepending PKG_CONFIG_LIBDIR - PKG_CONFIG_PATH="$PKG_CONFIG_LIBDIR${PKG_CONFIG_PATH:+:}$PKG_CONFIG_PATH" - fi -fi -# PKG_CONFIG_PATH is ready here - -# - -if test $# -eq 0; then - usage 1 1>&2 -fi - - -# Second stage to do the main functionality - -module_list="" -want_var="" -want_attr="" -want_cflags="" -want_libs="" -want_exists="" - -cflags="" -libs="" -mtcflags="" -mtlibs="" - -delimiter=" " -output="" - -mt="no" - -VAR_list=VAR_pc_sysrootdir -if [ -z "$PKG_CONFIG_SYSROOT_DIR" ]; then - VAR_pc_sysrootdir="/" -else - VAR_pc_sysrootdir="$PKG_CONFIG_SYSROOT_DIR" -fi - -while test $# -gt 0; do - case $1 in - #### pkg-config incompatible options: begin - --prefix) - # In future, use --variable=prefix instead. - want_var=prefix - ;; - --exec-prefix) - # In future, use --variable=exec_prefix instead. - want_var=exec_prefix - ;; - --version) - # In future, use --modversion instead. - want_attr=Version - delimiter=" -" - ;; - --api-version) - # In future, use --variable=api_version instead. - want_var=api_version - ;; - --host) - # In future, use --variable=host instead. - want_var=host - ;; - --mt) - # In future, use --variable=mtcflags or --variable=mtlibs. - mt=yes - ;; - #### pkg-config incompatible options: end - --modversion) - want_attr=Version - delimiter=" -" - ;; - --exists) - want_exists=yes - ;; - --cflags) - want_cflags=yes - ;; - --libs) - want_libs=yes - ;; - --variable=*) - want_var=${1#*=} - ;; - --help) - usage 0 - ;; - --*) - usage 1 1>&2 - ;; - *) - # Modules - module_list="$module_list${module_list:+ }$1" - ;; - esac - - shift -done - - -if [ -z "$module_list" ]; then - module_list=$default_module -elif expr "$module_list" : "=\|!=\|<\|>\|<=\|>=" >/dev/null; then - module_list="$default_module $module_list" -fi - -all_required_config_files $module_list - -for p in $PKG_LIST; do - read_config_file $p $PKG_CONFIG_PATH - # For want_var or want_attr, get it from the first package - if [ -n "$want_var" ]; then - output="$(get_var $want_var)" - break - elif [ -n "$want_attr" ]; then - output="$(get_attr $want_attr)" - break - else - cflags="$cflags${cflags:+ }$(get_attr Cflags)" - libs="$libs${libs:+ }$(get_attr Libs)" - - if [ $p = "gpg-error" ]; then - mtcflags="$(get_var mtcflags)" - mtlibs="$(get_var mtlibs)" - fi - fi - cleanup_vars_attrs -done - -if [ -z "$want_var" -a -z "$want_attr" ]; then - if [ -n "$want_cflags" ]; then - output="$output${output:+ }$(sysroot -I $(list_only_once $cflags))" - # Backward compatibility to old gpg-error-config - if [ $mt = yes -a -n "$mtcflags" ]; then - output="$output${output:+ }$mtcflags" - fi - fi - if [ -n "$want_libs" ]; then - output="$output${output:+ }$(sysroot -L $(list_only_once_for_libs $libs))" - # Backward compatibility to old gpg-error-config - if [ $mt = yes -a -n "$mtlibs" ]; then - output="$output${output:+ }$mtlibs" - fi - fi -fi - -if [ -z "$want_exists" ]; then - echo "$output" -fi - -exit 0 diff --git a/src/gpgrt-config.in b/src/gpgrt-config.in new file mode 100644 index 0000000..622b056 --- /dev/null +++ b/src/gpgrt-config.in @@ -0,0 +1,626 @@ +#!@INSTALLSHELLPATH@ +# Copyright (C) 2018 g10 Code GmbH +# +# This file is free software; as a special exception the author gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# This file is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# SPDX-License-Identifier: FSFULLR + +#### start of functions for this script + +# +# 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_" +# +get_var () { + ___name=$1 + + eval echo \$VAR_$___name +} + +# +# get_attr: Get the attribute value of KEY +# +# Attributes are recorded in the shell variables named "ATTR_" +# +get_attr () { + ___name=$1 + + eval echo \$ATTR_$___name +} + +# Remove ${varname} part in the beginning of a string. +remove_var_expr () { + ___varname=$1 + shift + + expr "$*" : "\${$___varname}\\(.*\\)" +} + +# Given a string, substitute variables. +substitute_vars () { + __string="$1" + __varname="" + __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 from stdin +# +# 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_from_stdin () { + _filename=$1 + _line="" + _varname="" + _value="" + _key="" + _reading_attrs="" + + while read _line; do + if [ -z "$_line" ]; then + _reading_attrs=yes + continue + elif [ -z "$_reading_attrs" ]; then + case "$_line" in + *=*) + _varname="${_line%%=*}" + _value="${_line#*=}" + VAR_list="$VAR_list${VAR_list:+ }VAR_$_varname" + read VAR_$_varname <&2 + exit 1 + ;; + esac + fi + done +} + + +find_file_in_path () { + _f=$1 + _p=$2 + _saved_IFS="$IFS" + _arg="" + IFS=":" # On Windows it should be ";"??? + + for _arg in $_p; do + if [ -r $_arg/$_f ]; then + RESULT="$_arg/$_f" + IFS="$_saved_IFS" + return 0 + fi + done + IFS="$_saved_IFS" + RESULT="" + return 1 +} + +read_config_file () { + if ! find_file_in_path $1.pc $2; then + if [ -z "$want_exists" ]; then + echo "Can't find $1.pc" 1>&2 + fi + exit 1 + fi + read_config_from_stdin $RESULT < $RESULT +} + +cleanup_vars_attrs () { + eval unset $VAR_list VAR_list + eval unset $ATTR_list ATTR_list +} + +not_listed_yet () { + ___m=$1 + ___arg="" + shift + + for ___arg; do + if [ $___m = $___arg ]; then + return 1 + fi + done + + return 0 +} + +list_only_once () { + __result="" + __arg="" + + for __arg; do + if not_listed_yet $__arg $__result; then + __result="$__result${__result:+ }$__arg" + fi + done + + echo $__result +} + +list_only_once_for_libs () { + __result="" + __rev_list="" + __arg="" + + # Scan the list and eliminate duplicates for non-"-lxxx" + # the resulted list is in reverse order + for __arg; do + case "$__arg" in + -l*) + # As-is + __rev_list="$__arg${__rev_list:+ }$__rev_list" + ;; + *) + if not_listed_yet $__arg $__rev_list; then + __rev_list="$__arg${__rev_list:+ }$__rev_list" + fi + ;; + esac + done + + # Scan again + for __arg in $__rev_list; do + case "$__arg" in + -l*) + if not_listed_yet $__arg $__result; then + __result="$__arg${__result:+ }$__result" + fi + ;; + *) + # As-is + __result="$__arg${__result:+ }$__result" + ;; + esac + done + + echo $__result +} + +arg1_is_same () { + [ "$1" = "=" -o "$1" = ">=" -o "$1" = "<=" ] +} + +arg1_is_less () { + [ "$1" = "!=" -o "$1" = "<" -o "$1" = "<=" ] +} + +arg1_is_great () { + [ "$1" = "!=" -o "$1" = ">" -o "$1" = ">=" ] +} + +# +# Evaluate comparison between versions in RPM way +# +eval_compare_version () { + ___str1="$1" + ___cmp="$2" + ___str2="$3" + ___char1="" + ___char2="" + ___chunk1="" + ___chunk2="" + + while [ -n "$___str1" -a -n "$___str2" ]; do + # Trim anything that's not alnum or tilde from the front + ___str1="$(expr "$___str1" : '[^0-9A-Za-z~]*\(.*\)')" + ___str2="$(expr "$___str2" : '[^0-9A-Za-z~]*\(.*\)')" + + # Get the first character + ___char1=${___str1%${___str1#?}} + ___char2=${___str2%${___str2#?}} + + if [ "$___char1" = ~ -o "$___char2" = ~ ]; then + if [ "$___char1" != ~ ]; then + arg1_is_great $___cmp + return + fi + if [ "$___char2" != ~ ]; then + arg1_is_less $___cmp + return + fi + ___str1=${___str1#~} + ___str2=${___str2#~} + continue + fi + + if [ -z "$___char1" -o -z "$___char2" ]; then + break + fi + + case "$___char1$___char2" in + [0-9][A-Za-z]) + arg1_is_great $___cmp + return + ;; + [A-Za-z][0-9]) + arg1_is_less $___cmp + return + ;; + [0-9][0-9]) + ___chunk1="$(expr "$___str1" : '\([0-9]*\)')" + ___chunk2="$(expr "$___str2" : '\([0-9]*\)')" + ;; + [A-Za-z][A-Za-z]) + ___chunk1="$(expr "$___str1" : '\([A-Za-z]*\)')" + ___chunk2="$(expr "$___str2" : '\([A-Za-z]*\)')" + ;; + esac + + # Compare chunks numerically if digits, or lexicographically + if expr "$___chunk1" "!=" "$___chunk2" >/dev/null; then + if expr "$___chunk1" ">" "$___chunk2" >/dev/null; then + arg1_is_great $___cmp + return + else + arg1_is_less $___cmp + return + fi + fi + + # Remove the chunk + ___str1="${___str1#$___chunk1}" + ___str2="${___str2#$___chunk2}" + done + + # Either STR1, STR2 or both is empty here + if [ -n "$___str1" ]; then + case "$___str1" in + ~*) arg1_is_less $___cmp ;; + *) arg1_is_great $___cmp ;; + esac + elif [ -n "$___str2" ]; then + case "$___str2" in + ~*) arg1_is_great $___cmp ;; + *) arg1_is_less $___cmp ;; + esac + else + arg1_is_same $___cmp + fi +} + +# +# Recursively solve package dependencies +# +# Result is in the PKG_LIST variable +# +all_required_config_files () { + all_list="" + new_list="" + p="" + pkg="" + cmp="" + + list=$* + while [ -n "$list" ]; do + for p in $list; do + if [ -z "$pkg" ]; then + pkg=$p + elif [ -z "$cmp" ]; then + case "$p" in + "="|"!="|"<"|">"|"<="|">=") cmp=$p ;; + *) + read_config_file $pkg $PKG_CONFIG_PATH + all_list="$all_list${all_list:+ }$pkg" + new_list="$new_list${new_list:+ }$(get_attr Requires)" + cleanup_vars_attrs + pkg=$p + ;; + esac + else + read_config_file $pkg $PKG_CONFIG_PATH + if ! eval_compare_version "$(get_attr Version)" $cmp $p; then + echo "Version mismatch for $pkg $cmp $p: $(get_attr Version)" 1>&2 + exit 1 + fi + all_list="$all_list${all_list:+ }$pkg" + new_list="$new_list${new_list:+ }$(get_attr Requires)" + cleanup_vars_attrs + pkg="" + cmp="" + fi + done + if [ -n "$cmp" ]; then + echo "No version after comparison operator ($cmp): $pkg" 1>&2 + exit 1 + elif [ -n "$pkg" ]; then + read_config_file $pkg $PKG_CONFIG_PATH + all_list="$all_list${all_list:+ }$pkg" + new_list="$new_list${new_list:+ }$(get_attr Requires)" + cleanup_vars_attrs + fi + + list="$new_list" + new_list="" + done + + PKG_LIST=$(list_only_once $all_list) +} + +# +# Modify -I or -L by PKG_CONFIG_SYSROOT_DIR variable +# +sysroot () { + _opt="$1" + _result="" + shift + + while [ $# -gt 0 ]; do + if [ $1 = $_opt ]; then + _result="$_result${_result:+ }$_opt" + shift + _result="$_result $PKG_CONFIG_SYSROOT_DIR$1" + elif expr "x$1" : "^x$_opt" >/dev/null; then + _result="$_result${_result:+ }$_opt$PKG_CONFIG_SYSROOT_DIR$(expr "x$1" : "^x$_opt\(.*\)")" + else + _result="$_result${_result:+ }$1" + fi + shift + done + echo "$_result" +} + +# Show usage +usage () { + cat <&2 + exit 1 + fi +else + if [ -n "$libdir" ]; then + # --libdir option is available, it overrides existing PKG_CONFIG_LIBDIR + PKG_CONFIG_LIBDIR=$libdir/pkgconfig + fi + if [ -z "$PKG_CONFIG_LIBDIR" ]; then + if [ -z "$PKG_CONFIG_PATH" ]; then + echo "Please use --libdir=LIBDIR option or set PKG_CONFIG_LIBDIR" 1>&2 + echo "Or set PKG_CONFIG_PATH" 1>&2 + exit 1 + fi + else + # PKG_CONFIG_LIBDIR is available here + # Modify PKG_CONFIG_PATH, prepending PKG_CONFIG_LIBDIR + PKG_CONFIG_PATH="$PKG_CONFIG_LIBDIR${PKG_CONFIG_PATH:+:}$PKG_CONFIG_PATH" + fi +fi +# PKG_CONFIG_PATH is ready here + +# + +if test $# -eq 0; then + usage 1 1>&2 +fi + + +# Second stage to do the main functionality + +module_list="" +want_var="" +want_attr="" +want_cflags="" +want_libs="" +want_exists="" + +cflags="" +libs="" +mtcflags="" +mtlibs="" + +delimiter=" " +output="" + +mt="no" + +VAR_list=VAR_pc_sysrootdir +if [ -z "$PKG_CONFIG_SYSROOT_DIR" ]; then + VAR_pc_sysrootdir="/" +else + VAR_pc_sysrootdir="$PKG_CONFIG_SYSROOT_DIR" +fi + +while test $# -gt 0; do + case $1 in + #### pkg-config incompatible options: begin + --prefix) + # In future, use --variable=prefix instead. + want_var=prefix + ;; + --exec-prefix) + # In future, use --variable=exec_prefix instead. + want_var=exec_prefix + ;; + --version) + # In future, use --modversion instead. + want_attr=Version + delimiter=" +" + ;; + --api-version) + # In future, use --variable=api_version instead. + want_var=api_version + ;; + --host) + # In future, use --variable=host instead. + want_var=host + ;; + --mt) + # In future, use --variable=mtcflags or --variable=mtlibs. + mt=yes + ;; + #### pkg-config incompatible options: end + --modversion) + want_attr=Version + delimiter=" +" + ;; + --exists) + want_exists=yes + ;; + --cflags) + want_cflags=yes + ;; + --libs) + want_libs=yes + ;; + --variable=*) + want_var=${1#*=} + ;; + --help) + usage 0 + ;; + --*) + usage 1 1>&2 + ;; + *) + # Modules + module_list="$module_list${module_list:+ }$1" + ;; + esac + + shift +done + + +if [ -z "$module_list" ]; then + module_list=$default_module +elif expr "$module_list" : "=\|!=\|<\|>\|<=\|>=" >/dev/null; then + module_list="$default_module $module_list" +fi + +all_required_config_files $module_list + +for p in $PKG_LIST; do + read_config_file $p $PKG_CONFIG_PATH + # For want_var or want_attr, get it from the first package + if [ -n "$want_var" ]; then + output="$(get_var $want_var)" + break + elif [ -n "$want_attr" ]; then + output="$(get_attr $want_attr)" + break + else + cflags="$cflags${cflags:+ }$(get_attr Cflags)" + libs="$libs${libs:+ }$(get_attr Libs)" + + if [ $p = "gpg-error" ]; then + mtcflags="$(get_var mtcflags)" + mtlibs="$(get_var mtlibs)" + fi + fi + cleanup_vars_attrs +done + +if [ -z "$want_var" -a -z "$want_attr" ]; then + if [ -n "$want_cflags" ]; then + output="$output${output:+ }$(sysroot -I $(list_only_once $cflags))" + # Backward compatibility to old gpg-error-config + if [ $mt = yes -a -n "$mtcflags" ]; then + output="$output${output:+ }$mtcflags" + fi + fi + if [ -n "$want_libs" ]; then + output="$output${output:+ }$(sysroot -L $(list_only_once_for_libs $libs))" + # Backward compatibility to old gpg-error-config + if [ $mt = yes -a -n "$mtlibs" ]; then + output="$output${output:+ }$mtlibs" + fi + fi +fi + +if [ -z "$want_exists" ]; then + echo "$output" +fi + +exit 0 -- cgit v1.2.3