# Licence: wxWindows licence
############################################################################
+# We expect a posix shell, so if this is a Bourne shell,
+# and apparently a few still exist, try for bash or ksh.
+
+if [ ~ = '~' ]
+then
+ if (bash -c echo) >/dev/null 2>&1
+ then
+ exec bash "$0" "$@"
+ fi
+ if (ksh -c echo) >/dev/null 2>&1
+ then
+ exec ksh "$0" "$@"
+ fi
+ echo "$0: this script requires bash or ksh"
+ exit 1
+fi
+
-# Start with some basic stuff, like the ability to die gracefully,
+# On with some basic stuff, like the ability to die gracefully,
# and to tell people what we are about.
# ------------------------------------------------------------------
# usage _exitcode
# Outputs a usage message to stderr and exits with _exitcode.
-# Try to keep this to a single page. We can add alternate help
-# targets if people want more detail from interactive help.
+# Try to keep this to a single page (ie. < 25 lines). We can add
+# alternate or interactive help targets if people want more detail.
+#
+# Exit codes are now subject to a more strict interpretation.
+# wx-config should return 0 upon successful operation, 1 if the
+# reqested operation could not be completed successfully, and 2
+# if the requested operation is not supported by this version of
+# wx-config.
usage()
{
cat 1>&2 <<EOF
wx-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--release] [--version-full]
[--list] [--host=HOST] [--toolkit=TOOLKIT] [--universal[=yes|no]]
[--unicode[=yes|no]] [--debug[=yes|no]] [--static[=yes|no]]
- [--version[=VERSION]] [--basename] [--cppflags] [--cflags]
- [--cxxflags] [--rezflags] [--libs] [--cc] [--cxx] [--ld] [LIB ...]
+ [--version[=VERSION]] [--basename] [--cc] [--cppflags] [--cflags]
+ [--cxxflags] [--rezflags] [--libs] [--cxx] [--ld] [--linkdeps]
+ [--utility=UTIL] [LIB ...]
wx-config returns information about the wxWidgets libraries available
on your system. It may be used to retrieve the information you require
to build applications using these libraries.
- If alternative builds of wxWidgets exist on the system, you can use the
- options: --prefix, --host, --toolkit, --unicode, --debug, --universal and
- --version, to select from them. Use the --list option to show all builds
- which match any specified criteria. The unicode, universal, and debug
- options take an optional yes or no argument, while host and version accept
- posix extended regex. eg. wx-config --unicode=n --debug --host=?.* --list
- will show all ansi-debug libraries installed, including cross libraries.
+ If alternative builds of wxWidgets exist on the system, you can use the
+ options: --prefix, --host, --toolkit, --unicode, --debug, --static,
+ --version and --universal, to select from them. Use the --list option to
+ show alternatives available which match specified criteria. The unicode,
+ debug, and universal options take an optional yes or no argument, while
+ host and version accept posix extended regex. The --utility option will
+ return the correct version of UTIL to use with the selected library build.
+ --linkdeps returns only static libraries for your makefile link rule deps.
Optional LIB arguments (comma or space separated) may be used to specify
the wxWidgets libraries that you wish to use. The magic "std" label may
wxconfig_schema="host toolkit widgetset chartype debugtype flavour version linkage"
# Options that are expected to generate some output.
-wxconfig_output_options="prefix exec_prefix \
- list \
- release version version_full \
- basename \
- cppflags cflags cxxflags \
- rezflags \
- libs \
- cc cxx ld \
+wxconfig_output_options="prefix exec_prefix
+ list
+ release version version_full
+ basename
+ cppflags cflags cxxflags
+ rezflags
+ libs
+ linkdeps
+ cc cxx ld
gl_libs"
# Options that permit the user to supply hints that may affect the output.
# These options all accept arbitrary values, to interpret as they please.
-wxconfig_input_options="prefix exec_prefix $wxconfig_schema"
+wxconfig_input_options="prefix exec_prefix utility $wxconfig_schema"
# Input options that accept only a yes or no argument.
wxconfig_yesno_options="universal unicode debug static"
# Boolean options that do something or not.
-wxconfig_flag_options="$wxconfig_yesno_options inplace"
+wxconfig_flag_options="$wxconfig_yesno_options no_rpath inplace"
_remf_value="$1"
_remf_list=''
shift
- for _remf_item; do
- [ "x$_remf_item" = "x$_remf_value" ] || \
- _remf_list="${_remf_list:+$_remf_list }$_remf_item"
- done
- echo "$_remf_list"
+ if [ -n "$_remf_value" ]; then
+ for _remf_item; do
+ [ "x$_remf_item" = "x$_remf_value" ] ||
+ _remf_list="${_remf_list:+$_remf_list }$_remf_item"
+ done
+ echo "$_remf_list"
+ else
+ echo $*
+ fi
}
# validate_arg _domain _set _name _value
# in any case.
check_yesno_option()
{
- eval "case \${yesno_option_$1-\${flag_option_$1-unset}} in \
- unset) ;; \
- y*|Y*) input_option_$2=\"$3\" ;; \
- n*|N*) input_option_$2=\"$4\" ;; \
- *) \
- decho; \
- decho \" *** Error: Invalid request '--$1=\$yesno_option_$1'\"; \
- decho \" Valid arguments for --$1 are: [ yes, no ]\"; \
- decho; \
- exit 1 ;; \
+ eval "case \${yesno_option_$1-\${flag_option_$1-unset}} in
+ unset) ;;
+ y*|Y*) input_option_$2=\"$3\" ;;
+ n*|N*) input_option_$2=\"$4\" ;;
+ *)
+ decho
+ decho \" *** Error: Invalid request '--$1=\$yesno_option_$1'\"
+ decho \" Valid arguments for --$1 are: [ yes, no ]\"
+ decho
+ exit 1
+ ;;
esac"
}
--*=*)
_name=$(option_name $arg)
_value=$(option_value $arg)
- if validate_arg wxconfig input "$_name" "$_value" \
- || validate_arg wxconfig yesno "$_name" "$_value"; \
+ if validate_arg wxconfig input "$_name" "$_value" ||
+ validate_arg wxconfig yesno "$_name" "$_value"
then
continue
fi
--*)
_name=$(option_name $arg)
- if validate_arg wxconfig flag "$_name" yes \
- || validate_arg wxconfig output "$_name" yes;
+ if validate_arg wxconfig flag "$_name" yes ||
+ validate_arg wxconfig output "$_name" yes
then
continue
fi
esac
decho " *** Error: Unrecognised option: '$arg'"
decho "Use wx-config --help for information on command line options."
- exit 1
+ exit 2
done
# validate_arg only checks and decomposes form. Sanity check the yes/no
eval echo "\${$1_host}\${$1_toolkit}\${$1_widgetset}-\${$1_chartype}-\${$1_debugtype}\${$1_linkage}-\${$1_version}\${$1_flavour}"
}
+# Returns true if this script is for a cross compiled config.
+is_cross() { [ "x@cross_compiling@" = "xyes" ]; }
+
# Determine the base directories we require.
prefix=${input_option_prefix-${this_prefix:-@prefix@}}
installed_configs=$( cd "$wxconfdir" 2> /dev/null && ls | grep -v "^inplace-" )
-target="@host_alias@"
+is_cross && target="@host_alias@"
# Define a pseudo-hash to contain the specification of this wx-config
# instance and its associated library.
this_debugtype="@WX_DEBUGTYPE@"
this_flavour="@WX_FLAVOUR@"
this_version="@WX_RELEASE@"
-this_linkage=$( [ @SHARED@ -eq 1 ] || echo '-static' )
+this_linkage=$( [ "x@SHARED@" = "x1" ] || echo '-static' )
this_config=$(get_mask this)
[ "x$WXDEBUG" != "xfindprogress" ] || printf "." 1>&2
- [ $_still_eligible -gt 1 ] && [ $# -gt 1 ] && \
- do_find_best_delegate $(remove_field $i $*)
- );
+ [ $_still_eligible -gt 1 ] && [ $# -gt 1 ] &&
+ do_find_best_delegate $(remove_field $i $*)
+ )
then
return
find_best_delegate()
{
for _fbdi in $wxconfig_schema; do
- is_set input_option_$_fbdi || \
+ is_set input_option_$_fbdi ||
_unbound_options="${_unbound_options:+$_unbound_options }$_fbdi"
done
do_find_best_delegate $_unbound_options
}
+# Legacy wx-config helpers.
+# -------------------------
+
+# get_legacy_mask
+# Returns a mask in the format used by wx2.4.
+get_legacy_mask()
+{
+ [ $# -gt 0 ] || set m
+ eval [ "x\${$1_chartype}" != "xunicode" ] || _unicode_flag=u
+ eval [ "x\${$1_debugtype}" != "xdebug" ] || _debug_flag=d
+ eval echo "wx\${$1_toolkit}${_unicode_flag}${_debug_flag}-\${$1_version}\${$1_host}-config"
+}
+
+# find_legacy_configs
+# Returns a list of configs installed by wx2.4 releases.
+find_legacy_configs()
+{
+ (
+ cd "$prefix/bin" &&
+ {
+ ls wx*-2.4-config | grep -v ^wxbase
+ ls wx*-2.4-config | grep ^wxbase
+ }
+ ) 2> /dev/null
+}
+
+# find_best_legacy_config
+# Returns the best legacy config for a given specification.
+# This assumes no matching new style config has been found.
+find_best_legacy_config()
+{
+ _legacy_configs=$(find_legacy_configs)
+ if [ -n "$_legacy_configs" ]; then
+ _legacy_mask=$(get_legacy_mask)
+ for d in $_legacy_configs; do
+ if echo $d | grep -E $_legacy_mask > /dev/null 2>&1 ; then
+ echo "$d"
+ return
+ fi
+ done
+ fi
+ false
+}
+
+
+
# The only action we can perform authoritatively prior to delegation
# is to list all the possible delegates.
# --------------------------------------------------------------
_best_delegate=$(find_best_delegate)
if [ "x$WXDEBUG" = "xverbose" ]; then
- echo " all = $_remains_in_prefix"
- echo " matching = $_delegates"
- echo " best = $_best_delegate"
- echo " this = $this_config"
+ decho
+ decho " all = $_remains_in_prefix"
+ decho " matching = $_delegates"
+ decho " best = $_best_delegate"
+ decho " this = $this_config"
fi
for d in $_delegates; do
echo " Specification best match: $_best_delegate"
- elif [ -n "_delegates" ]; then
+ elif [ -z "$_delegates" ]; then
+
+ _last_chance=$(find_best_legacy_config)
+ if [ -n "$_last_chance" ]; then
- cat <<-EOF
+ echo " Specification matches legacy config: $_last_chance"
+
+ else
+
+ cat <<-EOF
No config found to match: $config_spec
in $wxconfdir
you may call its wx-config directly by specifying its full path.
EOF
- exit 1
+ fi
+
+ else
+ echo " Specification was ambiguous. Use additional feature options"
+ echo " to choose between alternate matches."
fi
- _delegates=$(remove_field $_best_delegate $_delegates)
+ _delegates=$(remove_field "$_best_delegate" $_delegates)
if [ -n "$_delegates" ]; then
echo
done
fi
+ _legacy_configs=$(find_legacy_configs)
+ if [ -n "$_legacy_configs" ]; then
+ echo
+ echo " Legacy configs available in $prefix:"
+ for d in $_legacy_configs; do
+ echo " ${d%-config}"
+ done
+ fi
+
echo
exit
fi
fi
if [ $_numdelegates -eq 0 ]; then
- cat 1>&2 <<-EOF
- No config found to match: $config_spec
- in $wxconfdir
- Please install the desired library build, or use --list
- without any feature specifiers to see all available configs.
+ _last_chance=$(find_best_legacy_config)
+ if [ -n "$_last_chance" ]; then
+
+ for arg; do
+ case "$arg" in
+ --prefix*|--exec-prefix*| \
+ --version|--release|--basename| \
+ --static|--libs|--gl_libs| \
+ --cppflags|--cflags|--cxxflags| \
+ --cc|--cxx|--ld| \
+ --rezflags|--inplace)
+ _legacy_args="$_legacy_args $arg"
+ ;;
+
+ --static|--static=y*|--static=Y*)
+ _legacy_args="$_legacy_args --static"
+ ;;
+ esac
+ done
+
+ if [ -n "$WXDEBUG" ]; then
+ decho " found a suitable legacy delegate: $_last_chance"
+ decho "--> $prefix/bin/$_last_chance $_legacy_args"
+ fi
+
+ export WXCONFIG_DELEGATED=yes
+ $prefix/bin/$_last_chance $_legacy_args
+ exit
+
+ else
+
+ cat 1>&2 <<-EOF
+
+ Warning: No config found to match: $config_spec
+ in $wxconfdir
+ If you require this configuration, please install the desired
+ library build. If this is part of an automated configuration
+ test and no other errors occur, you may safely ignore it.
+ You may use wx-config --list to see all configs available in
+ the default prefix.
EOF
- # PIPEDREAM: This will probably give Vadim an aneurysm if I
- # mention it out of context, but from here we are actually
- # just a teensy step from simply building the missing config
- # for the user on the fly if this is an in tree wx-config.
+ # PIPEDREAM: from here we are actually just a teensy step
+ # from simply building the missing config for the user
+ # on the fly if this is an in tree wx-config.
- exit 1
+ exit 1
+ fi
fi
if [ $_numdelegates -gt 1 ]; then
fi
decho
- decho " Specification was ambiguous."
+ decho " *** Error: Specification is ambiguous"
+ decho " as $config_spec"
decho " Use additional feature options to choose between:"
for i in $(find_eligible_delegates "$configmask"); do
decho " $i"
-
-
# If we are still here, then from now on we are responsible for
# all the user's needs. Time to rustle up some output for them.
# --------------------------------------------------------------
includedir="@includedir@"
libdir="@libdir@"
+bindir="@bindir@"
# Trivial queries we can answer now.
[ -z "$output_option_prefix" ] || echo $prefix
[ -z "$output_option_version" ] || echo "@WX_VERSION@"
[ -z "$output_option_version_full" ] || echo "@WX_SUBVERSION@"
[ -z "$output_option_basename" ] || echo "@WX_LIBRARY_BASENAME_GUI@"
-[ -z "$output_option_rezflags" ] || echo $(eval echo @MACRESWXCONFIG@)
+[ -z "$output_option_rezflags" ] || echo $(eval echo "@MACRESWXCONFIG@")
[ -z "$output_option_cc" ] || echo "@CC@"
[ -z "$output_option_cxx" ] || echo "@CXX@"
[ -z "$output_option_ld" ] || echo "@EXE_LINKER@"
# The rest are going to need a little more work.
# --------------------------------------------------------------
-is_cross() { [ "x@cross_compiling@" = "xyes" ]; }
-is_monolithic() { [ @MONOLITHIC@ -eq 1 ]; }
+is_monolithic() { [ "x@MONOLITHIC@" = "x1" ]; }
+is_static() { [ -n "$this_linkage" ]; }
+is_installed() { [ -z "$this_prefix" ]; }
+
+
+# Is the user after a support utility?
+# If this is a cross build, we need to find and return a suitable
+# native utility for the job, so we search:
+#
+# 1. local build dir (for native uninstalled builds only).
+# 2. (optional) user supplied prefix.
+# 3. configured install prefix.
+# 4. environment $PATH.
+#
+# and if such a thing still cannot be found, exit signalling an error.
+if [ -n "$input_option_utility" ]; then
+
+ # This is dumb, in tree binaries should be in a standard location
+ # like the libs, but work with what we've got for now.
+ is_cross || _util="$exec_prefix/utils/$input_option_utility/$input_option_utility"
+
+ if ! is_installed && [ -x "$_util" ]; then
+ is_static || _preload="eval LD_LIBRARY_PATH=$exec_prefix/lib"
+ echo $_preload $_util
+ exit
+ fi
+
+ IFS=':'
+ _user_prefix=${input_option_exec_prefix:-$input_option_prefix}
+ for _util in "${input_option_utility}-@WX_RELEASE@@WX_FLAVOUR@" \
+ "${input_option_utility}-@WX_RELEASE@" \
+ "${input_option_utility}"
+ do
+ for p in ${_user_prefix:+$_user_prefix/bin} $bindir $PATH; do
+
+ [ -z "$WXDEBUG" ] || decho " checking for: '$p/$_util'"
+
+ if [ -x "$p/$_util" ]; then
+ echo "$p/$_util"
+ exit
+ fi
+
+ done
+ done
+ exit 1
+
+fi
+
+
+# Still here? Then get the options together for building an app.
+# ----------------------------------------------------------------
# Additional configuration for individual library components.
ldflags_gl="@LDFLAGS_GL@"
_all_libs=''
_wxlibs=''
- ! is_cross || _target="-${target}"
+ is_cross && _target="-${target}"
for lib; do
[ $lib = base ] || _libname="${_libname}_$lib"
_libname="${_libname}-@WX_RELEASE@$_target"
- if [ "x$this_linkage" = "x-static" ]; then
+ if is_static; then
_wxlibs="$_wxlibs ${libdir}/lib${_libname}.a"
for f in $(eval echo \"\$ldlibs_$lib\"); do
_all_libs="$(remove_field $f $_all_libs) $f"
echo $_all_ldflags $_wxlibs $_all_libs
}
+# this is the strict subset of the above function which returns only the
+# (static) libraries themselves: this is used for linkdeps output which should
+# output the list of libraries the main program should depend on
+#
+# of course, this duplication is bad but I'll leave to somebody else the care
+# of refactoring this as I don't see any way to do it
+link_deps_for()
+{
+ _wxlibs=''
+
+ is_cross && _target="-${target}"
+
+ for lib; do
+ if match_field "$lib" @CORE_BASE_LIBS@ ; then
+ _libname="@WX_LIBRARY_BASENAME_NOGUI@"
+ else
+ _libname="@WX_LIBRARY_BASENAME_GUI@"
+ fi
+ [ $lib = base ] || _libname="${_libname}_$lib"
+ _libname="${_libname}-@WX_RELEASE@$_target"
+
+ _wxlibs="$_wxlibs ${libdir}/lib${_libname}.a"
+ done
+
+ echo $_wxlibs
+}
# Sanity check the list of libs the user provided us, if any.
# --------------------------------------------------------------
wx_libs=$(remove_field $i $wx_libs)
done
- wx_libs="@WXCONFIG_LDFLAGS_GUI@ @WXCONFIG_RPATH@ $(lib_flags_for $wx_libs)"
+ wx_libs="@WXCONFIG_LDFLAGS_GUI@ $(lib_flags_for $wx_libs)"
# We still need the core lib deps for a static build though
- if [ "x$this_linkage" = "x-static" ]; then
- wx_libs="$wx_libs ${libdir}/libwx_@TOOLCHAIN_NAME@.a $ldlibs_core @LIBS@"
+ if is_static; then
+ link_deps="${libdir}/libwx_@TOOLCHAIN_NAME@.a"
+ wx_libs="$wx_libs $link_deps $ldlibs_core @LIBS@"
else
wx_libs="$wx_libs -lwx_@TOOLCHAIN_NAME@"
fi
else # MONOLITHIC = 0
- # Import everything by default, and base if it was omitted.
+ # Import everything by default, expand std if specified, or add base if omitted.
if [ -z "$wx_libs" ]; then
wx_libs="@CORE_GUI_LIBS@ @CORE_BASE_LIBS@"
- elif ! match_field base $wx_libs ; then
- wx_libs="$wx_libs base"
- fi
-
- # Expand the magic library 'std' to the default set.
- # Only add those not already specified to future-proof
- # against changes to std which would otherwise break
- # people's builds.
- if match_field std $wx_libs; then
+ elif match_field std $wx_libs; then
+ # Bubble any libs that were already specified to the end
+ # of the list and ensure static linking order is retained.
wx_libs=$(remove_field std $wx_libs)
for i in @CORE_GUI_LIBS@ @CORE_BASE_LIBS@; do
- match_field "$i" $wx_libs || wx_libs="$wx_libs $i"
+ wx_libs="$(remove_field $i $wx_libs) $i"
done
+ elif ! match_field base $wx_libs ; then
+ wx_libs="$wx_libs base"
fi
using_gui=no
match_field "$i" @CORE_BASE_LIBS@ || using_gui=yes
done
- wx_libs="$_guildflags @WXCONFIG_RPATH@ $(lib_flags_for $wx_libs)"
+ if is_static; then
+ link_deps=$(link_deps_for $wx_libs)
+ fi
+ wx_libs="$_guildflags $(lib_flags_for $wx_libs)"
fi
# Endgame. Nothing left to discover now.
# --------------------------------------------------------------
-[ -n "$this_linkage" ] || _static_cppflags="@TOOLCHAIN_DLL_DEFS@"
[ "$using_gui" = "yes" ] || _gui_cppflags="-DwxUSE_GUI=0"
-if [ -n "$this_prefix" ]; then
- _include_cppflags="-I${includedir} -I${prefix}/contrib/include"
-else
+if is_installed; then
_include_cppflags="-I${includedir}/wx-@WX_RELEASE@@WX_FLAVOUR@"
+else
+ _include_cppflags="-I${includedir} -I${prefix}/contrib/include"
fi
-_cppflags=$(echo "-I${libdir}/wx/include/@TOOLCHAIN_FULLNAME@" $_include_cppflags "@WXDEBUG_DEFINE@" "@TOOLCHAIN_DEFS@" $_static_cppflags $_gui_cppflags "@WXCONFIG_INCLUDE@" "@WX_LARGEFILE_FLAGS@" "@GCC_PRAGMA_FLAGS@")
+_cppflags=$(echo "-I${libdir}/wx/include/@TOOLCHAIN_FULLNAME@" $_include_cppflags "@WXDEBUG_DEFINE@" "@TOOLCHAIN_DEFS@" "@TOOLCHAIN_DLL_DEFS@" $_gui_cppflags "@WXCONFIG_INCLUDE@" "@WX_LARGEFILE_FLAGS@" "@GCC_PRAGMA_FLAGS@")
# now without further ado, we can answer these too.
[ -z "$output_option_cppflags" ] || echo $_cppflags
[ -z "$output_option_cflags" ] || echo $_cppflags "@CODE_GEN_FLAGS@"
[ -z "$output_option_cxxflags" ] || echo $_cppflags "@CODE_GEN_FLAGS@" "@CODE_GEN_FLAGS_CXX@"
[ -z "$output_option_gl_libs" ] || echo $(lib_flags_for gl)
+[ -z "$output_option_linkdeps" ] || echo $link_deps
if [ -n "$output_option_libs" ]; then
- is_cross && [ "x$libdir" = "x/usr/${target}/lib" ] \
- || [ "x$libdir" = "x/usr/lib" ] \
- || _ldflags="-L$libdir"
+ is_cross &&
+ [ "x$libdir" = "x/usr/${target}/lib" ] ||
+ [ "x$libdir" = "x/usr/lib" ] ||
+ _ldflags="-L$libdir"
+
+ is_installed || [ -n "$flag_option_no_rpath" ] || _rpath="@WXCONFIG_RPATH@"
- echo $_ldflags "@LDFLAGS@" $wx_libs "@DMALLOC_LIBS@"
+ echo $_ldflags "@LDFLAGS@" $_rpath $wx_libs "@DMALLOC_LIBS@"
fi
# And so that's it, we're done. Have a nice build.