summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcheck/check-print-options15
-rw-r--r--main.c31
2 files changed, 46 insertions, 0 deletions
diff --git a/check/check-print-options b/check/check-print-options
index f9ce636..17aec1d 100755
--- a/check/check-print-options
+++ b/check/check-print-options
@@ -37,3 +37,18 @@ run_test --print-requires-private requires-test
RESULT="sub1 Subdirectory package 1 - Test package 1 for subdirectory
sub2 Subdirectory package 2 - Test package 2 for subdirectory"
PKG_CONFIG_LIBDIR="$srcdir/sub" run_test --list-all
+
+# Check handling when multiple incompatible options are set
+RESULT="Ignoring incompatible output option \"--modversion\"
+$PACKAGE_VERSION"
+run_test --version --modversion simple
+
+RESULT="Ignoring incompatible output option \"--version\"
+1.0.0"
+run_test --modversion --version simple
+
+# --print-requires/--print-requires-private allowed together
+RESULT="public-dep >= 1
+private-dep >= 1"
+run_test --print-requires --print-requires-private requires-test
+run_test --print-requires-private --print-requires requires-test
diff --git a/main.c b/main.c
index deb32f0..3c13f8e 100644
--- a/main.c
+++ b/main.c
@@ -59,6 +59,7 @@ static gboolean want_variable_list = FALSE;
static gboolean want_debug_spew = FALSE;
static gboolean want_verbose_errors = FALSE;
static gboolean want_stdout_errors = FALSE;
+static gboolean output_opt_set = FALSE;
void
debug_spew (const char *format, ...)
@@ -155,6 +156,35 @@ static gboolean
output_opt_cb (const char *opt, const char *arg, gpointer data,
GError **error)
{
+ /* only allow one output mode, with a few exceptions */
+ if (output_opt_set)
+ {
+ gboolean bad_opt = TRUE;
+
+ /* multiple flag options (--cflags --libs-only-l) allowed */
+ if (pkg_flags != 0 &&
+ (strcmp (opt, "--libs") == 0 ||
+ strcmp (opt, "--libs-only-l") == 0 ||
+ strcmp (opt, "--libs-only-other") == 0 ||
+ strcmp (opt, "--libs-only-L") == 0 ||
+ strcmp (opt, "--cflags") == 0 ||
+ strcmp (opt, "--cflags-only-I") == 0 ||
+ strcmp (opt, "--cflags-only-other") == 0))
+ bad_opt = FALSE;
+
+ /* --print-requires and --print-requires-private allowed */
+ if ((want_requires && strcmp (opt, "--print-requires-private") == 0) ||
+ (want_requires_private && strcmp (opt, "--print-requires") == 0))
+ bad_opt = FALSE;
+
+ if (bad_opt)
+ {
+ fprintf (stderr, "Ignoring incompatible output option \"%s\"\n",
+ opt);
+ return TRUE;
+ }
+ }
+
if (strcmp (opt, "--version") == 0)
want_my_version = TRUE;
else if (strcmp (opt, "--modversion") == 0)
@@ -192,6 +222,7 @@ output_opt_cb (const char *opt, const char *arg, gpointer data,
else
return FALSE;
+ output_opt_set = TRUE;
return TRUE;
}