diff options
-rw-r--r-- | check/Makefile.am | 1 | ||||
-rwxr-xr-x | check/check-cflags | 8 | ||||
-rwxr-xr-x | check/check-libs | 20 | ||||
-rwxr-xr-x | check/check-mixed-flags | 79 | ||||
-rw-r--r-- | main.c | 65 | ||||
-rw-r--r-- | pkg.c | 131 | ||||
-rw-r--r-- | pkg.h | 23 |
7 files changed, 184 insertions, 143 deletions
diff --git a/check/Makefile.am b/check/Makefile.am index 7330e52..8b8485f 100644 --- a/check/Makefile.am +++ b/check/Makefile.am @@ -4,6 +4,7 @@ TESTS_ENVIRONMENT = PKG_CONFIG='$(TESTS_PKG_CONFIG)' $(TESTS_SHELL) TESTS = \ check-cflags \ check-libs \ + check-mixed-flags \ check-non-l-flags \ check-define-variable \ check-libs-private \ diff --git a/check/check-cflags b/check/check-cflags index e5dde65..033cf25 100755 --- a/check/check-cflags +++ b/check/check-cflags @@ -18,3 +18,11 @@ run_test --cflags-only-I other RESULT="-DOTHER" run_test --cflags-only-other other + +# Try various mixed combinations +RESULT="-DOTHER -I/other/include" +run_test --cflags-only-I --cflags-only-other other +run_test --cflags-only-other --cflags-only-I other +run_test --cflags --cflags-only-I --cflags-only-other other +run_test --cflags --cflags-only-I other +run_test --cflags --cflags-only-other other diff --git a/check/check-libs b/check/check-libs index 2f837fa..c453b2a 100755 --- a/check/check-libs +++ b/check/check-libs @@ -25,3 +25,23 @@ run_test --libs-only-L other RESULT="-Wl,--as-needed" run_test --libs-only-other other + +# Try various mixed combinations +RESULT="-L/other/lib -lother" +run_test --libs-only-l --libs-only-L other +run_test --libs-only-L --libs-only-l other + +RESULT="-Wl,--as-needed -lother" +run_test --libs-only-l --libs-only-other other +run_test --libs-only-other --libs-only-l other + +RESULT="-Wl,--as-needed -L/other/lib" +run_test --libs-only-L --libs-only-other other +run_test --libs-only-other --libs-only-L other + +RESULT="-Wl,--as-needed -L/other/lib -lother" +run_test --libs-only-l --libs-only-L --libs-only-other other +run_test --libs --libs-only-l --libs-only-L --libs-only-other other +run_test --libs --libs-only-l other +run_test --libs --libs-only-L other +run_test --libs --libs-only-other other diff --git a/check/check-mixed-flags b/check/check-mixed-flags new file mode 100755 index 0000000..b96c3b7 --- /dev/null +++ b/check/check-mixed-flags @@ -0,0 +1,79 @@ +#! /bin/sh + +set -e + +. ${srcdir}/common + +RESULT="-DOTHER -I/other/include -Wl,--as-needed -L/other/lib -lother" +run_test --cflags --libs other +run_test --libs --cflags other +run_test --cflags-only-I --cflags-only-other --libs-only-l --libs-only-L \ + --libs-only-other other + +RESULT="-I/other/include -lother" +run_test --cflags-only-I --libs-only-l other +run_test --libs-only-l --cflags-only-I other + +RESULT="-DOTHER -lother" +run_test --cflags-only-other --libs-only-l other +run_test --libs-only-l --cflags-only-other other + +RESULT="-I/other/include -L/other/lib" +run_test --cflags-only-I --libs-only-L other +run_test --libs-only-L --cflags-only-I other + +RESULT="-DOTHER -L/other/lib" +run_test --cflags-only-other --libs-only-L other +run_test --libs-only-L --cflags-only-other other + +RESULT="-I/other/include -Wl,--as-needed" +run_test --cflags-only-I --libs-only-other other +run_test --libs-only-other --cflags-only-I other + +RESULT="-DOTHER -Wl,--as-needed" +run_test --cflags-only-other --libs-only-other other +run_test --libs-only-other --cflags-only-other other + +RESULT="-I/other/include -L/other/lib -lother" +run_test --cflags-only-I --libs-only-L --libs-only-l other +run_test --libs-only-l --libs-only-L --cflags-only-I other + +RESULT="-DOTHER -L/other/lib -lother" +run_test --cflags-only-other --libs-only-L --libs-only-l other +run_test --libs-only-l --libs-only-L --cflags-only-other other + +RESULT="-I/other/include -Wl,--as-needed -lother" +run_test --cflags-only-I --libs-only-other --libs-only-l other +run_test --libs-only-l --libs-only-other --cflags-only-I other + +RESULT="-DOTHER -Wl,--as-needed -lother" +run_test --cflags-only-other --libs-only-other --libs-only-l other +run_test --libs-only-l --libs-only-other --cflags-only-other other + +RESULT="-I/other/include -Wl,--as-needed -L/other/lib" +run_test --cflags-only-I --libs-only-other --libs-only-L other +run_test --libs-only-L --libs-only-other --cflags-only-I other + +RESULT="-DOTHER -Wl,--as-needed -L/other/lib" +run_test --cflags-only-other --libs-only-other --libs-only-L other +run_test --libs-only-L --libs-only-other --cflags-only-other other + +RESULT="-DOTHER -I/other/include -lother" +run_test --cflags --libs-only-l other +run_test --cflags-only-I --cflags-only-other --libs-only-l other + +RESULT="-DOTHER -I/other/include -L/other/lib" +run_test --cflags --libs-only-L other +run_test --cflags-only-I --cflags-only-other --libs-only-L other + +RESULT="-DOTHER -I/other/include -Wl,--as-needed" +run_test --cflags --libs-only-other other +run_test --cflags-only-I --cflags-only-other --libs-only-other other + +RESULT="-I/other/include -Wl,--as-needed -L/other/lib -lother" +run_test --cflags-only-I --libs other +run_test --cflags-only-I --libs-only-l --libs-only-L --libs-only-other other + +RESULT="-DOTHER -Wl,--as-needed -L/other/lib -lother" +run_test --cflags-only-other --libs other +run_test --cflags-only-other --libs-only-l --libs-only-L --libs-only-other other @@ -220,6 +220,7 @@ main (int argc, char **argv) static int want_variable_list = 0; GString *str; GSList *packages = NULL; + FlagType flags = 0; char *search_path; char *pcbuilddir; gboolean need_newline; @@ -374,6 +375,21 @@ main (int argc, char **argv) return 1; } + /* construct Libs/Cflags mask */ + if (want_cflags) + flags |= CFLAGS_ANY; + if (want_I_cflags) + flags |= CFLAGS_I; + if (want_other_cflags) + flags |= CFLAGS_OTHER; + if (want_libs) + flags |= LIBS_ANY; + if (want_l_libs) + flags |= LIBS_l; + if (want_L_libs) + flags |= LIBS_L; + if (want_other_libs) + flags |= LIBS_OTHER; /* Error printing is determined as follows: * - for --cflags, --libs, etc. it's on by default @@ -716,53 +732,10 @@ main (int argc, char **argv) need_newline = TRUE; } - if (want_I_cflags) - { - char *str = packages_get_I_cflags (packages); - printf ("%s ", str); - g_free (str); - need_newline = TRUE; - } - else if (want_other_cflags) - { - char *str = packages_get_other_cflags (packages); - printf ("%s ", str); - g_free (str); - need_newline = TRUE; - } - else if (want_cflags) - { - char *str = packages_get_all_cflags (packages); - printf ("%s ", str); - g_free (str); - need_newline = TRUE; - } - - if (want_l_libs) - { - char *str = packages_get_l_libs (packages); - printf ("%s ", str); - g_free (str); - need_newline = TRUE; - } - else if (want_L_libs) + if (flags != 0) { - char *str = packages_get_L_libs (packages); - printf ("%s ", str); - g_free (str); - need_newline = TRUE; - } - else if (want_other_libs) - { - char *str = packages_get_other_libs (packages); - printf ("%s ", str); - g_free (str); - need_newline = TRUE; - } - else if (want_libs) - { - char *str = packages_get_all_libs (packages); - printf ("%s ", str); + char *str = packages_get_flags (packages, flags); + printf ("%s", str); g_free (str); need_newline = TRUE; } @@ -1018,102 +1018,57 @@ get_multi_merged_from_back (GSList *pkgs, GetListFunc func, } char * -packages_get_l_libs (GSList *pkgs) +packages_get_flags (GSList *pkgs, FlagType flags) { - return get_multi_merged_from_back (pkgs, get_l_libs, FALSE, - !ignore_private_libs); -} - -char * -packages_get_L_libs (GSList *pkgs) -{ - return get_multi_merged (pkgs, get_L_libs, TRUE, !ignore_private_libs); -} - -char * -packages_get_other_libs (GSList *pkgs) -{ - return get_multi_merged (pkgs, get_other_libs, TRUE, !ignore_private_libs); -} - -char * -packages_get_all_libs (GSList *pkgs) -{ - char *l_libs; - char *L_libs; - char *other_libs; GString *str; - char *retval; - - str = g_string_new (""); + char *cur; - other_libs = packages_get_other_libs (pkgs); - L_libs = packages_get_L_libs (pkgs); - l_libs = packages_get_l_libs (pkgs); + str = g_string_new (NULL); - if (other_libs) - g_string_append (str, other_libs); - - if (L_libs) - g_string_append (str, L_libs); - - if (l_libs) - g_string_append (str, l_libs); - - g_free (l_libs); - g_free (L_libs); - g_free (other_libs); - - retval = str->str; - - g_string_free (str, FALSE); - - return retval; -} -char * -packages_get_I_cflags (GSList *pkgs) -{ - /* sort by path position so PKG_CONFIG_PATH affects -I flag order */ - return get_multi_merged (pkgs, get_I_cflags, TRUE, TRUE); -} - -char * -packages_get_other_cflags (GSList *pkgs) -{ - return get_multi_merged (pkgs, get_other_cflags, TRUE, TRUE); -} - -char * -packages_get_all_cflags (GSList *pkgs) -{ - char *I_cflags; - char *other_cflags; - GString *str; - char *retval; - - str = g_string_new (""); - - other_cflags = packages_get_other_cflags (pkgs); - I_cflags = packages_get_I_cflags (pkgs); - - if (other_cflags) - g_string_append (str, other_cflags); - - if (I_cflags) - g_string_append (str, I_cflags); - - g_free (I_cflags); - g_free (other_cflags); - - retval = str->str; - - g_string_free (str, FALSE); + /* sort flags from beginning and in forward direction except for -l */ + if (flags & CFLAGS_OTHER) + { + cur = get_multi_merged (pkgs, get_other_cflags, TRUE, TRUE); + debug_spew ("adding CFLAGS_OTHER string \"%s\"\n", cur); + g_string_append (str, cur); + g_free (cur); + } + if (flags & CFLAGS_I) + { + cur = get_multi_merged (pkgs, get_I_cflags, TRUE, TRUE); + debug_spew ("adding CFLAGS_I string \"%s\"\n", cur); + g_string_append (str, cur); + g_free (cur); + } + if (flags & LIBS_OTHER) + { + cur = get_multi_merged (pkgs, get_other_libs, TRUE, + !ignore_private_libs); + debug_spew ("adding LIBS_OTHER string \"%s\"\n", cur); + g_string_append (str, cur); + g_free (cur); + } + if (flags & LIBS_L) + { + cur = get_multi_merged (pkgs, get_L_libs, TRUE, !ignore_private_libs); + debug_spew ("adding LIBS_L string \"%s\"\n", cur); + g_string_append (str, cur); + g_free (cur); + } + if (flags & LIBS_l) + { + cur = get_multi_merged_from_back (pkgs, get_l_libs, FALSE, + !ignore_private_libs); + debug_spew ("adding LIBS_l string \"%s\"\n", cur); + g_string_append (str, cur); + g_free (cur); + } - return retval; + debug_spew ("returning flags string \"%s\"\n", str->str); + return g_string_free (str, FALSE); } - void define_global_variable (const char *varname, const char *varval) @@ -22,6 +22,18 @@ #include <glib.h> +typedef guint8 FlagType; /* bit mask for flag types */ + +#define LIBS_l (1 << 0) +#define LIBS_L (1 << 1) +#define LIBS_OTHER (1 << 2) +#define CFLAGS_I (1 << 3) +#define CFLAGS_OTHER (1 << 4) + +#define LIBS_ANY (LIBS_l | LIBS_L | LIBS_OTHER) +#define CFLAGS_ANY (CFLAGS_I | CFLAGS_OTHER) +#define FLAGS_ANY (LIBS_ANY | CFLAGS_ANY) + typedef enum { LESS_THAN, @@ -72,19 +84,13 @@ struct _Package Package *get_package (const char *name); Package *get_package_quiet (const char *name); -char * packages_get_l_libs (GSList *pkgs); -char * packages_get_L_libs (GSList *pkgs); -char * packages_get_other_libs (GSList *pkgs); -char * packages_get_all_libs (GSList *pkgs); -char * packages_get_I_cflags (GSList *pkgs); -char * packages_get_other_cflags (GSList *pkgs); -char * packages_get_all_cflags (GSList *pkgs); +char * packages_get_flags (GSList *pkgs, + FlagType flags); char * package_get_var (Package *pkg, const char *var); char * packages_get_var (GSList *pkgs, const char *var); - void add_search_dir (const char *path); void add_search_dirs (const char *path, const char *separator); void package_init (void); @@ -134,4 +140,3 @@ extern int msvc_syntax; #endif #endif - |