1*a3cefe7fSPierre Pronchery /*
2*a3cefe7fSPierre Pronchery * main.c
3*a3cefe7fSPierre Pronchery * main() routine, printer functions
4*a3cefe7fSPierre Pronchery *
5*a3cefe7fSPierre Pronchery * Copyright (c) 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019
6*a3cefe7fSPierre Pronchery * pkgconf authors (see AUTHORS).
7*a3cefe7fSPierre Pronchery *
8*a3cefe7fSPierre Pronchery * Permission to use, copy, modify, and/or distribute this software for any
9*a3cefe7fSPierre Pronchery * purpose with or without fee is hereby granted, provided that the above
10*a3cefe7fSPierre Pronchery * copyright notice and this permission notice appear in all copies.
11*a3cefe7fSPierre Pronchery *
12*a3cefe7fSPierre Pronchery * This software is provided 'as is' and without any warranty, express or
13*a3cefe7fSPierre Pronchery * implied. In no event shall the authors be liable for any damages arising
14*a3cefe7fSPierre Pronchery * from the use of this software.
15*a3cefe7fSPierre Pronchery */
16*a3cefe7fSPierre Pronchery
17*a3cefe7fSPierre Pronchery #include "libpkgconf/config.h"
18*a3cefe7fSPierre Pronchery #include <libpkgconf/stdinc.h>
19*a3cefe7fSPierre Pronchery #include <libpkgconf/libpkgconf.h>
20*a3cefe7fSPierre Pronchery #include "getopt_long.h"
21*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
22*a3cefe7fSPierre Pronchery #include "renderer-msvc.h"
23*a3cefe7fSPierre Pronchery #endif
24*a3cefe7fSPierre Pronchery #ifdef _WIN32
25*a3cefe7fSPierre Pronchery #include <io.h> /* for _setmode() */
26*a3cefe7fSPierre Pronchery #include <fcntl.h>
27*a3cefe7fSPierre Pronchery #endif
28*a3cefe7fSPierre Pronchery
29*a3cefe7fSPierre Pronchery #define PKG_CFLAGS_ONLY_I (((uint64_t) 1) << 2)
30*a3cefe7fSPierre Pronchery #define PKG_CFLAGS_ONLY_OTHER (((uint64_t) 1) << 3)
31*a3cefe7fSPierre Pronchery #define PKG_CFLAGS (PKG_CFLAGS_ONLY_I|PKG_CFLAGS_ONLY_OTHER)
32*a3cefe7fSPierre Pronchery #define PKG_LIBS_ONLY_LDPATH (((uint64_t) 1) << 5)
33*a3cefe7fSPierre Pronchery #define PKG_LIBS_ONLY_LIBNAME (((uint64_t) 1) << 6)
34*a3cefe7fSPierre Pronchery #define PKG_LIBS_ONLY_OTHER (((uint64_t) 1) << 7)
35*a3cefe7fSPierre Pronchery #define PKG_LIBS (PKG_LIBS_ONLY_LDPATH|PKG_LIBS_ONLY_LIBNAME|PKG_LIBS_ONLY_OTHER)
36*a3cefe7fSPierre Pronchery #define PKG_MODVERSION (((uint64_t) 1) << 8)
37*a3cefe7fSPierre Pronchery #define PKG_REQUIRES (((uint64_t) 1) << 9)
38*a3cefe7fSPierre Pronchery #define PKG_REQUIRES_PRIVATE (((uint64_t) 1) << 10)
39*a3cefe7fSPierre Pronchery #define PKG_VARIABLES (((uint64_t) 1) << 11)
40*a3cefe7fSPierre Pronchery #define PKG_DIGRAPH (((uint64_t) 1) << 12)
41*a3cefe7fSPierre Pronchery #define PKG_KEEP_SYSTEM_CFLAGS (((uint64_t) 1) << 13)
42*a3cefe7fSPierre Pronchery #define PKG_KEEP_SYSTEM_LIBS (((uint64_t) 1) << 14)
43*a3cefe7fSPierre Pronchery #define PKG_VERSION (((uint64_t) 1) << 15)
44*a3cefe7fSPierre Pronchery #define PKG_ABOUT (((uint64_t) 1) << 16)
45*a3cefe7fSPierre Pronchery #define PKG_ENV_ONLY (((uint64_t) 1) << 17)
46*a3cefe7fSPierre Pronchery #define PKG_ERRORS_ON_STDOUT (((uint64_t) 1) << 18)
47*a3cefe7fSPierre Pronchery #define PKG_SILENCE_ERRORS (((uint64_t) 1) << 19)
48*a3cefe7fSPierre Pronchery #define PKG_IGNORE_CONFLICTS (((uint64_t) 1) << 20)
49*a3cefe7fSPierre Pronchery #define PKG_STATIC (((uint64_t) 1) << 21)
50*a3cefe7fSPierre Pronchery #define PKG_NO_UNINSTALLED (((uint64_t) 1) << 22)
51*a3cefe7fSPierre Pronchery #define PKG_UNINSTALLED (((uint64_t) 1) << 23)
52*a3cefe7fSPierre Pronchery #define PKG_LIST (((uint64_t) 1) << 24)
53*a3cefe7fSPierre Pronchery #define PKG_HELP (((uint64_t) 1) << 25)
54*a3cefe7fSPierre Pronchery #define PKG_PRINT_ERRORS (((uint64_t) 1) << 26)
55*a3cefe7fSPierre Pronchery #define PKG_SIMULATE (((uint64_t) 1) << 27)
56*a3cefe7fSPierre Pronchery #define PKG_NO_CACHE (((uint64_t) 1) << 28)
57*a3cefe7fSPierre Pronchery #define PKG_PROVIDES (((uint64_t) 1) << 29)
58*a3cefe7fSPierre Pronchery #define PKG_VALIDATE (((uint64_t) 1) << 30)
59*a3cefe7fSPierre Pronchery #define PKG_LIST_PACKAGE_NAMES (((uint64_t) 1) << 31)
60*a3cefe7fSPierre Pronchery #define PKG_NO_PROVIDES (((uint64_t) 1) << 32)
61*a3cefe7fSPierre Pronchery #define PKG_PURE (((uint64_t) 1) << 33)
62*a3cefe7fSPierre Pronchery #define PKG_PATH (((uint64_t) 1) << 34)
63*a3cefe7fSPierre Pronchery #define PKG_DEFINE_PREFIX (((uint64_t) 1) << 35)
64*a3cefe7fSPierre Pronchery #define PKG_DONT_DEFINE_PREFIX (((uint64_t) 1) << 36)
65*a3cefe7fSPierre Pronchery #define PKG_DONT_RELOCATE_PATHS (((uint64_t) 1) << 37)
66*a3cefe7fSPierre Pronchery #define PKG_DEBUG (((uint64_t) 1) << 38)
67*a3cefe7fSPierre Pronchery #define PKG_SHORT_ERRORS (((uint64_t) 1) << 39)
68*a3cefe7fSPierre Pronchery #define PKG_EXISTS (((uint64_t) 1) << 40)
69*a3cefe7fSPierre Pronchery #define PKG_MSVC_SYNTAX (((uint64_t) 1) << 41)
70*a3cefe7fSPierre Pronchery #define PKG_INTERNAL_CFLAGS (((uint64_t) 1) << 42)
71*a3cefe7fSPierre Pronchery #define PKG_DUMP_PERSONALITY (((uint64_t) 1) << 43)
72*a3cefe7fSPierre Pronchery #define PKG_SHARED (((uint64_t) 1) << 44)
73*a3cefe7fSPierre Pronchery #define PKG_DUMP_LICENSE (((uint64_t) 1) << 45)
74*a3cefe7fSPierre Pronchery #define PKG_SOLUTION (((uint64_t) 1) << 46)
75*a3cefe7fSPierre Pronchery #define PKG_EXISTS_CFLAGS (((uint64_t) 1) << 47)
76*a3cefe7fSPierre Pronchery #define PKG_FRAGMENT_TREE (((uint64_t) 1) << 48)
77*a3cefe7fSPierre Pronchery
78*a3cefe7fSPierre Pronchery static pkgconf_client_t pkg_client;
79*a3cefe7fSPierre Pronchery static const pkgconf_fragment_render_ops_t *want_render_ops = NULL;
80*a3cefe7fSPierre Pronchery
81*a3cefe7fSPierre Pronchery static uint64_t want_flags;
82*a3cefe7fSPierre Pronchery static int verbosity = 0;
83*a3cefe7fSPierre Pronchery static int maximum_traverse_depth = 2000;
84*a3cefe7fSPierre Pronchery static size_t maximum_package_count = 0;
85*a3cefe7fSPierre Pronchery
86*a3cefe7fSPierre Pronchery static char *want_variable = NULL;
87*a3cefe7fSPierre Pronchery static char *want_fragment_filter = NULL;
88*a3cefe7fSPierre Pronchery
89*a3cefe7fSPierre Pronchery FILE *error_msgout = NULL;
90*a3cefe7fSPierre Pronchery FILE *logfile_out = NULL;
91*a3cefe7fSPierre Pronchery
92*a3cefe7fSPierre Pronchery static bool
error_handler(const char * msg,const pkgconf_client_t * client,void * data)93*a3cefe7fSPierre Pronchery error_handler(const char *msg, const pkgconf_client_t *client, void *data)
94*a3cefe7fSPierre Pronchery {
95*a3cefe7fSPierre Pronchery (void) client;
96*a3cefe7fSPierre Pronchery (void) data;
97*a3cefe7fSPierre Pronchery fprintf(error_msgout, "%s", msg);
98*a3cefe7fSPierre Pronchery return true;
99*a3cefe7fSPierre Pronchery }
100*a3cefe7fSPierre Pronchery
101*a3cefe7fSPierre Pronchery static bool
print_list_entry(const pkgconf_pkg_t * entry,void * data)102*a3cefe7fSPierre Pronchery print_list_entry(const pkgconf_pkg_t *entry, void *data)
103*a3cefe7fSPierre Pronchery {
104*a3cefe7fSPierre Pronchery (void) data;
105*a3cefe7fSPierre Pronchery
106*a3cefe7fSPierre Pronchery if (entry->flags & PKGCONF_PKG_PROPF_UNINSTALLED)
107*a3cefe7fSPierre Pronchery return false;
108*a3cefe7fSPierre Pronchery
109*a3cefe7fSPierre Pronchery printf("%-30s %s - %s\n", entry->id, entry->realname, entry->description);
110*a3cefe7fSPierre Pronchery
111*a3cefe7fSPierre Pronchery return false;
112*a3cefe7fSPierre Pronchery }
113*a3cefe7fSPierre Pronchery
114*a3cefe7fSPierre Pronchery static bool
print_package_entry(const pkgconf_pkg_t * entry,void * data)115*a3cefe7fSPierre Pronchery print_package_entry(const pkgconf_pkg_t *entry, void *data)
116*a3cefe7fSPierre Pronchery {
117*a3cefe7fSPierre Pronchery (void) data;
118*a3cefe7fSPierre Pronchery
119*a3cefe7fSPierre Pronchery if (entry->flags & PKGCONF_PKG_PROPF_UNINSTALLED)
120*a3cefe7fSPierre Pronchery return false;
121*a3cefe7fSPierre Pronchery
122*a3cefe7fSPierre Pronchery printf("%s\n", entry->id);
123*a3cefe7fSPierre Pronchery
124*a3cefe7fSPierre Pronchery return false;
125*a3cefe7fSPierre Pronchery }
126*a3cefe7fSPierre Pronchery
127*a3cefe7fSPierre Pronchery static bool
filter_cflags(const pkgconf_client_t * client,const pkgconf_fragment_t * frag,void * data)128*a3cefe7fSPierre Pronchery filter_cflags(const pkgconf_client_t *client, const pkgconf_fragment_t *frag, void *data)
129*a3cefe7fSPierre Pronchery {
130*a3cefe7fSPierre Pronchery int got_flags = 0;
131*a3cefe7fSPierre Pronchery (void) client;
132*a3cefe7fSPierre Pronchery (void) data;
133*a3cefe7fSPierre Pronchery
134*a3cefe7fSPierre Pronchery if (!(want_flags & PKG_KEEP_SYSTEM_CFLAGS) && pkgconf_fragment_has_system_dir(client, frag))
135*a3cefe7fSPierre Pronchery return false;
136*a3cefe7fSPierre Pronchery
137*a3cefe7fSPierre Pronchery if (want_fragment_filter != NULL && (strchr(want_fragment_filter, frag->type) == NULL || !frag->type))
138*a3cefe7fSPierre Pronchery return false;
139*a3cefe7fSPierre Pronchery
140*a3cefe7fSPierre Pronchery if (frag->type == 'I')
141*a3cefe7fSPierre Pronchery got_flags = PKG_CFLAGS_ONLY_I;
142*a3cefe7fSPierre Pronchery else
143*a3cefe7fSPierre Pronchery got_flags = PKG_CFLAGS_ONLY_OTHER;
144*a3cefe7fSPierre Pronchery
145*a3cefe7fSPierre Pronchery return (want_flags & got_flags) != 0;
146*a3cefe7fSPierre Pronchery }
147*a3cefe7fSPierre Pronchery
148*a3cefe7fSPierre Pronchery static bool
filter_libs(const pkgconf_client_t * client,const pkgconf_fragment_t * frag,void * data)149*a3cefe7fSPierre Pronchery filter_libs(const pkgconf_client_t *client, const pkgconf_fragment_t *frag, void *data)
150*a3cefe7fSPierre Pronchery {
151*a3cefe7fSPierre Pronchery int got_flags = 0;
152*a3cefe7fSPierre Pronchery (void) client;
153*a3cefe7fSPierre Pronchery (void) data;
154*a3cefe7fSPierre Pronchery
155*a3cefe7fSPierre Pronchery if (!(want_flags & PKG_KEEP_SYSTEM_LIBS) && pkgconf_fragment_has_system_dir(client, frag))
156*a3cefe7fSPierre Pronchery return false;
157*a3cefe7fSPierre Pronchery
158*a3cefe7fSPierre Pronchery if (want_fragment_filter != NULL && (strchr(want_fragment_filter, frag->type) == NULL || !frag->type))
159*a3cefe7fSPierre Pronchery return false;
160*a3cefe7fSPierre Pronchery
161*a3cefe7fSPierre Pronchery switch (frag->type)
162*a3cefe7fSPierre Pronchery {
163*a3cefe7fSPierre Pronchery case 'L': got_flags = PKG_LIBS_ONLY_LDPATH; break;
164*a3cefe7fSPierre Pronchery case 'l': got_flags = PKG_LIBS_ONLY_LIBNAME; break;
165*a3cefe7fSPierre Pronchery default: got_flags = PKG_LIBS_ONLY_OTHER; break;
166*a3cefe7fSPierre Pronchery }
167*a3cefe7fSPierre Pronchery
168*a3cefe7fSPierre Pronchery return (want_flags & got_flags) != 0;
169*a3cefe7fSPierre Pronchery }
170*a3cefe7fSPierre Pronchery
171*a3cefe7fSPierre Pronchery static void
print_variables(pkgconf_pkg_t * pkg)172*a3cefe7fSPierre Pronchery print_variables(pkgconf_pkg_t *pkg)
173*a3cefe7fSPierre Pronchery {
174*a3cefe7fSPierre Pronchery pkgconf_node_t *node;
175*a3cefe7fSPierre Pronchery
176*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(pkg->vars.head, node)
177*a3cefe7fSPierre Pronchery {
178*a3cefe7fSPierre Pronchery pkgconf_tuple_t *tuple = node->data;
179*a3cefe7fSPierre Pronchery
180*a3cefe7fSPierre Pronchery printf("%s\n", tuple->key);
181*a3cefe7fSPierre Pronchery }
182*a3cefe7fSPierre Pronchery }
183*a3cefe7fSPierre Pronchery
184*a3cefe7fSPierre Pronchery static void
print_requires(pkgconf_pkg_t * pkg)185*a3cefe7fSPierre Pronchery print_requires(pkgconf_pkg_t *pkg)
186*a3cefe7fSPierre Pronchery {
187*a3cefe7fSPierre Pronchery pkgconf_node_t *node;
188*a3cefe7fSPierre Pronchery
189*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(pkg->required.head, node)
190*a3cefe7fSPierre Pronchery {
191*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = node->data;
192*a3cefe7fSPierre Pronchery
193*a3cefe7fSPierre Pronchery printf("%s", dep->package);
194*a3cefe7fSPierre Pronchery
195*a3cefe7fSPierre Pronchery if (dep->version != NULL)
196*a3cefe7fSPierre Pronchery printf(" %s %s", pkgconf_pkg_get_comparator(dep), dep->version);
197*a3cefe7fSPierre Pronchery
198*a3cefe7fSPierre Pronchery printf("\n");
199*a3cefe7fSPierre Pronchery }
200*a3cefe7fSPierre Pronchery }
201*a3cefe7fSPierre Pronchery
202*a3cefe7fSPierre Pronchery static void
print_requires_private(pkgconf_pkg_t * pkg)203*a3cefe7fSPierre Pronchery print_requires_private(pkgconf_pkg_t *pkg)
204*a3cefe7fSPierre Pronchery {
205*a3cefe7fSPierre Pronchery pkgconf_node_t *node;
206*a3cefe7fSPierre Pronchery
207*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(pkg->requires_private.head, node)
208*a3cefe7fSPierre Pronchery {
209*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = node->data;
210*a3cefe7fSPierre Pronchery
211*a3cefe7fSPierre Pronchery printf("%s", dep->package);
212*a3cefe7fSPierre Pronchery
213*a3cefe7fSPierre Pronchery if (dep->version != NULL)
214*a3cefe7fSPierre Pronchery printf(" %s %s", pkgconf_pkg_get_comparator(dep), dep->version);
215*a3cefe7fSPierre Pronchery
216*a3cefe7fSPierre Pronchery printf("\n");
217*a3cefe7fSPierre Pronchery }
218*a3cefe7fSPierre Pronchery }
219*a3cefe7fSPierre Pronchery
220*a3cefe7fSPierre Pronchery static void
print_provides(pkgconf_pkg_t * pkg)221*a3cefe7fSPierre Pronchery print_provides(pkgconf_pkg_t *pkg)
222*a3cefe7fSPierre Pronchery {
223*a3cefe7fSPierre Pronchery pkgconf_node_t *node;
224*a3cefe7fSPierre Pronchery
225*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(pkg->provides.head, node)
226*a3cefe7fSPierre Pronchery {
227*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = node->data;
228*a3cefe7fSPierre Pronchery
229*a3cefe7fSPierre Pronchery printf("%s", dep->package);
230*a3cefe7fSPierre Pronchery
231*a3cefe7fSPierre Pronchery if (dep->version != NULL)
232*a3cefe7fSPierre Pronchery printf(" %s %s", pkgconf_pkg_get_comparator(dep), dep->version);
233*a3cefe7fSPierre Pronchery
234*a3cefe7fSPierre Pronchery printf("\n");
235*a3cefe7fSPierre Pronchery }
236*a3cefe7fSPierre Pronchery }
237*a3cefe7fSPierre Pronchery
238*a3cefe7fSPierre Pronchery static bool
apply_provides(pkgconf_client_t * client,pkgconf_pkg_t * world,void * unused,int maxdepth)239*a3cefe7fSPierre Pronchery apply_provides(pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth)
240*a3cefe7fSPierre Pronchery {
241*a3cefe7fSPierre Pronchery pkgconf_node_t *iter;
242*a3cefe7fSPierre Pronchery (void) client;
243*a3cefe7fSPierre Pronchery (void) unused;
244*a3cefe7fSPierre Pronchery (void) maxdepth;
245*a3cefe7fSPierre Pronchery
246*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(world->required.head, iter)
247*a3cefe7fSPierre Pronchery {
248*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = iter->data;
249*a3cefe7fSPierre Pronchery pkgconf_pkg_t *pkg = dep->match;
250*a3cefe7fSPierre Pronchery
251*a3cefe7fSPierre Pronchery print_provides(pkg);
252*a3cefe7fSPierre Pronchery }
253*a3cefe7fSPierre Pronchery
254*a3cefe7fSPierre Pronchery return true;
255*a3cefe7fSPierre Pronchery }
256*a3cefe7fSPierre Pronchery
257*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
258*a3cefe7fSPierre Pronchery static void
print_digraph_node(pkgconf_client_t * client,pkgconf_pkg_t * pkg,void * data)259*a3cefe7fSPierre Pronchery print_digraph_node(pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *data)
260*a3cefe7fSPierre Pronchery {
261*a3cefe7fSPierre Pronchery pkgconf_node_t *node;
262*a3cefe7fSPierre Pronchery (void) client;
263*a3cefe7fSPierre Pronchery pkgconf_pkg_t **last_seen = data;
264*a3cefe7fSPierre Pronchery
265*a3cefe7fSPierre Pronchery if(pkg->flags & PKGCONF_PKG_PROPF_VIRTUAL)
266*a3cefe7fSPierre Pronchery return;
267*a3cefe7fSPierre Pronchery
268*a3cefe7fSPierre Pronchery if (pkg->flags & PKGCONF_PKG_PROPF_VISITED_PRIVATE)
269*a3cefe7fSPierre Pronchery printf("\"%s\" [fontname=Sans fontsize=8 fontcolor=gray color=gray]\n", pkg->id);
270*a3cefe7fSPierre Pronchery else
271*a3cefe7fSPierre Pronchery printf("\"%s\" [fontname=Sans fontsize=8]\n", pkg->id);
272*a3cefe7fSPierre Pronchery
273*a3cefe7fSPierre Pronchery if (last_seen != NULL)
274*a3cefe7fSPierre Pronchery {
275*a3cefe7fSPierre Pronchery if (*last_seen != NULL)
276*a3cefe7fSPierre Pronchery printf("\"%s\" -> \"%s\" [fontname=Sans fontsize=8 color=red]\n", (*last_seen)->id, pkg->id);
277*a3cefe7fSPierre Pronchery
278*a3cefe7fSPierre Pronchery *last_seen = pkg;
279*a3cefe7fSPierre Pronchery }
280*a3cefe7fSPierre Pronchery
281*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(pkg->required.head, node)
282*a3cefe7fSPierre Pronchery {
283*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = node->data;
284*a3cefe7fSPierre Pronchery const char *dep_id = (dep->match != NULL) ? dep->match->id : dep->package;
285*a3cefe7fSPierre Pronchery
286*a3cefe7fSPierre Pronchery if ((dep->flags & PKGCONF_PKG_DEPF_PRIVATE) == 0)
287*a3cefe7fSPierre Pronchery printf("\"%s\" -> \"%s\" [fontname=Sans fontsize=8]\n", pkg->id, dep_id);
288*a3cefe7fSPierre Pronchery else
289*a3cefe7fSPierre Pronchery printf("\"%s\" -> \"%s\" [fontname=Sans fontsize=8 color=gray]\n", pkg->id, dep_id);
290*a3cefe7fSPierre Pronchery }
291*a3cefe7fSPierre Pronchery
292*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(pkg->requires_private.head, node)
293*a3cefe7fSPierre Pronchery {
294*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = node->data;
295*a3cefe7fSPierre Pronchery const char *dep_id = (dep->match != NULL) ? dep->match->id : dep->package;
296*a3cefe7fSPierre Pronchery
297*a3cefe7fSPierre Pronchery printf("\"%s\" -> \"%s\" [fontname=Sans fontsize=8 color=gray]\n", pkg->id, dep_id);
298*a3cefe7fSPierre Pronchery }
299*a3cefe7fSPierre Pronchery }
300*a3cefe7fSPierre Pronchery
301*a3cefe7fSPierre Pronchery static bool
apply_digraph(pkgconf_client_t * client,pkgconf_pkg_t * world,void * data,int maxdepth)302*a3cefe7fSPierre Pronchery apply_digraph(pkgconf_client_t *client, pkgconf_pkg_t *world, void *data, int maxdepth)
303*a3cefe7fSPierre Pronchery {
304*a3cefe7fSPierre Pronchery int eflag;
305*a3cefe7fSPierre Pronchery pkgconf_list_t *list = data;
306*a3cefe7fSPierre Pronchery pkgconf_pkg_t *last_seen = NULL;
307*a3cefe7fSPierre Pronchery pkgconf_node_t *iter;
308*a3cefe7fSPierre Pronchery
309*a3cefe7fSPierre Pronchery printf("digraph deptree {\n");
310*a3cefe7fSPierre Pronchery printf("edge [color=blue len=7.5 fontname=Sans fontsize=8]\n");
311*a3cefe7fSPierre Pronchery printf("node [fontname=Sans fontsize=8]\n");
312*a3cefe7fSPierre Pronchery printf("\"user:request\" [fontname=Sans fontsize=8]\n");
313*a3cefe7fSPierre Pronchery
314*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(list->head, iter)
315*a3cefe7fSPierre Pronchery {
316*a3cefe7fSPierre Pronchery pkgconf_queue_t *pkgq = iter->data;
317*a3cefe7fSPierre Pronchery pkgconf_pkg_t *pkg = pkgconf_pkg_find(client, pkgq->package);
318*a3cefe7fSPierre Pronchery printf("\"user:request\" -> \"%s\" [fontname=Sans fontsize=8]\n", pkg == NULL ? pkgq->package : pkg->id);
319*a3cefe7fSPierre Pronchery if (pkg != NULL)
320*a3cefe7fSPierre Pronchery pkgconf_pkg_unref(client, pkg);
321*a3cefe7fSPierre Pronchery }
322*a3cefe7fSPierre Pronchery
323*a3cefe7fSPierre Pronchery eflag = pkgconf_pkg_traverse(client, world, print_digraph_node, &last_seen, maxdepth, 0);
324*a3cefe7fSPierre Pronchery
325*a3cefe7fSPierre Pronchery if (eflag != PKGCONF_PKG_ERRF_OK)
326*a3cefe7fSPierre Pronchery return false;
327*a3cefe7fSPierre Pronchery
328*a3cefe7fSPierre Pronchery printf("}\n");
329*a3cefe7fSPierre Pronchery return true;
330*a3cefe7fSPierre Pronchery }
331*a3cefe7fSPierre Pronchery
332*a3cefe7fSPierre Pronchery static void
print_solution_node(pkgconf_client_t * client,pkgconf_pkg_t * pkg,void * unused)333*a3cefe7fSPierre Pronchery print_solution_node(pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *unused)
334*a3cefe7fSPierre Pronchery {
335*a3cefe7fSPierre Pronchery (void) client;
336*a3cefe7fSPierre Pronchery (void) unused;
337*a3cefe7fSPierre Pronchery
338*a3cefe7fSPierre Pronchery printf("%s (%"PRIu64")%s\n", pkg->id, pkg->identifier, (pkg->flags & PKGCONF_PKG_PROPF_VISITED_PRIVATE) == PKGCONF_PKG_PROPF_VISITED_PRIVATE ? " [private]" : "");
339*a3cefe7fSPierre Pronchery }
340*a3cefe7fSPierre Pronchery
341*a3cefe7fSPierre Pronchery static bool
apply_print_solution(pkgconf_client_t * client,pkgconf_pkg_t * world,void * unused,int maxdepth)342*a3cefe7fSPierre Pronchery apply_print_solution(pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth)
343*a3cefe7fSPierre Pronchery {
344*a3cefe7fSPierre Pronchery int eflag;
345*a3cefe7fSPierre Pronchery
346*a3cefe7fSPierre Pronchery eflag = pkgconf_pkg_traverse(client, world, print_solution_node, unused, maxdepth, 0);
347*a3cefe7fSPierre Pronchery
348*a3cefe7fSPierre Pronchery return eflag == PKGCONF_PKG_ERRF_OK;
349*a3cefe7fSPierre Pronchery }
350*a3cefe7fSPierre Pronchery #endif
351*a3cefe7fSPierre Pronchery
352*a3cefe7fSPierre Pronchery static bool
apply_modversion(pkgconf_client_t * client,pkgconf_pkg_t * world,void * data,int maxdepth)353*a3cefe7fSPierre Pronchery apply_modversion(pkgconf_client_t *client, pkgconf_pkg_t *world, void *data, int maxdepth)
354*a3cefe7fSPierre Pronchery {
355*a3cefe7fSPierre Pronchery pkgconf_node_t *queue_iter;
356*a3cefe7fSPierre Pronchery pkgconf_list_t *pkgq = data;
357*a3cefe7fSPierre Pronchery (void) client;
358*a3cefe7fSPierre Pronchery (void) maxdepth;
359*a3cefe7fSPierre Pronchery
360*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(pkgq->head, queue_iter)
361*a3cefe7fSPierre Pronchery {
362*a3cefe7fSPierre Pronchery pkgconf_node_t *world_iter;
363*a3cefe7fSPierre Pronchery pkgconf_queue_t *queue_node = queue_iter->data;
364*a3cefe7fSPierre Pronchery
365*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(world->required.head, world_iter)
366*a3cefe7fSPierre Pronchery {
367*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = world_iter->data;
368*a3cefe7fSPierre Pronchery pkgconf_pkg_t *pkg = dep->match;
369*a3cefe7fSPierre Pronchery
370*a3cefe7fSPierre Pronchery const size_t name_len = strlen(pkg->why);
371*a3cefe7fSPierre Pronchery if (name_len > strlen(queue_node->package) ||
372*a3cefe7fSPierre Pronchery strncmp(pkg->why, queue_node->package, name_len) ||
373*a3cefe7fSPierre Pronchery (queue_node->package[name_len] != 0 &&
374*a3cefe7fSPierre Pronchery !isspace((unsigned char)queue_node->package[name_len]) &&
375*a3cefe7fSPierre Pronchery !PKGCONF_IS_OPERATOR_CHAR(queue_node->package[name_len])))
376*a3cefe7fSPierre Pronchery continue;
377*a3cefe7fSPierre Pronchery
378*a3cefe7fSPierre Pronchery if (pkg->version != NULL) {
379*a3cefe7fSPierre Pronchery if (verbosity)
380*a3cefe7fSPierre Pronchery printf("%s: ", pkg->id);
381*a3cefe7fSPierre Pronchery
382*a3cefe7fSPierre Pronchery printf("%s\n", pkg->version);
383*a3cefe7fSPierre Pronchery }
384*a3cefe7fSPierre Pronchery
385*a3cefe7fSPierre Pronchery break;
386*a3cefe7fSPierre Pronchery }
387*a3cefe7fSPierre Pronchery }
388*a3cefe7fSPierre Pronchery
389*a3cefe7fSPierre Pronchery return true;
390*a3cefe7fSPierre Pronchery }
391*a3cefe7fSPierre Pronchery
392*a3cefe7fSPierre Pronchery static bool
apply_variables(pkgconf_client_t * client,pkgconf_pkg_t * world,void * unused,int maxdepth)393*a3cefe7fSPierre Pronchery apply_variables(pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth)
394*a3cefe7fSPierre Pronchery {
395*a3cefe7fSPierre Pronchery pkgconf_node_t *iter;
396*a3cefe7fSPierre Pronchery (void) client;
397*a3cefe7fSPierre Pronchery (void) unused;
398*a3cefe7fSPierre Pronchery (void) maxdepth;
399*a3cefe7fSPierre Pronchery
400*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(world->required.head, iter)
401*a3cefe7fSPierre Pronchery {
402*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = iter->data;
403*a3cefe7fSPierre Pronchery pkgconf_pkg_t *pkg = dep->match;
404*a3cefe7fSPierre Pronchery
405*a3cefe7fSPierre Pronchery print_variables(pkg);
406*a3cefe7fSPierre Pronchery }
407*a3cefe7fSPierre Pronchery
408*a3cefe7fSPierre Pronchery return true;
409*a3cefe7fSPierre Pronchery }
410*a3cefe7fSPierre Pronchery
411*a3cefe7fSPierre Pronchery static bool
apply_path(pkgconf_client_t * client,pkgconf_pkg_t * world,void * unused,int maxdepth)412*a3cefe7fSPierre Pronchery apply_path(pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth)
413*a3cefe7fSPierre Pronchery {
414*a3cefe7fSPierre Pronchery pkgconf_node_t *iter;
415*a3cefe7fSPierre Pronchery (void) client;
416*a3cefe7fSPierre Pronchery (void) unused;
417*a3cefe7fSPierre Pronchery (void) maxdepth;
418*a3cefe7fSPierre Pronchery
419*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(world->required.head, iter)
420*a3cefe7fSPierre Pronchery {
421*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = iter->data;
422*a3cefe7fSPierre Pronchery pkgconf_pkg_t *pkg = dep->match;
423*a3cefe7fSPierre Pronchery
424*a3cefe7fSPierre Pronchery /* a module entry with no filename is either virtual, static (builtin) or synthesized. */
425*a3cefe7fSPierre Pronchery if (pkg->filename != NULL)
426*a3cefe7fSPierre Pronchery printf("%s\n", pkg->filename);
427*a3cefe7fSPierre Pronchery }
428*a3cefe7fSPierre Pronchery
429*a3cefe7fSPierre Pronchery return true;
430*a3cefe7fSPierre Pronchery }
431*a3cefe7fSPierre Pronchery
432*a3cefe7fSPierre Pronchery static bool
apply_variable(pkgconf_client_t * client,pkgconf_pkg_t * world,void * variable,int maxdepth)433*a3cefe7fSPierre Pronchery apply_variable(pkgconf_client_t *client, pkgconf_pkg_t *world, void *variable, int maxdepth)
434*a3cefe7fSPierre Pronchery {
435*a3cefe7fSPierre Pronchery pkgconf_node_t *iter;
436*a3cefe7fSPierre Pronchery (void) maxdepth;
437*a3cefe7fSPierre Pronchery
438*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(world->required.head, iter)
439*a3cefe7fSPierre Pronchery {
440*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = iter->data;
441*a3cefe7fSPierre Pronchery pkgconf_pkg_t *pkg = dep->match;
442*a3cefe7fSPierre Pronchery const char *var;
443*a3cefe7fSPierre Pronchery
444*a3cefe7fSPierre Pronchery var = pkgconf_tuple_find(client, &pkg->vars, variable);
445*a3cefe7fSPierre Pronchery
446*a3cefe7fSPierre Pronchery if (var != NULL)
447*a3cefe7fSPierre Pronchery printf("%s%s", iter->prev != NULL ? " " : "", var);
448*a3cefe7fSPierre Pronchery }
449*a3cefe7fSPierre Pronchery
450*a3cefe7fSPierre Pronchery printf("\n");
451*a3cefe7fSPierre Pronchery
452*a3cefe7fSPierre Pronchery return true;
453*a3cefe7fSPierre Pronchery }
454*a3cefe7fSPierre Pronchery
455*a3cefe7fSPierre Pronchery static bool
apply_env_var(const char * prefix,pkgconf_client_t * client,pkgconf_pkg_t * world,int maxdepth,unsigned int (* collect_fn)(pkgconf_client_t * client,pkgconf_pkg_t * world,pkgconf_list_t * list,int maxdepth),bool (* filter_fn)(const pkgconf_client_t * client,const pkgconf_fragment_t * frag,void * data),void (* postprocess_fn)(pkgconf_client_t * client,pkgconf_pkg_t * world,pkgconf_list_t * fragment_list))456*a3cefe7fSPierre Pronchery apply_env_var(const char *prefix, pkgconf_client_t *client, pkgconf_pkg_t *world, int maxdepth,
457*a3cefe7fSPierre Pronchery unsigned int (*collect_fn)(pkgconf_client_t *client, pkgconf_pkg_t *world, pkgconf_list_t *list, int maxdepth),
458*a3cefe7fSPierre Pronchery bool (*filter_fn)(const pkgconf_client_t *client, const pkgconf_fragment_t *frag, void *data),
459*a3cefe7fSPierre Pronchery void (*postprocess_fn)(pkgconf_client_t *client, pkgconf_pkg_t *world, pkgconf_list_t *fragment_list))
460*a3cefe7fSPierre Pronchery {
461*a3cefe7fSPierre Pronchery pkgconf_list_t unfiltered_list = PKGCONF_LIST_INITIALIZER;
462*a3cefe7fSPierre Pronchery pkgconf_list_t filtered_list = PKGCONF_LIST_INITIALIZER;
463*a3cefe7fSPierre Pronchery unsigned int eflag;
464*a3cefe7fSPierre Pronchery char *render_buf;
465*a3cefe7fSPierre Pronchery
466*a3cefe7fSPierre Pronchery eflag = collect_fn(client, world, &unfiltered_list, maxdepth);
467*a3cefe7fSPierre Pronchery if (eflag != PKGCONF_PKG_ERRF_OK)
468*a3cefe7fSPierre Pronchery return false;
469*a3cefe7fSPierre Pronchery
470*a3cefe7fSPierre Pronchery pkgconf_fragment_filter(client, &filtered_list, &unfiltered_list, filter_fn, NULL);
471*a3cefe7fSPierre Pronchery
472*a3cefe7fSPierre Pronchery if (postprocess_fn != NULL)
473*a3cefe7fSPierre Pronchery postprocess_fn(client, world, &filtered_list);
474*a3cefe7fSPierre Pronchery
475*a3cefe7fSPierre Pronchery if (filtered_list.head == NULL)
476*a3cefe7fSPierre Pronchery goto out;
477*a3cefe7fSPierre Pronchery
478*a3cefe7fSPierre Pronchery render_buf = pkgconf_fragment_render(&filtered_list, true, want_render_ops);
479*a3cefe7fSPierre Pronchery printf("%s='%s'\n", prefix, render_buf);
480*a3cefe7fSPierre Pronchery free(render_buf);
481*a3cefe7fSPierre Pronchery
482*a3cefe7fSPierre Pronchery out:
483*a3cefe7fSPierre Pronchery pkgconf_fragment_free(&unfiltered_list);
484*a3cefe7fSPierre Pronchery pkgconf_fragment_free(&filtered_list);
485*a3cefe7fSPierre Pronchery
486*a3cefe7fSPierre Pronchery return true;
487*a3cefe7fSPierre Pronchery }
488*a3cefe7fSPierre Pronchery
489*a3cefe7fSPierre Pronchery static void
maybe_add_module_definitions(pkgconf_client_t * client,pkgconf_pkg_t * world,pkgconf_list_t * fragment_list)490*a3cefe7fSPierre Pronchery maybe_add_module_definitions(pkgconf_client_t *client, pkgconf_pkg_t *world, pkgconf_list_t *fragment_list)
491*a3cefe7fSPierre Pronchery {
492*a3cefe7fSPierre Pronchery pkgconf_node_t *world_iter;
493*a3cefe7fSPierre Pronchery
494*a3cefe7fSPierre Pronchery if ((want_flags & PKG_EXISTS_CFLAGS) != PKG_EXISTS_CFLAGS)
495*a3cefe7fSPierre Pronchery return;
496*a3cefe7fSPierre Pronchery
497*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(world->required.head, world_iter)
498*a3cefe7fSPierre Pronchery {
499*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = world_iter->data;
500*a3cefe7fSPierre Pronchery char havebuf[PKGCONF_ITEM_SIZE];
501*a3cefe7fSPierre Pronchery char *p;
502*a3cefe7fSPierre Pronchery
503*a3cefe7fSPierre Pronchery if ((dep->flags & PKGCONF_PKG_DEPF_QUERY) != PKGCONF_PKG_DEPF_QUERY)
504*a3cefe7fSPierre Pronchery continue;
505*a3cefe7fSPierre Pronchery
506*a3cefe7fSPierre Pronchery if (dep->match == NULL)
507*a3cefe7fSPierre Pronchery continue;
508*a3cefe7fSPierre Pronchery
509*a3cefe7fSPierre Pronchery snprintf(havebuf, sizeof havebuf, "HAVE_%s", dep->match->id);
510*a3cefe7fSPierre Pronchery
511*a3cefe7fSPierre Pronchery for (p = havebuf; *p; p++)
512*a3cefe7fSPierre Pronchery {
513*a3cefe7fSPierre Pronchery switch (*p)
514*a3cefe7fSPierre Pronchery {
515*a3cefe7fSPierre Pronchery case ' ':
516*a3cefe7fSPierre Pronchery case '-':
517*a3cefe7fSPierre Pronchery *p = '_';
518*a3cefe7fSPierre Pronchery break;
519*a3cefe7fSPierre Pronchery
520*a3cefe7fSPierre Pronchery default:
521*a3cefe7fSPierre Pronchery *p = toupper((unsigned char) *p);
522*a3cefe7fSPierre Pronchery }
523*a3cefe7fSPierre Pronchery }
524*a3cefe7fSPierre Pronchery
525*a3cefe7fSPierre Pronchery pkgconf_fragment_insert(client, fragment_list, 'D', havebuf, false);
526*a3cefe7fSPierre Pronchery }
527*a3cefe7fSPierre Pronchery }
528*a3cefe7fSPierre Pronchery
529*a3cefe7fSPierre Pronchery static void
apply_env_variables(pkgconf_client_t * client,pkgconf_pkg_t * world,const char * env_prefix)530*a3cefe7fSPierre Pronchery apply_env_variables(pkgconf_client_t *client, pkgconf_pkg_t *world, const char *env_prefix)
531*a3cefe7fSPierre Pronchery {
532*a3cefe7fSPierre Pronchery (void) client;
533*a3cefe7fSPierre Pronchery pkgconf_node_t *world_iter;
534*a3cefe7fSPierre Pronchery
535*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(world->required.head, world_iter)
536*a3cefe7fSPierre Pronchery {
537*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = world_iter->data;
538*a3cefe7fSPierre Pronchery pkgconf_pkg_t *pkg = dep->match;
539*a3cefe7fSPierre Pronchery pkgconf_node_t *tuple_iter;
540*a3cefe7fSPierre Pronchery
541*a3cefe7fSPierre Pronchery if ((dep->flags & PKGCONF_PKG_DEPF_QUERY) != PKGCONF_PKG_DEPF_QUERY)
542*a3cefe7fSPierre Pronchery continue;
543*a3cefe7fSPierre Pronchery
544*a3cefe7fSPierre Pronchery if (dep->match == NULL)
545*a3cefe7fSPierre Pronchery continue;
546*a3cefe7fSPierre Pronchery
547*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(pkg->vars.head, tuple_iter)
548*a3cefe7fSPierre Pronchery {
549*a3cefe7fSPierre Pronchery pkgconf_tuple_t *tuple = tuple_iter->data;
550*a3cefe7fSPierre Pronchery char havebuf[PKGCONF_ITEM_SIZE];
551*a3cefe7fSPierre Pronchery char *p;
552*a3cefe7fSPierre Pronchery
553*a3cefe7fSPierre Pronchery if (want_variable != NULL && strcmp(want_variable, tuple->key))
554*a3cefe7fSPierre Pronchery continue;
555*a3cefe7fSPierre Pronchery
556*a3cefe7fSPierre Pronchery snprintf(havebuf, sizeof havebuf, "%s_%s", env_prefix, tuple->key);
557*a3cefe7fSPierre Pronchery
558*a3cefe7fSPierre Pronchery for (p = havebuf; *p; p++)
559*a3cefe7fSPierre Pronchery {
560*a3cefe7fSPierre Pronchery switch (*p)
561*a3cefe7fSPierre Pronchery {
562*a3cefe7fSPierre Pronchery case ' ':
563*a3cefe7fSPierre Pronchery case '-':
564*a3cefe7fSPierre Pronchery *p = '_';
565*a3cefe7fSPierre Pronchery break;
566*a3cefe7fSPierre Pronchery
567*a3cefe7fSPierre Pronchery default:
568*a3cefe7fSPierre Pronchery *p = toupper((unsigned char) *p);
569*a3cefe7fSPierre Pronchery }
570*a3cefe7fSPierre Pronchery }
571*a3cefe7fSPierre Pronchery
572*a3cefe7fSPierre Pronchery printf("%s='%s'\n", havebuf, tuple->value);
573*a3cefe7fSPierre Pronchery }
574*a3cefe7fSPierre Pronchery }
575*a3cefe7fSPierre Pronchery }
576*a3cefe7fSPierre Pronchery
577*a3cefe7fSPierre Pronchery static bool
apply_env(pkgconf_client_t * client,pkgconf_pkg_t * world,void * env_prefix_p,int maxdepth)578*a3cefe7fSPierre Pronchery apply_env(pkgconf_client_t *client, pkgconf_pkg_t *world, void *env_prefix_p, int maxdepth)
579*a3cefe7fSPierre Pronchery {
580*a3cefe7fSPierre Pronchery const char *want_env_prefix = env_prefix_p, *it;
581*a3cefe7fSPierre Pronchery char workbuf[PKGCONF_ITEM_SIZE];
582*a3cefe7fSPierre Pronchery
583*a3cefe7fSPierre Pronchery for (it = want_env_prefix; *it != '\0'; it++)
584*a3cefe7fSPierre Pronchery if (!isalpha((unsigned char)*it) &&
585*a3cefe7fSPierre Pronchery !isdigit((unsigned char)*it))
586*a3cefe7fSPierre Pronchery return false;
587*a3cefe7fSPierre Pronchery
588*a3cefe7fSPierre Pronchery snprintf(workbuf, sizeof workbuf, "%s_CFLAGS", want_env_prefix);
589*a3cefe7fSPierre Pronchery if (!apply_env_var(workbuf, client, world, maxdepth, pkgconf_pkg_cflags, filter_cflags, maybe_add_module_definitions))
590*a3cefe7fSPierre Pronchery return false;
591*a3cefe7fSPierre Pronchery
592*a3cefe7fSPierre Pronchery snprintf(workbuf, sizeof workbuf, "%s_LIBS", want_env_prefix);
593*a3cefe7fSPierre Pronchery if (!apply_env_var(workbuf, client, world, maxdepth, pkgconf_pkg_libs, filter_libs, NULL))
594*a3cefe7fSPierre Pronchery return false;
595*a3cefe7fSPierre Pronchery
596*a3cefe7fSPierre Pronchery if ((want_flags & PKG_VARIABLES) == PKG_VARIABLES || want_variable != NULL)
597*a3cefe7fSPierre Pronchery apply_env_variables(client, world, want_env_prefix);
598*a3cefe7fSPierre Pronchery
599*a3cefe7fSPierre Pronchery return true;
600*a3cefe7fSPierre Pronchery }
601*a3cefe7fSPierre Pronchery
602*a3cefe7fSPierre Pronchery static bool
apply_cflags(pkgconf_client_t * client,pkgconf_pkg_t * world,void * unused,int maxdepth)603*a3cefe7fSPierre Pronchery apply_cflags(pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth)
604*a3cefe7fSPierre Pronchery {
605*a3cefe7fSPierre Pronchery pkgconf_list_t unfiltered_list = PKGCONF_LIST_INITIALIZER;
606*a3cefe7fSPierre Pronchery pkgconf_list_t filtered_list = PKGCONF_LIST_INITIALIZER;
607*a3cefe7fSPierre Pronchery int eflag;
608*a3cefe7fSPierre Pronchery char *render_buf;
609*a3cefe7fSPierre Pronchery (void) unused;
610*a3cefe7fSPierre Pronchery
611*a3cefe7fSPierre Pronchery eflag = pkgconf_pkg_cflags(client, world, &unfiltered_list, maxdepth);
612*a3cefe7fSPierre Pronchery if (eflag != PKGCONF_PKG_ERRF_OK)
613*a3cefe7fSPierre Pronchery return false;
614*a3cefe7fSPierre Pronchery
615*a3cefe7fSPierre Pronchery pkgconf_fragment_filter(client, &filtered_list, &unfiltered_list, filter_cflags, NULL);
616*a3cefe7fSPierre Pronchery maybe_add_module_definitions(client, world, &filtered_list);
617*a3cefe7fSPierre Pronchery
618*a3cefe7fSPierre Pronchery if (filtered_list.head == NULL)
619*a3cefe7fSPierre Pronchery goto out;
620*a3cefe7fSPierre Pronchery
621*a3cefe7fSPierre Pronchery render_buf = pkgconf_fragment_render(&filtered_list, true, want_render_ops);
622*a3cefe7fSPierre Pronchery printf("%s", render_buf);
623*a3cefe7fSPierre Pronchery free(render_buf);
624*a3cefe7fSPierre Pronchery
625*a3cefe7fSPierre Pronchery out:
626*a3cefe7fSPierre Pronchery pkgconf_fragment_free(&unfiltered_list);
627*a3cefe7fSPierre Pronchery pkgconf_fragment_free(&filtered_list);
628*a3cefe7fSPierre Pronchery
629*a3cefe7fSPierre Pronchery return true;
630*a3cefe7fSPierre Pronchery }
631*a3cefe7fSPierre Pronchery
632*a3cefe7fSPierre Pronchery static bool
apply_libs(pkgconf_client_t * client,pkgconf_pkg_t * world,void * unused,int maxdepth)633*a3cefe7fSPierre Pronchery apply_libs(pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth)
634*a3cefe7fSPierre Pronchery {
635*a3cefe7fSPierre Pronchery pkgconf_list_t unfiltered_list = PKGCONF_LIST_INITIALIZER;
636*a3cefe7fSPierre Pronchery pkgconf_list_t filtered_list = PKGCONF_LIST_INITIALIZER;
637*a3cefe7fSPierre Pronchery int eflag;
638*a3cefe7fSPierre Pronchery char *render_buf;
639*a3cefe7fSPierre Pronchery (void) unused;
640*a3cefe7fSPierre Pronchery
641*a3cefe7fSPierre Pronchery eflag = pkgconf_pkg_libs(client, world, &unfiltered_list, maxdepth);
642*a3cefe7fSPierre Pronchery if (eflag != PKGCONF_PKG_ERRF_OK)
643*a3cefe7fSPierre Pronchery return false;
644*a3cefe7fSPierre Pronchery
645*a3cefe7fSPierre Pronchery pkgconf_fragment_filter(client, &filtered_list, &unfiltered_list, filter_libs, NULL);
646*a3cefe7fSPierre Pronchery
647*a3cefe7fSPierre Pronchery if (filtered_list.head == NULL)
648*a3cefe7fSPierre Pronchery goto out;
649*a3cefe7fSPierre Pronchery
650*a3cefe7fSPierre Pronchery render_buf = pkgconf_fragment_render(&filtered_list, true, want_render_ops);
651*a3cefe7fSPierre Pronchery printf("%s", render_buf);
652*a3cefe7fSPierre Pronchery free(render_buf);
653*a3cefe7fSPierre Pronchery
654*a3cefe7fSPierre Pronchery out:
655*a3cefe7fSPierre Pronchery pkgconf_fragment_free(&unfiltered_list);
656*a3cefe7fSPierre Pronchery pkgconf_fragment_free(&filtered_list);
657*a3cefe7fSPierre Pronchery
658*a3cefe7fSPierre Pronchery return true;
659*a3cefe7fSPierre Pronchery }
660*a3cefe7fSPierre Pronchery
661*a3cefe7fSPierre Pronchery static bool
apply_requires(pkgconf_client_t * client,pkgconf_pkg_t * world,void * unused,int maxdepth)662*a3cefe7fSPierre Pronchery apply_requires(pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth)
663*a3cefe7fSPierre Pronchery {
664*a3cefe7fSPierre Pronchery pkgconf_node_t *iter;
665*a3cefe7fSPierre Pronchery (void) client;
666*a3cefe7fSPierre Pronchery (void) unused;
667*a3cefe7fSPierre Pronchery (void) maxdepth;
668*a3cefe7fSPierre Pronchery
669*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(world->required.head, iter)
670*a3cefe7fSPierre Pronchery {
671*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = iter->data;
672*a3cefe7fSPierre Pronchery pkgconf_pkg_t *pkg = dep->match;
673*a3cefe7fSPierre Pronchery
674*a3cefe7fSPierre Pronchery print_requires(pkg);
675*a3cefe7fSPierre Pronchery }
676*a3cefe7fSPierre Pronchery
677*a3cefe7fSPierre Pronchery return true;
678*a3cefe7fSPierre Pronchery }
679*a3cefe7fSPierre Pronchery
680*a3cefe7fSPierre Pronchery static bool
apply_requires_private(pkgconf_client_t * client,pkgconf_pkg_t * world,void * unused,int maxdepth)681*a3cefe7fSPierre Pronchery apply_requires_private(pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth)
682*a3cefe7fSPierre Pronchery {
683*a3cefe7fSPierre Pronchery pkgconf_node_t *iter;
684*a3cefe7fSPierre Pronchery (void) client;
685*a3cefe7fSPierre Pronchery (void) unused;
686*a3cefe7fSPierre Pronchery (void) maxdepth;
687*a3cefe7fSPierre Pronchery
688*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(world->required.head, iter)
689*a3cefe7fSPierre Pronchery {
690*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = iter->data;
691*a3cefe7fSPierre Pronchery pkgconf_pkg_t *pkg = dep->match;
692*a3cefe7fSPierre Pronchery
693*a3cefe7fSPierre Pronchery print_requires_private(pkg);
694*a3cefe7fSPierre Pronchery }
695*a3cefe7fSPierre Pronchery return true;
696*a3cefe7fSPierre Pronchery }
697*a3cefe7fSPierre Pronchery
698*a3cefe7fSPierre Pronchery static void
check_uninstalled(pkgconf_client_t * client,pkgconf_pkg_t * pkg,void * data)699*a3cefe7fSPierre Pronchery check_uninstalled(pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *data)
700*a3cefe7fSPierre Pronchery {
701*a3cefe7fSPierre Pronchery int *retval = data;
702*a3cefe7fSPierre Pronchery (void) client;
703*a3cefe7fSPierre Pronchery
704*a3cefe7fSPierre Pronchery if (pkg->flags & PKGCONF_PKG_PROPF_UNINSTALLED)
705*a3cefe7fSPierre Pronchery *retval = EXIT_SUCCESS;
706*a3cefe7fSPierre Pronchery }
707*a3cefe7fSPierre Pronchery
708*a3cefe7fSPierre Pronchery static bool
apply_uninstalled(pkgconf_client_t * client,pkgconf_pkg_t * world,void * data,int maxdepth)709*a3cefe7fSPierre Pronchery apply_uninstalled(pkgconf_client_t *client, pkgconf_pkg_t *world, void *data, int maxdepth)
710*a3cefe7fSPierre Pronchery {
711*a3cefe7fSPierre Pronchery int eflag;
712*a3cefe7fSPierre Pronchery
713*a3cefe7fSPierre Pronchery eflag = pkgconf_pkg_traverse(client, world, check_uninstalled, data, maxdepth, 0);
714*a3cefe7fSPierre Pronchery
715*a3cefe7fSPierre Pronchery if (eflag != PKGCONF_PKG_ERRF_OK)
716*a3cefe7fSPierre Pronchery return false;
717*a3cefe7fSPierre Pronchery
718*a3cefe7fSPierre Pronchery return true;
719*a3cefe7fSPierre Pronchery }
720*a3cefe7fSPierre Pronchery
721*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
722*a3cefe7fSPierre Pronchery static void
print_graph_node(pkgconf_client_t * client,pkgconf_pkg_t * pkg,void * data)723*a3cefe7fSPierre Pronchery print_graph_node(pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *data)
724*a3cefe7fSPierre Pronchery {
725*a3cefe7fSPierre Pronchery pkgconf_node_t *n;
726*a3cefe7fSPierre Pronchery
727*a3cefe7fSPierre Pronchery (void) client;
728*a3cefe7fSPierre Pronchery (void) data;
729*a3cefe7fSPierre Pronchery
730*a3cefe7fSPierre Pronchery printf("node '%s' {\n", pkg->id);
731*a3cefe7fSPierre Pronchery
732*a3cefe7fSPierre Pronchery if (pkg->version != NULL)
733*a3cefe7fSPierre Pronchery printf(" version = '%s';\n", pkg->version);
734*a3cefe7fSPierre Pronchery
735*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(pkg->required.head, n)
736*a3cefe7fSPierre Pronchery {
737*a3cefe7fSPierre Pronchery pkgconf_dependency_t *dep = n->data;
738*a3cefe7fSPierre Pronchery printf(" dependency '%s'", dep->package);
739*a3cefe7fSPierre Pronchery if (dep->compare != PKGCONF_CMP_ANY)
740*a3cefe7fSPierre Pronchery {
741*a3cefe7fSPierre Pronchery printf(" {\n");
742*a3cefe7fSPierre Pronchery printf(" comparator = '%s';\n", pkgconf_pkg_get_comparator(dep));
743*a3cefe7fSPierre Pronchery printf(" version = '%s';\n", dep->version);
744*a3cefe7fSPierre Pronchery printf(" };\n");
745*a3cefe7fSPierre Pronchery }
746*a3cefe7fSPierre Pronchery else
747*a3cefe7fSPierre Pronchery printf(";\n");
748*a3cefe7fSPierre Pronchery }
749*a3cefe7fSPierre Pronchery
750*a3cefe7fSPierre Pronchery printf("};\n");
751*a3cefe7fSPierre Pronchery }
752*a3cefe7fSPierre Pronchery
753*a3cefe7fSPierre Pronchery static bool
apply_simulate(pkgconf_client_t * client,pkgconf_pkg_t * world,void * data,int maxdepth)754*a3cefe7fSPierre Pronchery apply_simulate(pkgconf_client_t *client, pkgconf_pkg_t *world, void *data, int maxdepth)
755*a3cefe7fSPierre Pronchery {
756*a3cefe7fSPierre Pronchery int eflag;
757*a3cefe7fSPierre Pronchery
758*a3cefe7fSPierre Pronchery eflag = pkgconf_pkg_traverse(client, world, print_graph_node, data, maxdepth, 0);
759*a3cefe7fSPierre Pronchery
760*a3cefe7fSPierre Pronchery if (eflag != PKGCONF_PKG_ERRF_OK)
761*a3cefe7fSPierre Pronchery return false;
762*a3cefe7fSPierre Pronchery
763*a3cefe7fSPierre Pronchery return true;
764*a3cefe7fSPierre Pronchery }
765*a3cefe7fSPierre Pronchery #endif
766*a3cefe7fSPierre Pronchery
767*a3cefe7fSPierre Pronchery static void
print_fragment_tree_branch(pkgconf_list_t * fragment_list,int indent)768*a3cefe7fSPierre Pronchery print_fragment_tree_branch(pkgconf_list_t *fragment_list, int indent)
769*a3cefe7fSPierre Pronchery {
770*a3cefe7fSPierre Pronchery pkgconf_node_t *iter;
771*a3cefe7fSPierre Pronchery
772*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(fragment_list->head, iter)
773*a3cefe7fSPierre Pronchery {
774*a3cefe7fSPierre Pronchery pkgconf_fragment_t *frag = iter->data;
775*a3cefe7fSPierre Pronchery
776*a3cefe7fSPierre Pronchery if (frag->type)
777*a3cefe7fSPierre Pronchery printf("%*s'-%c%s' [type %c]\n", indent, "", frag->type, frag->data, frag->type);
778*a3cefe7fSPierre Pronchery else
779*a3cefe7fSPierre Pronchery printf("%*s'%s' [untyped]\n", indent, "", frag->data);
780*a3cefe7fSPierre Pronchery
781*a3cefe7fSPierre Pronchery print_fragment_tree_branch(&frag->children, indent + 2);
782*a3cefe7fSPierre Pronchery }
783*a3cefe7fSPierre Pronchery
784*a3cefe7fSPierre Pronchery if (fragment_list->head != NULL)
785*a3cefe7fSPierre Pronchery printf("\n");
786*a3cefe7fSPierre Pronchery }
787*a3cefe7fSPierre Pronchery
788*a3cefe7fSPierre Pronchery static bool
apply_fragment_tree(pkgconf_client_t * client,pkgconf_pkg_t * world,void * data,int maxdepth)789*a3cefe7fSPierre Pronchery apply_fragment_tree(pkgconf_client_t *client, pkgconf_pkg_t *world, void *data, int maxdepth)
790*a3cefe7fSPierre Pronchery {
791*a3cefe7fSPierre Pronchery pkgconf_list_t unfiltered_list = PKGCONF_LIST_INITIALIZER;
792*a3cefe7fSPierre Pronchery int eflag;
793*a3cefe7fSPierre Pronchery
794*a3cefe7fSPierre Pronchery (void) data;
795*a3cefe7fSPierre Pronchery
796*a3cefe7fSPierre Pronchery eflag = pkgconf_pkg_cflags(client, world, &unfiltered_list, maxdepth);
797*a3cefe7fSPierre Pronchery if (eflag != PKGCONF_PKG_ERRF_OK)
798*a3cefe7fSPierre Pronchery return false;
799*a3cefe7fSPierre Pronchery
800*a3cefe7fSPierre Pronchery eflag = pkgconf_pkg_libs(client, world, &unfiltered_list, maxdepth);
801*a3cefe7fSPierre Pronchery if (eflag != PKGCONF_PKG_ERRF_OK)
802*a3cefe7fSPierre Pronchery return false;
803*a3cefe7fSPierre Pronchery
804*a3cefe7fSPierre Pronchery print_fragment_tree_branch(&unfiltered_list, 0);
805*a3cefe7fSPierre Pronchery pkgconf_fragment_free(&unfiltered_list);
806*a3cefe7fSPierre Pronchery
807*a3cefe7fSPierre Pronchery return true;
808*a3cefe7fSPierre Pronchery }
809*a3cefe7fSPierre Pronchery
810*a3cefe7fSPierre Pronchery static void
print_license(pkgconf_client_t * client,pkgconf_pkg_t * pkg,void * data)811*a3cefe7fSPierre Pronchery print_license(pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *data)
812*a3cefe7fSPierre Pronchery {
813*a3cefe7fSPierre Pronchery (void) client;
814*a3cefe7fSPierre Pronchery (void) data;
815*a3cefe7fSPierre Pronchery
816*a3cefe7fSPierre Pronchery if (pkg->flags & PKGCONF_PKG_PROPF_VIRTUAL)
817*a3cefe7fSPierre Pronchery return;
818*a3cefe7fSPierre Pronchery
819*a3cefe7fSPierre Pronchery /* NOASSERTION is the default when the license is unknown, per SPDX spec § 3.15 */
820*a3cefe7fSPierre Pronchery printf("%s: %s\n", pkg->id, pkg->license != NULL ? pkg->license : "NOASSERTION");
821*a3cefe7fSPierre Pronchery }
822*a3cefe7fSPierre Pronchery
823*a3cefe7fSPierre Pronchery static bool
apply_license(pkgconf_client_t * client,pkgconf_pkg_t * world,void * data,int maxdepth)824*a3cefe7fSPierre Pronchery apply_license(pkgconf_client_t *client, pkgconf_pkg_t *world, void *data, int maxdepth)
825*a3cefe7fSPierre Pronchery {
826*a3cefe7fSPierre Pronchery int eflag;
827*a3cefe7fSPierre Pronchery
828*a3cefe7fSPierre Pronchery eflag = pkgconf_pkg_traverse(client, world, print_license, data, maxdepth, 0);
829*a3cefe7fSPierre Pronchery
830*a3cefe7fSPierre Pronchery if (eflag != PKGCONF_PKG_ERRF_OK)
831*a3cefe7fSPierre Pronchery return false;
832*a3cefe7fSPierre Pronchery
833*a3cefe7fSPierre Pronchery return true;
834*a3cefe7fSPierre Pronchery }
835*a3cefe7fSPierre Pronchery
836*a3cefe7fSPierre Pronchery static void
version(void)837*a3cefe7fSPierre Pronchery version(void)
838*a3cefe7fSPierre Pronchery {
839*a3cefe7fSPierre Pronchery printf("%s\n", PACKAGE_VERSION);
840*a3cefe7fSPierre Pronchery }
841*a3cefe7fSPierre Pronchery
842*a3cefe7fSPierre Pronchery static void
about(void)843*a3cefe7fSPierre Pronchery about(void)
844*a3cefe7fSPierre Pronchery {
845*a3cefe7fSPierre Pronchery printf("%s %s\n", PACKAGE_NAME, PACKAGE_VERSION);
846*a3cefe7fSPierre Pronchery printf("Copyright (c) 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021\n");
847*a3cefe7fSPierre Pronchery printf(" pkgconf authors (see AUTHORS in documentation directory).\n\n");
848*a3cefe7fSPierre Pronchery printf("Permission to use, copy, modify, and/or distribute this software for any\n");
849*a3cefe7fSPierre Pronchery printf("purpose with or without fee is hereby granted, provided that the above\n");
850*a3cefe7fSPierre Pronchery printf("copyright notice and this permission notice appear in all copies.\n\n");
851*a3cefe7fSPierre Pronchery printf("This software is provided 'as is' and without any warranty, express or\n");
852*a3cefe7fSPierre Pronchery printf("implied. In no event shall the authors be liable for any damages arising\n");
853*a3cefe7fSPierre Pronchery printf("from the use of this software.\n\n");
854*a3cefe7fSPierre Pronchery printf("Report bugs at <%s>.\n", PACKAGE_BUGREPORT);
855*a3cefe7fSPierre Pronchery }
856*a3cefe7fSPierre Pronchery
857*a3cefe7fSPierre Pronchery static void
usage(void)858*a3cefe7fSPierre Pronchery usage(void)
859*a3cefe7fSPierre Pronchery {
860*a3cefe7fSPierre Pronchery printf("usage: %s [OPTIONS] [LIBRARIES]\n", PACKAGE_NAME);
861*a3cefe7fSPierre Pronchery
862*a3cefe7fSPierre Pronchery printf("\nbasic options:\n\n");
863*a3cefe7fSPierre Pronchery
864*a3cefe7fSPierre Pronchery printf(" --help this message\n");
865*a3cefe7fSPierre Pronchery printf(" --about print pkgconf version and license to stdout\n");
866*a3cefe7fSPierre Pronchery printf(" --version print supported pkg-config version to stdout\n");
867*a3cefe7fSPierre Pronchery printf(" --verbose print additional information\n");
868*a3cefe7fSPierre Pronchery printf(" --atleast-pkgconfig-version check whether or not pkgconf is compatible\n");
869*a3cefe7fSPierre Pronchery printf(" with a specified pkg-config version\n");
870*a3cefe7fSPierre Pronchery printf(" --errors-to-stdout print all errors on stdout instead of stderr\n");
871*a3cefe7fSPierre Pronchery printf(" --print-errors ensure all errors are printed\n");
872*a3cefe7fSPierre Pronchery printf(" --short-errors be less verbose about some errors\n");
873*a3cefe7fSPierre Pronchery printf(" --silence-errors explicitly be silent about errors\n");
874*a3cefe7fSPierre Pronchery printf(" --list-all list all known packages\n");
875*a3cefe7fSPierre Pronchery printf(" --list-package-names list all known package names\n");
876*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
877*a3cefe7fSPierre Pronchery printf(" --simulate simulate walking the calculated dependency graph\n");
878*a3cefe7fSPierre Pronchery #endif
879*a3cefe7fSPierre Pronchery printf(" --no-cache do not cache already seen packages when\n");
880*a3cefe7fSPierre Pronchery printf(" walking the dependency graph\n");
881*a3cefe7fSPierre Pronchery printf(" --log-file=filename write an audit log to a specified file\n");
882*a3cefe7fSPierre Pronchery printf(" --with-path=path adds a directory to the search path\n");
883*a3cefe7fSPierre Pronchery printf(" --define-prefix override the prefix variable with one that is guessed based on\n");
884*a3cefe7fSPierre Pronchery printf(" the location of the .pc file\n");
885*a3cefe7fSPierre Pronchery printf(" --dont-define-prefix do not override the prefix variable under any circumstances\n");
886*a3cefe7fSPierre Pronchery printf(" --prefix-variable=varname sets the name of the variable that pkgconf considers\n");
887*a3cefe7fSPierre Pronchery printf(" to be the package prefix\n");
888*a3cefe7fSPierre Pronchery printf(" --relocate=path relocates a path and exits (mostly for testsuite)\n");
889*a3cefe7fSPierre Pronchery printf(" --dont-relocate-paths disables path relocation support\n");
890*a3cefe7fSPierre Pronchery
891*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
892*a3cefe7fSPierre Pronchery printf("\ncross-compilation personality support:\n\n");
893*a3cefe7fSPierre Pronchery printf(" --personality=triplet|filename sets the personality to 'triplet' or a file named 'filename'\n");
894*a3cefe7fSPierre Pronchery printf(" --dump-personality dumps details concerning selected personality\n");
895*a3cefe7fSPierre Pronchery #endif
896*a3cefe7fSPierre Pronchery
897*a3cefe7fSPierre Pronchery printf("\nchecking specific pkg-config database entries:\n\n");
898*a3cefe7fSPierre Pronchery
899*a3cefe7fSPierre Pronchery printf(" --atleast-version require a specific version of a module\n");
900*a3cefe7fSPierre Pronchery printf(" --exact-version require an exact version of a module\n");
901*a3cefe7fSPierre Pronchery printf(" --max-version require a maximum version of a module\n");
902*a3cefe7fSPierre Pronchery printf(" --exists check whether or not a module exists\n");
903*a3cefe7fSPierre Pronchery printf(" --uninstalled check whether or not an uninstalled module will be used\n");
904*a3cefe7fSPierre Pronchery printf(" --no-uninstalled never use uninstalled modules when satisfying dependencies\n");
905*a3cefe7fSPierre Pronchery printf(" --no-provides do not use 'provides' rules to resolve dependencies\n");
906*a3cefe7fSPierre Pronchery printf(" --maximum-traverse-depth maximum allowed depth for dependency graph\n");
907*a3cefe7fSPierre Pronchery printf(" --static be more aggressive when computing dependency graph\n");
908*a3cefe7fSPierre Pronchery printf(" (for static linking)\n");
909*a3cefe7fSPierre Pronchery printf(" --shared use a simplified dependency graph (usually default)\n");
910*a3cefe7fSPierre Pronchery printf(" --pure optimize a static dependency graph as if it were a normal\n");
911*a3cefe7fSPierre Pronchery printf(" dependency graph\n");
912*a3cefe7fSPierre Pronchery printf(" --env-only look only for package entries in PKG_CONFIG_PATH\n");
913*a3cefe7fSPierre Pronchery printf(" --ignore-conflicts ignore 'conflicts' rules in modules\n");
914*a3cefe7fSPierre Pronchery printf(" --validate validate specific .pc files for correctness\n");
915*a3cefe7fSPierre Pronchery
916*a3cefe7fSPierre Pronchery printf("\nquerying specific pkg-config database fields:\n\n");
917*a3cefe7fSPierre Pronchery
918*a3cefe7fSPierre Pronchery printf(" --define-variable=varname=value define variable 'varname' as 'value'\n");
919*a3cefe7fSPierre Pronchery printf(" --variable=varname print specified variable entry to stdout\n");
920*a3cefe7fSPierre Pronchery printf(" --cflags print required CFLAGS to stdout\n");
921*a3cefe7fSPierre Pronchery printf(" --cflags-only-I print required include-dir CFLAGS to stdout\n");
922*a3cefe7fSPierre Pronchery printf(" --cflags-only-other print required non-include-dir CFLAGS to stdout\n");
923*a3cefe7fSPierre Pronchery printf(" --libs print required linker flags to stdout\n");
924*a3cefe7fSPierre Pronchery printf(" --libs-only-L print required LDPATH linker flags to stdout\n");
925*a3cefe7fSPierre Pronchery printf(" --libs-only-l print required LIBNAME linker flags to stdout\n");
926*a3cefe7fSPierre Pronchery printf(" --libs-only-other print required other linker flags to stdout\n");
927*a3cefe7fSPierre Pronchery printf(" --print-requires print required dependency frameworks to stdout\n");
928*a3cefe7fSPierre Pronchery printf(" --print-requires-private print required dependency frameworks for static\n");
929*a3cefe7fSPierre Pronchery printf(" linking to stdout\n");
930*a3cefe7fSPierre Pronchery printf(" --print-provides print provided dependencies to stdout\n");
931*a3cefe7fSPierre Pronchery printf(" --print-variables print all known variables in module to stdout\n");
932*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
933*a3cefe7fSPierre Pronchery printf(" --digraph print entire dependency graph in graphviz 'dot' format\n");
934*a3cefe7fSPierre Pronchery printf(" --solution print dependency graph solution in a simple format\n");
935*a3cefe7fSPierre Pronchery #endif
936*a3cefe7fSPierre Pronchery printf(" --keep-system-cflags keep -I%s entries in cflags output\n", SYSTEM_INCLUDEDIR);
937*a3cefe7fSPierre Pronchery printf(" --keep-system-libs keep -L%s entries in libs output\n", SYSTEM_LIBDIR);
938*a3cefe7fSPierre Pronchery printf(" --path show the exact filenames for any matching .pc files\n");
939*a3cefe7fSPierre Pronchery printf(" --modversion print the specified module's version to stdout\n");
940*a3cefe7fSPierre Pronchery printf(" --internal-cflags do not filter 'internal' cflags from output\n");
941*a3cefe7fSPierre Pronchery printf(" --license print the specified module's license to stdout if known\n");
942*a3cefe7fSPierre Pronchery printf(" --exists-cflags add -DHAVE_FOO fragments to cflags for each found module\n");
943*a3cefe7fSPierre Pronchery
944*a3cefe7fSPierre Pronchery printf("\nfiltering output:\n\n");
945*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
946*a3cefe7fSPierre Pronchery printf(" --msvc-syntax print translatable fragments in MSVC syntax\n");
947*a3cefe7fSPierre Pronchery #endif
948*a3cefe7fSPierre Pronchery printf(" --fragment-filter=types filter output fragments to the specified types\n");
949*a3cefe7fSPierre Pronchery printf(" --env=prefix print output as shell-compatible environmental variables\n");
950*a3cefe7fSPierre Pronchery printf(" --fragment-tree visualize printed CFLAGS/LIBS fragments as a tree\n");
951*a3cefe7fSPierre Pronchery
952*a3cefe7fSPierre Pronchery printf("\nreport bugs to <%s>.\n", PACKAGE_BUGREPORT);
953*a3cefe7fSPierre Pronchery }
954*a3cefe7fSPierre Pronchery
955*a3cefe7fSPierre Pronchery static void
relocate_path(const char * path)956*a3cefe7fSPierre Pronchery relocate_path(const char *path)
957*a3cefe7fSPierre Pronchery {
958*a3cefe7fSPierre Pronchery char buf[PKGCONF_BUFSIZE];
959*a3cefe7fSPierre Pronchery
960*a3cefe7fSPierre Pronchery pkgconf_strlcpy(buf, path, sizeof buf);
961*a3cefe7fSPierre Pronchery pkgconf_path_relocate(buf, sizeof buf);
962*a3cefe7fSPierre Pronchery
963*a3cefe7fSPierre Pronchery printf("%s\n", buf);
964*a3cefe7fSPierre Pronchery }
965*a3cefe7fSPierre Pronchery
966*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
967*a3cefe7fSPierre Pronchery static void
dump_personality(const pkgconf_cross_personality_t * p)968*a3cefe7fSPierre Pronchery dump_personality(const pkgconf_cross_personality_t *p)
969*a3cefe7fSPierre Pronchery {
970*a3cefe7fSPierre Pronchery pkgconf_node_t *n;
971*a3cefe7fSPierre Pronchery
972*a3cefe7fSPierre Pronchery printf("Triplet: %s\n", p->name);
973*a3cefe7fSPierre Pronchery
974*a3cefe7fSPierre Pronchery if (p->sysroot_dir)
975*a3cefe7fSPierre Pronchery printf("SysrootDir: %s\n", p->sysroot_dir);
976*a3cefe7fSPierre Pronchery
977*a3cefe7fSPierre Pronchery printf("DefaultSearchPaths: ");
978*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(p->dir_list.head, n)
979*a3cefe7fSPierre Pronchery {
980*a3cefe7fSPierre Pronchery pkgconf_path_t *pn = n->data;
981*a3cefe7fSPierre Pronchery printf("%s ", pn->path);
982*a3cefe7fSPierre Pronchery }
983*a3cefe7fSPierre Pronchery
984*a3cefe7fSPierre Pronchery printf("\n");
985*a3cefe7fSPierre Pronchery printf("SystemIncludePaths: ");
986*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(p->filter_includedirs.head, n)
987*a3cefe7fSPierre Pronchery {
988*a3cefe7fSPierre Pronchery pkgconf_path_t *pn = n->data;
989*a3cefe7fSPierre Pronchery printf("%s ", pn->path);
990*a3cefe7fSPierre Pronchery }
991*a3cefe7fSPierre Pronchery
992*a3cefe7fSPierre Pronchery printf("\n");
993*a3cefe7fSPierre Pronchery printf("SystemLibraryPaths: ");
994*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(p->filter_libdirs.head, n)
995*a3cefe7fSPierre Pronchery {
996*a3cefe7fSPierre Pronchery pkgconf_path_t *pn = n->data;
997*a3cefe7fSPierre Pronchery printf("%s ", pn->path);
998*a3cefe7fSPierre Pronchery }
999*a3cefe7fSPierre Pronchery
1000*a3cefe7fSPierre Pronchery printf("\n");
1001*a3cefe7fSPierre Pronchery }
1002*a3cefe7fSPierre Pronchery
1003*a3cefe7fSPierre Pronchery static pkgconf_cross_personality_t *
deduce_personality(char * argv[])1004*a3cefe7fSPierre Pronchery deduce_personality(char *argv[])
1005*a3cefe7fSPierre Pronchery {
1006*a3cefe7fSPierre Pronchery const char *argv0 = argv[0];
1007*a3cefe7fSPierre Pronchery char *i, *prefix;
1008*a3cefe7fSPierre Pronchery pkgconf_cross_personality_t *out;
1009*a3cefe7fSPierre Pronchery
1010*a3cefe7fSPierre Pronchery i = strrchr(argv0, '/');
1011*a3cefe7fSPierre Pronchery if (i != NULL)
1012*a3cefe7fSPierre Pronchery argv0 = i + 1;
1013*a3cefe7fSPierre Pronchery
1014*a3cefe7fSPierre Pronchery #if defined(_WIN32) || defined(_WIN64)
1015*a3cefe7fSPierre Pronchery i = strrchr(argv0, '\\');
1016*a3cefe7fSPierre Pronchery if (i != NULL)
1017*a3cefe7fSPierre Pronchery argv0 = i + 1;
1018*a3cefe7fSPierre Pronchery #endif
1019*a3cefe7fSPierre Pronchery
1020*a3cefe7fSPierre Pronchery i = strstr(argv0, "-pkg");
1021*a3cefe7fSPierre Pronchery if (i == NULL)
1022*a3cefe7fSPierre Pronchery return pkgconf_cross_personality_default();
1023*a3cefe7fSPierre Pronchery
1024*a3cefe7fSPierre Pronchery prefix = pkgconf_strndup(argv0, i - argv0);
1025*a3cefe7fSPierre Pronchery out = pkgconf_cross_personality_find(prefix);
1026*a3cefe7fSPierre Pronchery free(prefix);
1027*a3cefe7fSPierre Pronchery if (out == NULL)
1028*a3cefe7fSPierre Pronchery return pkgconf_cross_personality_default();
1029*a3cefe7fSPierre Pronchery
1030*a3cefe7fSPierre Pronchery return out;
1031*a3cefe7fSPierre Pronchery }
1032*a3cefe7fSPierre Pronchery #endif
1033*a3cefe7fSPierre Pronchery
1034*a3cefe7fSPierre Pronchery static void
unveil_handler(const pkgconf_client_t * client,const char * path,const char * permissions)1035*a3cefe7fSPierre Pronchery unveil_handler(const pkgconf_client_t *client, const char *path, const char *permissions)
1036*a3cefe7fSPierre Pronchery {
1037*a3cefe7fSPierre Pronchery (void) client;
1038*a3cefe7fSPierre Pronchery
1039*a3cefe7fSPierre Pronchery if (pkgconf_unveil(path, permissions) == -1)
1040*a3cefe7fSPierre Pronchery {
1041*a3cefe7fSPierre Pronchery fprintf(stderr, "pkgconf: unveil failed: %s\n", strerror(errno));
1042*a3cefe7fSPierre Pronchery exit(EXIT_FAILURE);
1043*a3cefe7fSPierre Pronchery }
1044*a3cefe7fSPierre Pronchery }
1045*a3cefe7fSPierre Pronchery
1046*a3cefe7fSPierre Pronchery static bool
unveil_search_paths(const pkgconf_client_t * client,const pkgconf_cross_personality_t * personality)1047*a3cefe7fSPierre Pronchery unveil_search_paths(const pkgconf_client_t *client, const pkgconf_cross_personality_t *personality)
1048*a3cefe7fSPierre Pronchery {
1049*a3cefe7fSPierre Pronchery pkgconf_node_t *n;
1050*a3cefe7fSPierre Pronchery
1051*a3cefe7fSPierre Pronchery if (pkgconf_unveil("/dev/null", "rwc") == -1)
1052*a3cefe7fSPierre Pronchery return false;
1053*a3cefe7fSPierre Pronchery
1054*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(client->dir_list.head, n)
1055*a3cefe7fSPierre Pronchery {
1056*a3cefe7fSPierre Pronchery pkgconf_path_t *pn = n->data;
1057*a3cefe7fSPierre Pronchery
1058*a3cefe7fSPierre Pronchery if (pkgconf_unveil(pn->path, "r") == -1)
1059*a3cefe7fSPierre Pronchery return false;
1060*a3cefe7fSPierre Pronchery }
1061*a3cefe7fSPierre Pronchery
1062*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(personality->dir_list.head, n)
1063*a3cefe7fSPierre Pronchery {
1064*a3cefe7fSPierre Pronchery pkgconf_path_t *pn = n->data;
1065*a3cefe7fSPierre Pronchery
1066*a3cefe7fSPierre Pronchery if (pkgconf_unveil(pn->path, "r") == -1)
1067*a3cefe7fSPierre Pronchery return false;
1068*a3cefe7fSPierre Pronchery }
1069*a3cefe7fSPierre Pronchery
1070*a3cefe7fSPierre Pronchery pkgconf_client_set_unveil_handler(&pkg_client, unveil_handler);
1071*a3cefe7fSPierre Pronchery
1072*a3cefe7fSPierre Pronchery return true;
1073*a3cefe7fSPierre Pronchery }
1074*a3cefe7fSPierre Pronchery
1075*a3cefe7fSPierre Pronchery int
main(int argc,char * argv[])1076*a3cefe7fSPierre Pronchery main(int argc, char *argv[])
1077*a3cefe7fSPierre Pronchery {
1078*a3cefe7fSPierre Pronchery int ret;
1079*a3cefe7fSPierre Pronchery pkgconf_list_t pkgq = PKGCONF_LIST_INITIALIZER;
1080*a3cefe7fSPierre Pronchery pkgconf_list_t dir_list = PKGCONF_LIST_INITIALIZER;
1081*a3cefe7fSPierre Pronchery char *builddir;
1082*a3cefe7fSPierre Pronchery char *sysroot_dir;
1083*a3cefe7fSPierre Pronchery char *env_traverse_depth;
1084*a3cefe7fSPierre Pronchery char *required_pkgconfig_version = NULL;
1085*a3cefe7fSPierre Pronchery char *required_exact_module_version = NULL;
1086*a3cefe7fSPierre Pronchery char *required_max_module_version = NULL;
1087*a3cefe7fSPierre Pronchery char *required_module_version = NULL;
1088*a3cefe7fSPierre Pronchery char *logfile_arg = NULL;
1089*a3cefe7fSPierre Pronchery char *want_env_prefix = NULL;
1090*a3cefe7fSPierre Pronchery unsigned int want_client_flags = PKGCONF_PKG_PKGF_NONE;
1091*a3cefe7fSPierre Pronchery pkgconf_cross_personality_t *personality = NULL;
1092*a3cefe7fSPierre Pronchery bool opened_error_msgout = false;
1093*a3cefe7fSPierre Pronchery pkgconf_pkg_t world = {
1094*a3cefe7fSPierre Pronchery .id = "virtual:world",
1095*a3cefe7fSPierre Pronchery .realname = "virtual world package",
1096*a3cefe7fSPierre Pronchery .flags = PKGCONF_PKG_PROPF_STATIC | PKGCONF_PKG_PROPF_VIRTUAL,
1097*a3cefe7fSPierre Pronchery };
1098*a3cefe7fSPierre Pronchery
1099*a3cefe7fSPierre Pronchery if (pkgconf_pledge("stdio rpath wpath cpath unveil", NULL) == -1)
1100*a3cefe7fSPierre Pronchery {
1101*a3cefe7fSPierre Pronchery fprintf(stderr, "pkgconf: pledge failed: %s\n", strerror(errno));
1102*a3cefe7fSPierre Pronchery return EXIT_FAILURE;
1103*a3cefe7fSPierre Pronchery }
1104*a3cefe7fSPierre Pronchery
1105*a3cefe7fSPierre Pronchery want_flags = 0;
1106*a3cefe7fSPierre Pronchery
1107*a3cefe7fSPierre Pronchery #ifdef _WIN32
1108*a3cefe7fSPierre Pronchery /* When running regression tests in cygwin, and building native
1109*a3cefe7fSPierre Pronchery * executable, tests fail unless native executable outputs unix
1110*a3cefe7fSPierre Pronchery * line endings. Come to think of it, this will probably help
1111*a3cefe7fSPierre Pronchery * real people who use cygwin build environments but native pkgconf, too.
1112*a3cefe7fSPierre Pronchery */
1113*a3cefe7fSPierre Pronchery _setmode(fileno(stdout), O_BINARY);
1114*a3cefe7fSPierre Pronchery _setmode(fileno(stderr), O_BINARY);
1115*a3cefe7fSPierre Pronchery #endif
1116*a3cefe7fSPierre Pronchery
1117*a3cefe7fSPierre Pronchery struct pkg_option options[] = {
1118*a3cefe7fSPierre Pronchery { "version", no_argument, &want_flags, PKG_VERSION|PKG_PRINT_ERRORS, },
1119*a3cefe7fSPierre Pronchery { "about", no_argument, &want_flags, PKG_ABOUT|PKG_PRINT_ERRORS, },
1120*a3cefe7fSPierre Pronchery { "atleast-version", required_argument, NULL, 2, },
1121*a3cefe7fSPierre Pronchery { "atleast-pkgconfig-version", required_argument, NULL, 3, },
1122*a3cefe7fSPierre Pronchery { "libs", no_argument, &want_flags, PKG_LIBS|PKG_PRINT_ERRORS, },
1123*a3cefe7fSPierre Pronchery { "cflags", no_argument, &want_flags, PKG_CFLAGS|PKG_PRINT_ERRORS, },
1124*a3cefe7fSPierre Pronchery { "modversion", no_argument, &want_flags, PKG_MODVERSION|PKG_PRINT_ERRORS, },
1125*a3cefe7fSPierre Pronchery { "variable", required_argument, NULL, 7, },
1126*a3cefe7fSPierre Pronchery { "exists", no_argument, &want_flags, PKG_EXISTS, },
1127*a3cefe7fSPierre Pronchery { "print-errors", no_argument, &want_flags, PKG_PRINT_ERRORS, },
1128*a3cefe7fSPierre Pronchery { "short-errors", no_argument, &want_flags, PKG_SHORT_ERRORS, },
1129*a3cefe7fSPierre Pronchery { "maximum-traverse-depth", required_argument, NULL, 11, },
1130*a3cefe7fSPierre Pronchery { "static", no_argument, &want_flags, PKG_STATIC, },
1131*a3cefe7fSPierre Pronchery { "shared", no_argument, &want_flags, PKG_SHARED, },
1132*a3cefe7fSPierre Pronchery { "pure", no_argument, &want_flags, PKG_PURE, },
1133*a3cefe7fSPierre Pronchery { "print-requires", no_argument, &want_flags, PKG_REQUIRES, },
1134*a3cefe7fSPierre Pronchery { "print-variables", no_argument, &want_flags, PKG_VARIABLES|PKG_PRINT_ERRORS, },
1135*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
1136*a3cefe7fSPierre Pronchery { "digraph", no_argument, &want_flags, PKG_DIGRAPH, },
1137*a3cefe7fSPierre Pronchery { "solution", no_argument, &want_flags, PKG_SOLUTION, },
1138*a3cefe7fSPierre Pronchery #endif
1139*a3cefe7fSPierre Pronchery { "help", no_argument, &want_flags, PKG_HELP, },
1140*a3cefe7fSPierre Pronchery { "env-only", no_argument, &want_flags, PKG_ENV_ONLY, },
1141*a3cefe7fSPierre Pronchery { "print-requires-private", no_argument, &want_flags, PKG_REQUIRES_PRIVATE, },
1142*a3cefe7fSPierre Pronchery { "cflags-only-I", no_argument, &want_flags, PKG_CFLAGS_ONLY_I|PKG_PRINT_ERRORS, },
1143*a3cefe7fSPierre Pronchery { "cflags-only-other", no_argument, &want_flags, PKG_CFLAGS_ONLY_OTHER|PKG_PRINT_ERRORS, },
1144*a3cefe7fSPierre Pronchery { "libs-only-L", no_argument, &want_flags, PKG_LIBS_ONLY_LDPATH|PKG_PRINT_ERRORS, },
1145*a3cefe7fSPierre Pronchery { "libs-only-l", no_argument, &want_flags, PKG_LIBS_ONLY_LIBNAME|PKG_PRINT_ERRORS, },
1146*a3cefe7fSPierre Pronchery { "libs-only-other", no_argument, &want_flags, PKG_LIBS_ONLY_OTHER|PKG_PRINT_ERRORS, },
1147*a3cefe7fSPierre Pronchery { "uninstalled", no_argument, &want_flags, PKG_UNINSTALLED, },
1148*a3cefe7fSPierre Pronchery { "no-uninstalled", no_argument, &want_flags, PKG_NO_UNINSTALLED, },
1149*a3cefe7fSPierre Pronchery { "keep-system-cflags", no_argument, &want_flags, PKG_KEEP_SYSTEM_CFLAGS, },
1150*a3cefe7fSPierre Pronchery { "keep-system-libs", no_argument, &want_flags, PKG_KEEP_SYSTEM_LIBS, },
1151*a3cefe7fSPierre Pronchery { "define-variable", required_argument, NULL, 27, },
1152*a3cefe7fSPierre Pronchery { "exact-version", required_argument, NULL, 28, },
1153*a3cefe7fSPierre Pronchery { "max-version", required_argument, NULL, 29, },
1154*a3cefe7fSPierre Pronchery { "ignore-conflicts", no_argument, &want_flags, PKG_IGNORE_CONFLICTS, },
1155*a3cefe7fSPierre Pronchery { "errors-to-stdout", no_argument, &want_flags, PKG_ERRORS_ON_STDOUT, },
1156*a3cefe7fSPierre Pronchery { "silence-errors", no_argument, &want_flags, PKG_SILENCE_ERRORS, },
1157*a3cefe7fSPierre Pronchery { "list-all", no_argument, &want_flags, PKG_LIST|PKG_PRINT_ERRORS, },
1158*a3cefe7fSPierre Pronchery { "list-package-names", no_argument, &want_flags, PKG_LIST_PACKAGE_NAMES|PKG_PRINT_ERRORS, },
1159*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
1160*a3cefe7fSPierre Pronchery { "simulate", no_argument, &want_flags, PKG_SIMULATE, },
1161*a3cefe7fSPierre Pronchery #endif
1162*a3cefe7fSPierre Pronchery { "no-cache", no_argument, &want_flags, PKG_NO_CACHE, },
1163*a3cefe7fSPierre Pronchery { "print-provides", no_argument, &want_flags, PKG_PROVIDES, },
1164*a3cefe7fSPierre Pronchery { "no-provides", no_argument, &want_flags, PKG_NO_PROVIDES, },
1165*a3cefe7fSPierre Pronchery { "debug", no_argument, &want_flags, PKG_DEBUG|PKG_PRINT_ERRORS, },
1166*a3cefe7fSPierre Pronchery { "validate", no_argument, &want_flags, PKG_VALIDATE|PKG_PRINT_ERRORS|PKG_ERRORS_ON_STDOUT },
1167*a3cefe7fSPierre Pronchery { "log-file", required_argument, NULL, 40 },
1168*a3cefe7fSPierre Pronchery { "path", no_argument, &want_flags, PKG_PATH },
1169*a3cefe7fSPierre Pronchery { "with-path", required_argument, NULL, 42 },
1170*a3cefe7fSPierre Pronchery { "prefix-variable", required_argument, NULL, 43 },
1171*a3cefe7fSPierre Pronchery { "define-prefix", no_argument, &want_flags, PKG_DEFINE_PREFIX },
1172*a3cefe7fSPierre Pronchery { "relocate", required_argument, NULL, 45 },
1173*a3cefe7fSPierre Pronchery { "dont-define-prefix", no_argument, &want_flags, PKG_DONT_DEFINE_PREFIX },
1174*a3cefe7fSPierre Pronchery { "dont-relocate-paths", no_argument, &want_flags, PKG_DONT_RELOCATE_PATHS },
1175*a3cefe7fSPierre Pronchery { "env", required_argument, NULL, 48 },
1176*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
1177*a3cefe7fSPierre Pronchery { "msvc-syntax", no_argument, &want_flags, PKG_MSVC_SYNTAX },
1178*a3cefe7fSPierre Pronchery #endif
1179*a3cefe7fSPierre Pronchery { "fragment-filter", required_argument, NULL, 50 },
1180*a3cefe7fSPierre Pronchery { "internal-cflags", no_argument, &want_flags, PKG_INTERNAL_CFLAGS },
1181*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
1182*a3cefe7fSPierre Pronchery { "dump-personality", no_argument, &want_flags, PKG_DUMP_PERSONALITY },
1183*a3cefe7fSPierre Pronchery { "personality", required_argument, NULL, 53 },
1184*a3cefe7fSPierre Pronchery #endif
1185*a3cefe7fSPierre Pronchery { "license", no_argument, &want_flags, PKG_DUMP_LICENSE },
1186*a3cefe7fSPierre Pronchery { "verbose", no_argument, NULL, 55 },
1187*a3cefe7fSPierre Pronchery { "exists-cflags", no_argument, &want_flags, PKG_EXISTS_CFLAGS },
1188*a3cefe7fSPierre Pronchery { "fragment-tree", no_argument, &want_flags, PKG_FRAGMENT_TREE },
1189*a3cefe7fSPierre Pronchery { NULL, 0, NULL, 0 }
1190*a3cefe7fSPierre Pronchery };
1191*a3cefe7fSPierre Pronchery
1192*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
1193*a3cefe7fSPierre Pronchery if (getenv("PKG_CONFIG_EARLY_TRACE"))
1194*a3cefe7fSPierre Pronchery {
1195*a3cefe7fSPierre Pronchery error_msgout = stderr;
1196*a3cefe7fSPierre Pronchery pkgconf_client_set_trace_handler(&pkg_client, error_handler, NULL);
1197*a3cefe7fSPierre Pronchery }
1198*a3cefe7fSPierre Pronchery #endif
1199*a3cefe7fSPierre Pronchery
1200*a3cefe7fSPierre Pronchery while ((ret = pkg_getopt_long_only(argc, argv, "", options, NULL)) != -1)
1201*a3cefe7fSPierre Pronchery {
1202*a3cefe7fSPierre Pronchery switch (ret)
1203*a3cefe7fSPierre Pronchery {
1204*a3cefe7fSPierre Pronchery case 2:
1205*a3cefe7fSPierre Pronchery required_module_version = pkg_optarg;
1206*a3cefe7fSPierre Pronchery break;
1207*a3cefe7fSPierre Pronchery case 3:
1208*a3cefe7fSPierre Pronchery required_pkgconfig_version = pkg_optarg;
1209*a3cefe7fSPierre Pronchery break;
1210*a3cefe7fSPierre Pronchery case 7:
1211*a3cefe7fSPierre Pronchery want_variable = pkg_optarg;
1212*a3cefe7fSPierre Pronchery break;
1213*a3cefe7fSPierre Pronchery case 11:
1214*a3cefe7fSPierre Pronchery maximum_traverse_depth = atoi(pkg_optarg);
1215*a3cefe7fSPierre Pronchery break;
1216*a3cefe7fSPierre Pronchery case 27:
1217*a3cefe7fSPierre Pronchery pkgconf_tuple_define_global(&pkg_client, pkg_optarg);
1218*a3cefe7fSPierre Pronchery break;
1219*a3cefe7fSPierre Pronchery case 28:
1220*a3cefe7fSPierre Pronchery required_exact_module_version = pkg_optarg;
1221*a3cefe7fSPierre Pronchery break;
1222*a3cefe7fSPierre Pronchery case 29:
1223*a3cefe7fSPierre Pronchery required_max_module_version = pkg_optarg;
1224*a3cefe7fSPierre Pronchery break;
1225*a3cefe7fSPierre Pronchery case 40:
1226*a3cefe7fSPierre Pronchery logfile_arg = pkg_optarg;
1227*a3cefe7fSPierre Pronchery break;
1228*a3cefe7fSPierre Pronchery case 42:
1229*a3cefe7fSPierre Pronchery pkgconf_path_prepend(pkg_optarg, &dir_list, true);
1230*a3cefe7fSPierre Pronchery break;
1231*a3cefe7fSPierre Pronchery case 43:
1232*a3cefe7fSPierre Pronchery pkgconf_client_set_prefix_varname(&pkg_client, pkg_optarg);
1233*a3cefe7fSPierre Pronchery break;
1234*a3cefe7fSPierre Pronchery case 45:
1235*a3cefe7fSPierre Pronchery relocate_path(pkg_optarg);
1236*a3cefe7fSPierre Pronchery return EXIT_SUCCESS;
1237*a3cefe7fSPierre Pronchery case 48:
1238*a3cefe7fSPierre Pronchery want_env_prefix = pkg_optarg;
1239*a3cefe7fSPierre Pronchery break;
1240*a3cefe7fSPierre Pronchery case 50:
1241*a3cefe7fSPierre Pronchery want_fragment_filter = pkg_optarg;
1242*a3cefe7fSPierre Pronchery break;
1243*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
1244*a3cefe7fSPierre Pronchery case 53:
1245*a3cefe7fSPierre Pronchery personality = pkgconf_cross_personality_find(pkg_optarg);
1246*a3cefe7fSPierre Pronchery break;
1247*a3cefe7fSPierre Pronchery #endif
1248*a3cefe7fSPierre Pronchery case 55:
1249*a3cefe7fSPierre Pronchery verbosity++;
1250*a3cefe7fSPierre Pronchery break;
1251*a3cefe7fSPierre Pronchery case '?':
1252*a3cefe7fSPierre Pronchery case ':':
1253*a3cefe7fSPierre Pronchery ret = EXIT_FAILURE;
1254*a3cefe7fSPierre Pronchery goto out;
1255*a3cefe7fSPierre Pronchery default:
1256*a3cefe7fSPierre Pronchery break;
1257*a3cefe7fSPierre Pronchery }
1258*a3cefe7fSPierre Pronchery }
1259*a3cefe7fSPierre Pronchery
1260*a3cefe7fSPierre Pronchery if (personality == NULL) {
1261*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
1262*a3cefe7fSPierre Pronchery personality = deduce_personality(argv);
1263*a3cefe7fSPierre Pronchery #else
1264*a3cefe7fSPierre Pronchery personality = pkgconf_cross_personality_default();
1265*a3cefe7fSPierre Pronchery #endif
1266*a3cefe7fSPierre Pronchery }
1267*a3cefe7fSPierre Pronchery
1268*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
1269*a3cefe7fSPierre Pronchery if ((want_flags & PKG_DUMP_PERSONALITY) == PKG_DUMP_PERSONALITY)
1270*a3cefe7fSPierre Pronchery {
1271*a3cefe7fSPierre Pronchery dump_personality(personality);
1272*a3cefe7fSPierre Pronchery return EXIT_SUCCESS;
1273*a3cefe7fSPierre Pronchery }
1274*a3cefe7fSPierre Pronchery #endif
1275*a3cefe7fSPierre Pronchery
1276*a3cefe7fSPierre Pronchery /* now, bring up the client. settings are preserved since the client is prealloced */
1277*a3cefe7fSPierre Pronchery pkgconf_client_init(&pkg_client, error_handler, NULL, personality);
1278*a3cefe7fSPierre Pronchery
1279*a3cefe7fSPierre Pronchery /* unveil the entire search path now that we have loaded the personality data. */
1280*a3cefe7fSPierre Pronchery if (!unveil_search_paths(&pkg_client, personality))
1281*a3cefe7fSPierre Pronchery {
1282*a3cefe7fSPierre Pronchery fprintf(stderr, "pkgconf: unveil failed: %s\n", strerror(errno));
1283*a3cefe7fSPierre Pronchery return EXIT_FAILURE;
1284*a3cefe7fSPierre Pronchery }
1285*a3cefe7fSPierre Pronchery
1286*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
1287*a3cefe7fSPierre Pronchery if ((want_flags & PKG_MSVC_SYNTAX) == PKG_MSVC_SYNTAX || getenv("PKG_CONFIG_MSVC_SYNTAX") != NULL)
1288*a3cefe7fSPierre Pronchery want_render_ops = msvc_renderer_get();
1289*a3cefe7fSPierre Pronchery #endif
1290*a3cefe7fSPierre Pronchery
1291*a3cefe7fSPierre Pronchery if ((env_traverse_depth = getenv("PKG_CONFIG_MAXIMUM_TRAVERSE_DEPTH")) != NULL)
1292*a3cefe7fSPierre Pronchery maximum_traverse_depth = atoi(env_traverse_depth);
1293*a3cefe7fSPierre Pronchery
1294*a3cefe7fSPierre Pronchery if ((want_flags & PKG_PRINT_ERRORS) != PKG_PRINT_ERRORS)
1295*a3cefe7fSPierre Pronchery want_flags |= (PKG_SILENCE_ERRORS);
1296*a3cefe7fSPierre Pronchery
1297*a3cefe7fSPierre Pronchery if ((want_flags & PKG_SILENCE_ERRORS) == PKG_SILENCE_ERRORS && !getenv("PKG_CONFIG_DEBUG_SPEW"))
1298*a3cefe7fSPierre Pronchery want_flags |= (PKG_SILENCE_ERRORS);
1299*a3cefe7fSPierre Pronchery else
1300*a3cefe7fSPierre Pronchery want_flags &= ~(PKG_SILENCE_ERRORS);
1301*a3cefe7fSPierre Pronchery
1302*a3cefe7fSPierre Pronchery if (getenv("PKG_CONFIG_DONT_RELOCATE_PATHS"))
1303*a3cefe7fSPierre Pronchery want_flags |= (PKG_DONT_RELOCATE_PATHS);
1304*a3cefe7fSPierre Pronchery
1305*a3cefe7fSPierre Pronchery if ((want_flags & PKG_VALIDATE) == PKG_VALIDATE || (want_flags & PKG_DEBUG) == PKG_DEBUG)
1306*a3cefe7fSPierre Pronchery pkgconf_client_set_warn_handler(&pkg_client, error_handler, NULL);
1307*a3cefe7fSPierre Pronchery
1308*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
1309*a3cefe7fSPierre Pronchery if ((want_flags & PKG_DEBUG) == PKG_DEBUG)
1310*a3cefe7fSPierre Pronchery pkgconf_client_set_trace_handler(&pkg_client, error_handler, NULL);
1311*a3cefe7fSPierre Pronchery #endif
1312*a3cefe7fSPierre Pronchery
1313*a3cefe7fSPierre Pronchery pkgconf_path_prepend_list(&pkg_client.dir_list, &dir_list);
1314*a3cefe7fSPierre Pronchery pkgconf_path_free(&dir_list);
1315*a3cefe7fSPierre Pronchery
1316*a3cefe7fSPierre Pronchery if ((want_flags & PKG_ABOUT) == PKG_ABOUT)
1317*a3cefe7fSPierre Pronchery {
1318*a3cefe7fSPierre Pronchery about();
1319*a3cefe7fSPierre Pronchery
1320*a3cefe7fSPierre Pronchery ret = EXIT_SUCCESS;
1321*a3cefe7fSPierre Pronchery goto out;
1322*a3cefe7fSPierre Pronchery }
1323*a3cefe7fSPierre Pronchery
1324*a3cefe7fSPierre Pronchery if ((want_flags & PKG_VERSION) == PKG_VERSION)
1325*a3cefe7fSPierre Pronchery {
1326*a3cefe7fSPierre Pronchery version();
1327*a3cefe7fSPierre Pronchery
1328*a3cefe7fSPierre Pronchery ret = EXIT_SUCCESS;
1329*a3cefe7fSPierre Pronchery goto out;
1330*a3cefe7fSPierre Pronchery }
1331*a3cefe7fSPierre Pronchery
1332*a3cefe7fSPierre Pronchery if ((want_flags & PKG_HELP) == PKG_HELP)
1333*a3cefe7fSPierre Pronchery {
1334*a3cefe7fSPierre Pronchery usage();
1335*a3cefe7fSPierre Pronchery
1336*a3cefe7fSPierre Pronchery ret = EXIT_SUCCESS;
1337*a3cefe7fSPierre Pronchery goto out;
1338*a3cefe7fSPierre Pronchery }
1339*a3cefe7fSPierre Pronchery
1340*a3cefe7fSPierre Pronchery if (getenv("PKG_CONFIG_FDO_SYSROOT_RULES"))
1341*a3cefe7fSPierre Pronchery want_client_flags |= PKGCONF_PKG_PKGF_FDO_SYSROOT_RULES;
1342*a3cefe7fSPierre Pronchery
1343*a3cefe7fSPierre Pronchery if (getenv("PKG_CONFIG_PKGCONF1_SYSROOT_RULES"))
1344*a3cefe7fSPierre Pronchery want_client_flags |= PKGCONF_PKG_PKGF_PKGCONF1_SYSROOT_RULES;
1345*a3cefe7fSPierre Pronchery
1346*a3cefe7fSPierre Pronchery if ((want_flags & PKG_SHORT_ERRORS) == PKG_SHORT_ERRORS)
1347*a3cefe7fSPierre Pronchery want_client_flags |= PKGCONF_PKG_PKGF_SIMPLIFY_ERRORS;
1348*a3cefe7fSPierre Pronchery
1349*a3cefe7fSPierre Pronchery if ((want_flags & PKG_DONT_RELOCATE_PATHS) == PKG_DONT_RELOCATE_PATHS)
1350*a3cefe7fSPierre Pronchery want_client_flags |= PKGCONF_PKG_PKGF_DONT_RELOCATE_PATHS;
1351*a3cefe7fSPierre Pronchery
1352*a3cefe7fSPierre Pronchery error_msgout = stderr;
1353*a3cefe7fSPierre Pronchery if ((want_flags & PKG_ERRORS_ON_STDOUT) == PKG_ERRORS_ON_STDOUT)
1354*a3cefe7fSPierre Pronchery error_msgout = stdout;
1355*a3cefe7fSPierre Pronchery if ((want_flags & PKG_SILENCE_ERRORS) == PKG_SILENCE_ERRORS) {
1356*a3cefe7fSPierre Pronchery error_msgout = fopen(PATH_DEV_NULL, "w");
1357*a3cefe7fSPierre Pronchery opened_error_msgout = true;
1358*a3cefe7fSPierre Pronchery }
1359*a3cefe7fSPierre Pronchery
1360*a3cefe7fSPierre Pronchery if ((want_flags & PKG_IGNORE_CONFLICTS) == PKG_IGNORE_CONFLICTS || getenv("PKG_CONFIG_IGNORE_CONFLICTS") != NULL)
1361*a3cefe7fSPierre Pronchery want_client_flags |= PKGCONF_PKG_PKGF_SKIP_CONFLICTS;
1362*a3cefe7fSPierre Pronchery
1363*a3cefe7fSPierre Pronchery if ((want_flags & PKG_STATIC) == PKG_STATIC || personality->want_default_static)
1364*a3cefe7fSPierre Pronchery want_client_flags |= (PKGCONF_PKG_PKGF_SEARCH_PRIVATE | PKGCONF_PKG_PKGF_MERGE_PRIVATE_FRAGMENTS);
1365*a3cefe7fSPierre Pronchery
1366*a3cefe7fSPierre Pronchery if ((want_flags & PKG_SHARED) == PKG_SHARED)
1367*a3cefe7fSPierre Pronchery want_client_flags &= ~(PKGCONF_PKG_PKGF_SEARCH_PRIVATE | PKGCONF_PKG_PKGF_MERGE_PRIVATE_FRAGMENTS);
1368*a3cefe7fSPierre Pronchery
1369*a3cefe7fSPierre Pronchery /* if --static and --pure are both specified, then disable merge-back.
1370*a3cefe7fSPierre Pronchery * this allows for a --static which searches private modules, but has the same fragment behaviour as if
1371*a3cefe7fSPierre Pronchery * --static were disabled. see <https://github.com/pkgconf/pkgconf/issues/83> for rationale.
1372*a3cefe7fSPierre Pronchery */
1373*a3cefe7fSPierre Pronchery if ((want_flags & PKG_PURE) == PKG_PURE || getenv("PKG_CONFIG_PURE_DEPGRAPH") != NULL || personality->want_default_pure)
1374*a3cefe7fSPierre Pronchery want_client_flags &= ~PKGCONF_PKG_PKGF_MERGE_PRIVATE_FRAGMENTS;
1375*a3cefe7fSPierre Pronchery
1376*a3cefe7fSPierre Pronchery if ((want_flags & PKG_ENV_ONLY) == PKG_ENV_ONLY)
1377*a3cefe7fSPierre Pronchery want_client_flags |= PKGCONF_PKG_PKGF_ENV_ONLY;
1378*a3cefe7fSPierre Pronchery
1379*a3cefe7fSPierre Pronchery if ((want_flags & PKG_NO_CACHE) == PKG_NO_CACHE)
1380*a3cefe7fSPierre Pronchery want_client_flags |= PKGCONF_PKG_PKGF_NO_CACHE;
1381*a3cefe7fSPierre Pronchery
1382*a3cefe7fSPierre Pronchery /* On Windows we want to always redefine the prefix by default
1383*a3cefe7fSPierre Pronchery * but allow that behavior to be manually disabled */
1384*a3cefe7fSPierre Pronchery #if !defined(_WIN32) && !defined(_WIN64)
1385*a3cefe7fSPierre Pronchery if ((want_flags & PKG_DEFINE_PREFIX) == PKG_DEFINE_PREFIX || getenv("PKG_CONFIG_RELOCATE_PATHS") != NULL)
1386*a3cefe7fSPierre Pronchery #endif
1387*a3cefe7fSPierre Pronchery want_client_flags |= PKGCONF_PKG_PKGF_REDEFINE_PREFIX;
1388*a3cefe7fSPierre Pronchery
1389*a3cefe7fSPierre Pronchery if ((want_flags & PKG_NO_UNINSTALLED) == PKG_NO_UNINSTALLED || getenv("PKG_CONFIG_DISABLE_UNINSTALLED") != NULL)
1390*a3cefe7fSPierre Pronchery want_client_flags |= PKGCONF_PKG_PKGF_NO_UNINSTALLED;
1391*a3cefe7fSPierre Pronchery
1392*a3cefe7fSPierre Pronchery if ((want_flags & PKG_NO_PROVIDES) == PKG_NO_PROVIDES)
1393*a3cefe7fSPierre Pronchery want_client_flags |= PKGCONF_PKG_PKGF_SKIP_PROVIDES;
1394*a3cefe7fSPierre Pronchery
1395*a3cefe7fSPierre Pronchery if ((want_flags & PKG_DONT_DEFINE_PREFIX) == PKG_DONT_DEFINE_PREFIX || getenv("PKG_CONFIG_DONT_DEFINE_PREFIX") != NULL)
1396*a3cefe7fSPierre Pronchery want_client_flags &= ~PKGCONF_PKG_PKGF_REDEFINE_PREFIX;
1397*a3cefe7fSPierre Pronchery
1398*a3cefe7fSPierre Pronchery if ((want_flags & PKG_INTERNAL_CFLAGS) == PKG_INTERNAL_CFLAGS)
1399*a3cefe7fSPierre Pronchery want_client_flags |= PKGCONF_PKG_PKGF_DONT_FILTER_INTERNAL_CFLAGS;
1400*a3cefe7fSPierre Pronchery
1401*a3cefe7fSPierre Pronchery /* if these selectors are used, it means that we are querying metadata.
1402*a3cefe7fSPierre Pronchery * so signal to libpkgconf that we only want to walk the flattened dependency set.
1403*a3cefe7fSPierre Pronchery */
1404*a3cefe7fSPierre Pronchery if ((want_flags & PKG_MODVERSION) == PKG_MODVERSION ||
1405*a3cefe7fSPierre Pronchery (want_flags & PKG_REQUIRES) == PKG_REQUIRES ||
1406*a3cefe7fSPierre Pronchery (want_flags & PKG_REQUIRES_PRIVATE) == PKG_REQUIRES_PRIVATE ||
1407*a3cefe7fSPierre Pronchery (want_flags & PKG_PROVIDES) == PKG_PROVIDES ||
1408*a3cefe7fSPierre Pronchery (want_flags & PKG_VARIABLES) == PKG_VARIABLES ||
1409*a3cefe7fSPierre Pronchery (want_flags & PKG_PATH) == PKG_PATH ||
1410*a3cefe7fSPierre Pronchery want_variable != NULL)
1411*a3cefe7fSPierre Pronchery maximum_traverse_depth = 1;
1412*a3cefe7fSPierre Pronchery
1413*a3cefe7fSPierre Pronchery /* if we are asking for a variable, path or list of variables, this only makes sense
1414*a3cefe7fSPierre Pronchery * for a single package.
1415*a3cefe7fSPierre Pronchery */
1416*a3cefe7fSPierre Pronchery if ((want_flags & PKG_VARIABLES) == PKG_VARIABLES ||
1417*a3cefe7fSPierre Pronchery (want_flags & PKG_PATH) == PKG_PATH ||
1418*a3cefe7fSPierre Pronchery want_variable != NULL)
1419*a3cefe7fSPierre Pronchery maximum_package_count = 1;
1420*a3cefe7fSPierre Pronchery
1421*a3cefe7fSPierre Pronchery if (getenv("PKG_CONFIG_ALLOW_SYSTEM_CFLAGS") != NULL)
1422*a3cefe7fSPierre Pronchery want_flags |= PKG_KEEP_SYSTEM_CFLAGS;
1423*a3cefe7fSPierre Pronchery
1424*a3cefe7fSPierre Pronchery if (getenv("PKG_CONFIG_ALLOW_SYSTEM_LIBS") != NULL)
1425*a3cefe7fSPierre Pronchery want_flags |= PKG_KEEP_SYSTEM_LIBS;
1426*a3cefe7fSPierre Pronchery
1427*a3cefe7fSPierre Pronchery if ((builddir = getenv("PKG_CONFIG_TOP_BUILD_DIR")) != NULL)
1428*a3cefe7fSPierre Pronchery pkgconf_client_set_buildroot_dir(&pkg_client, builddir);
1429*a3cefe7fSPierre Pronchery
1430*a3cefe7fSPierre Pronchery if ((want_flags & PKG_REQUIRES_PRIVATE) == PKG_REQUIRES_PRIVATE ||
1431*a3cefe7fSPierre Pronchery (want_flags & PKG_CFLAGS))
1432*a3cefe7fSPierre Pronchery {
1433*a3cefe7fSPierre Pronchery want_client_flags |= PKGCONF_PKG_PKGF_SEARCH_PRIVATE;
1434*a3cefe7fSPierre Pronchery }
1435*a3cefe7fSPierre Pronchery
1436*a3cefe7fSPierre Pronchery if ((sysroot_dir = getenv("PKG_CONFIG_SYSROOT_DIR")) != NULL)
1437*a3cefe7fSPierre Pronchery {
1438*a3cefe7fSPierre Pronchery const char *destdir;
1439*a3cefe7fSPierre Pronchery
1440*a3cefe7fSPierre Pronchery pkgconf_client_set_sysroot_dir(&pkg_client, sysroot_dir);
1441*a3cefe7fSPierre Pronchery
1442*a3cefe7fSPierre Pronchery if ((destdir = getenv("DESTDIR")) != NULL)
1443*a3cefe7fSPierre Pronchery {
1444*a3cefe7fSPierre Pronchery if (!strcmp(destdir, sysroot_dir))
1445*a3cefe7fSPierre Pronchery want_client_flags |= PKGCONF_PKG_PKGF_FDO_SYSROOT_RULES;
1446*a3cefe7fSPierre Pronchery }
1447*a3cefe7fSPierre Pronchery }
1448*a3cefe7fSPierre Pronchery
1449*a3cefe7fSPierre Pronchery /* we have determined what features we want most likely. in some cases, we override later. */
1450*a3cefe7fSPierre Pronchery pkgconf_client_set_flags(&pkg_client, want_client_flags);
1451*a3cefe7fSPierre Pronchery
1452*a3cefe7fSPierre Pronchery /* at this point, want_client_flags should be set, so build the dir list */
1453*a3cefe7fSPierre Pronchery pkgconf_client_dir_list_build(&pkg_client, personality);
1454*a3cefe7fSPierre Pronchery
1455*a3cefe7fSPierre Pronchery /* preload any files in PKG_CONFIG_PRELOADED_FILES */
1456*a3cefe7fSPierre Pronchery pkgconf_client_preload_from_environ(&pkg_client, "PKG_CONFIG_PRELOADED_FILES");
1457*a3cefe7fSPierre Pronchery
1458*a3cefe7fSPierre Pronchery if (required_pkgconfig_version != NULL)
1459*a3cefe7fSPierre Pronchery {
1460*a3cefe7fSPierre Pronchery if (pkgconf_compare_version(PACKAGE_VERSION, required_pkgconfig_version) >= 0)
1461*a3cefe7fSPierre Pronchery ret = EXIT_SUCCESS;
1462*a3cefe7fSPierre Pronchery else
1463*a3cefe7fSPierre Pronchery ret = EXIT_FAILURE;
1464*a3cefe7fSPierre Pronchery
1465*a3cefe7fSPierre Pronchery goto out;
1466*a3cefe7fSPierre Pronchery }
1467*a3cefe7fSPierre Pronchery
1468*a3cefe7fSPierre Pronchery if ((want_flags & PKG_LIST) == PKG_LIST)
1469*a3cefe7fSPierre Pronchery {
1470*a3cefe7fSPierre Pronchery pkgconf_scan_all(&pkg_client, NULL, print_list_entry);
1471*a3cefe7fSPierre Pronchery ret = EXIT_SUCCESS;
1472*a3cefe7fSPierre Pronchery goto out;
1473*a3cefe7fSPierre Pronchery }
1474*a3cefe7fSPierre Pronchery
1475*a3cefe7fSPierre Pronchery if ((want_flags & PKG_LIST_PACKAGE_NAMES) == PKG_LIST_PACKAGE_NAMES)
1476*a3cefe7fSPierre Pronchery {
1477*a3cefe7fSPierre Pronchery pkgconf_scan_all(&pkg_client, NULL, print_package_entry);
1478*a3cefe7fSPierre Pronchery ret = EXIT_SUCCESS;
1479*a3cefe7fSPierre Pronchery goto out;
1480*a3cefe7fSPierre Pronchery }
1481*a3cefe7fSPierre Pronchery
1482*a3cefe7fSPierre Pronchery if (logfile_arg == NULL)
1483*a3cefe7fSPierre Pronchery logfile_arg = getenv("PKG_CONFIG_LOG");
1484*a3cefe7fSPierre Pronchery
1485*a3cefe7fSPierre Pronchery if (logfile_arg != NULL)
1486*a3cefe7fSPierre Pronchery {
1487*a3cefe7fSPierre Pronchery if (pkgconf_unveil(logfile_arg, "rwc") == -1)
1488*a3cefe7fSPierre Pronchery {
1489*a3cefe7fSPierre Pronchery fprintf(stderr, "pkgconf: unveil failed: %s\n", strerror(errno));
1490*a3cefe7fSPierre Pronchery return EXIT_FAILURE;
1491*a3cefe7fSPierre Pronchery }
1492*a3cefe7fSPierre Pronchery
1493*a3cefe7fSPierre Pronchery logfile_out = fopen(logfile_arg, "w");
1494*a3cefe7fSPierre Pronchery pkgconf_audit_set_log(&pkg_client, logfile_out);
1495*a3cefe7fSPierre Pronchery }
1496*a3cefe7fSPierre Pronchery
1497*a3cefe7fSPierre Pronchery if (required_module_version != NULL)
1498*a3cefe7fSPierre Pronchery {
1499*a3cefe7fSPierre Pronchery pkgconf_pkg_t *pkg = NULL;
1500*a3cefe7fSPierre Pronchery pkgconf_node_t *node;
1501*a3cefe7fSPierre Pronchery pkgconf_list_t deplist = PKGCONF_LIST_INITIALIZER;
1502*a3cefe7fSPierre Pronchery
1503*a3cefe7fSPierre Pronchery while (argv[pkg_optind])
1504*a3cefe7fSPierre Pronchery {
1505*a3cefe7fSPierre Pronchery pkgconf_dependency_parse_str(&pkg_client, &deplist, argv[pkg_optind], 0);
1506*a3cefe7fSPierre Pronchery pkg_optind++;
1507*a3cefe7fSPierre Pronchery }
1508*a3cefe7fSPierre Pronchery
1509*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(deplist.head, node)
1510*a3cefe7fSPierre Pronchery {
1511*a3cefe7fSPierre Pronchery pkgconf_dependency_t *pkgiter = node->data;
1512*a3cefe7fSPierre Pronchery
1513*a3cefe7fSPierre Pronchery pkg = pkgconf_pkg_find(&pkg_client, pkgiter->package);
1514*a3cefe7fSPierre Pronchery if (pkg == NULL)
1515*a3cefe7fSPierre Pronchery {
1516*a3cefe7fSPierre Pronchery if (want_flags & PKG_PRINT_ERRORS)
1517*a3cefe7fSPierre Pronchery pkgconf_error(&pkg_client, "Package '%s' was not found\n", pkgiter->package);
1518*a3cefe7fSPierre Pronchery
1519*a3cefe7fSPierre Pronchery ret = EXIT_FAILURE;
1520*a3cefe7fSPierre Pronchery goto cleanup;
1521*a3cefe7fSPierre Pronchery }
1522*a3cefe7fSPierre Pronchery
1523*a3cefe7fSPierre Pronchery if (pkgconf_compare_version(pkg->version, required_module_version) >= 0)
1524*a3cefe7fSPierre Pronchery {
1525*a3cefe7fSPierre Pronchery ret = EXIT_SUCCESS;
1526*a3cefe7fSPierre Pronchery goto cleanup;
1527*a3cefe7fSPierre Pronchery }
1528*a3cefe7fSPierre Pronchery }
1529*a3cefe7fSPierre Pronchery
1530*a3cefe7fSPierre Pronchery ret = EXIT_FAILURE;
1531*a3cefe7fSPierre Pronchery cleanup:
1532*a3cefe7fSPierre Pronchery if (pkg != NULL)
1533*a3cefe7fSPierre Pronchery pkgconf_pkg_unref(&pkg_client, pkg);
1534*a3cefe7fSPierre Pronchery pkgconf_dependency_free(&deplist);
1535*a3cefe7fSPierre Pronchery goto out;
1536*a3cefe7fSPierre Pronchery }
1537*a3cefe7fSPierre Pronchery else if (required_exact_module_version != NULL)
1538*a3cefe7fSPierre Pronchery {
1539*a3cefe7fSPierre Pronchery pkgconf_pkg_t *pkg = NULL;
1540*a3cefe7fSPierre Pronchery pkgconf_node_t *node;
1541*a3cefe7fSPierre Pronchery pkgconf_list_t deplist = PKGCONF_LIST_INITIALIZER;
1542*a3cefe7fSPierre Pronchery
1543*a3cefe7fSPierre Pronchery while (argv[pkg_optind])
1544*a3cefe7fSPierre Pronchery {
1545*a3cefe7fSPierre Pronchery pkgconf_dependency_parse_str(&pkg_client, &deplist, argv[pkg_optind], 0);
1546*a3cefe7fSPierre Pronchery pkg_optind++;
1547*a3cefe7fSPierre Pronchery }
1548*a3cefe7fSPierre Pronchery
1549*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(deplist.head, node)
1550*a3cefe7fSPierre Pronchery {
1551*a3cefe7fSPierre Pronchery pkgconf_dependency_t *pkgiter = node->data;
1552*a3cefe7fSPierre Pronchery
1553*a3cefe7fSPierre Pronchery pkg = pkgconf_pkg_find(&pkg_client, pkgiter->package);
1554*a3cefe7fSPierre Pronchery if (pkg == NULL)
1555*a3cefe7fSPierre Pronchery {
1556*a3cefe7fSPierre Pronchery if (want_flags & PKG_PRINT_ERRORS)
1557*a3cefe7fSPierre Pronchery pkgconf_error(&pkg_client, "Package '%s' was not found\n", pkgiter->package);
1558*a3cefe7fSPierre Pronchery
1559*a3cefe7fSPierre Pronchery ret = EXIT_FAILURE;
1560*a3cefe7fSPierre Pronchery goto cleanup2;
1561*a3cefe7fSPierre Pronchery }
1562*a3cefe7fSPierre Pronchery
1563*a3cefe7fSPierre Pronchery if (pkgconf_compare_version(pkg->version, required_exact_module_version) == 0)
1564*a3cefe7fSPierre Pronchery {
1565*a3cefe7fSPierre Pronchery ret = EXIT_SUCCESS;
1566*a3cefe7fSPierre Pronchery goto cleanup2;
1567*a3cefe7fSPierre Pronchery }
1568*a3cefe7fSPierre Pronchery }
1569*a3cefe7fSPierre Pronchery
1570*a3cefe7fSPierre Pronchery ret = EXIT_FAILURE;
1571*a3cefe7fSPierre Pronchery cleanup2:
1572*a3cefe7fSPierre Pronchery if (pkg != NULL)
1573*a3cefe7fSPierre Pronchery pkgconf_pkg_unref(&pkg_client, pkg);
1574*a3cefe7fSPierre Pronchery pkgconf_dependency_free(&deplist);
1575*a3cefe7fSPierre Pronchery goto out;
1576*a3cefe7fSPierre Pronchery }
1577*a3cefe7fSPierre Pronchery else if (required_max_module_version != NULL)
1578*a3cefe7fSPierre Pronchery {
1579*a3cefe7fSPierre Pronchery pkgconf_pkg_t *pkg = NULL;
1580*a3cefe7fSPierre Pronchery pkgconf_node_t *node;
1581*a3cefe7fSPierre Pronchery pkgconf_list_t deplist = PKGCONF_LIST_INITIALIZER;
1582*a3cefe7fSPierre Pronchery
1583*a3cefe7fSPierre Pronchery while (argv[pkg_optind])
1584*a3cefe7fSPierre Pronchery {
1585*a3cefe7fSPierre Pronchery pkgconf_dependency_parse_str(&pkg_client, &deplist, argv[pkg_optind], 0);
1586*a3cefe7fSPierre Pronchery pkg_optind++;
1587*a3cefe7fSPierre Pronchery }
1588*a3cefe7fSPierre Pronchery
1589*a3cefe7fSPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(deplist.head, node)
1590*a3cefe7fSPierre Pronchery {
1591*a3cefe7fSPierre Pronchery pkgconf_dependency_t *pkgiter = node->data;
1592*a3cefe7fSPierre Pronchery
1593*a3cefe7fSPierre Pronchery pkg = pkgconf_pkg_find(&pkg_client, pkgiter->package);
1594*a3cefe7fSPierre Pronchery if (pkg == NULL)
1595*a3cefe7fSPierre Pronchery {
1596*a3cefe7fSPierre Pronchery if (want_flags & PKG_PRINT_ERRORS)
1597*a3cefe7fSPierre Pronchery pkgconf_error(&pkg_client, "Package '%s' was not found\n", pkgiter->package);
1598*a3cefe7fSPierre Pronchery
1599*a3cefe7fSPierre Pronchery ret = EXIT_FAILURE;
1600*a3cefe7fSPierre Pronchery goto cleanup3;
1601*a3cefe7fSPierre Pronchery }
1602*a3cefe7fSPierre Pronchery
1603*a3cefe7fSPierre Pronchery if (pkgconf_compare_version(pkg->version, required_max_module_version) <= 0)
1604*a3cefe7fSPierre Pronchery {
1605*a3cefe7fSPierre Pronchery ret = EXIT_SUCCESS;
1606*a3cefe7fSPierre Pronchery goto cleanup3;
1607*a3cefe7fSPierre Pronchery }
1608*a3cefe7fSPierre Pronchery }
1609*a3cefe7fSPierre Pronchery
1610*a3cefe7fSPierre Pronchery ret = EXIT_FAILURE;
1611*a3cefe7fSPierre Pronchery cleanup3:
1612*a3cefe7fSPierre Pronchery if (pkg != NULL)
1613*a3cefe7fSPierre Pronchery pkgconf_pkg_unref(&pkg_client, pkg);
1614*a3cefe7fSPierre Pronchery pkgconf_dependency_free(&deplist);
1615*a3cefe7fSPierre Pronchery goto out;
1616*a3cefe7fSPierre Pronchery }
1617*a3cefe7fSPierre Pronchery
1618*a3cefe7fSPierre Pronchery while (1)
1619*a3cefe7fSPierre Pronchery {
1620*a3cefe7fSPierre Pronchery char *package = argv[pkg_optind];
1621*a3cefe7fSPierre Pronchery char *end;
1622*a3cefe7fSPierre Pronchery
1623*a3cefe7fSPierre Pronchery if (package == NULL)
1624*a3cefe7fSPierre Pronchery break;
1625*a3cefe7fSPierre Pronchery
1626*a3cefe7fSPierre Pronchery /* check if there is a limit to the number of packages allowed to be included, if so and we have hit
1627*a3cefe7fSPierre Pronchery * the limit, stop adding packages to the queue.
1628*a3cefe7fSPierre Pronchery */
1629*a3cefe7fSPierre Pronchery if (maximum_package_count > 0 && pkgq.length >= maximum_package_count)
1630*a3cefe7fSPierre Pronchery break;
1631*a3cefe7fSPierre Pronchery
1632*a3cefe7fSPierre Pronchery while (isspace((unsigned char)package[0]))
1633*a3cefe7fSPierre Pronchery package++;
1634*a3cefe7fSPierre Pronchery
1635*a3cefe7fSPierre Pronchery /* skip empty packages */
1636*a3cefe7fSPierre Pronchery if (package[0] == '\0') {
1637*a3cefe7fSPierre Pronchery pkg_optind++;
1638*a3cefe7fSPierre Pronchery continue;
1639*a3cefe7fSPierre Pronchery }
1640*a3cefe7fSPierre Pronchery
1641*a3cefe7fSPierre Pronchery end = package + strlen(package) - 1;
1642*a3cefe7fSPierre Pronchery while(end > package && isspace((unsigned char)end[0])) end--;
1643*a3cefe7fSPierre Pronchery end[1] = '\0';
1644*a3cefe7fSPierre Pronchery
1645*a3cefe7fSPierre Pronchery if (argv[pkg_optind + 1] == NULL || !PKGCONF_IS_OPERATOR_CHAR(*(argv[pkg_optind + 1])))
1646*a3cefe7fSPierre Pronchery {
1647*a3cefe7fSPierre Pronchery pkgconf_queue_push(&pkgq, package);
1648*a3cefe7fSPierre Pronchery pkg_optind++;
1649*a3cefe7fSPierre Pronchery }
1650*a3cefe7fSPierre Pronchery else if (argv[pkg_optind + 2] == NULL)
1651*a3cefe7fSPierre Pronchery {
1652*a3cefe7fSPierre Pronchery char packagebuf[PKGCONF_BUFSIZE];
1653*a3cefe7fSPierre Pronchery
1654*a3cefe7fSPierre Pronchery snprintf(packagebuf, sizeof packagebuf, "%s %s", package, argv[pkg_optind + 1]);
1655*a3cefe7fSPierre Pronchery pkg_optind += 2;
1656*a3cefe7fSPierre Pronchery
1657*a3cefe7fSPierre Pronchery pkgconf_queue_push(&pkgq, packagebuf);
1658*a3cefe7fSPierre Pronchery }
1659*a3cefe7fSPierre Pronchery else
1660*a3cefe7fSPierre Pronchery {
1661*a3cefe7fSPierre Pronchery char packagebuf[PKGCONF_BUFSIZE];
1662*a3cefe7fSPierre Pronchery
1663*a3cefe7fSPierre Pronchery snprintf(packagebuf, sizeof packagebuf, "%s %s %s", package, argv[pkg_optind + 1], argv[pkg_optind + 2]);
1664*a3cefe7fSPierre Pronchery pkg_optind += 3;
1665*a3cefe7fSPierre Pronchery
1666*a3cefe7fSPierre Pronchery pkgconf_queue_push(&pkgq, packagebuf);
1667*a3cefe7fSPierre Pronchery }
1668*a3cefe7fSPierre Pronchery }
1669*a3cefe7fSPierre Pronchery
1670*a3cefe7fSPierre Pronchery if (pkgq.head == NULL)
1671*a3cefe7fSPierre Pronchery {
1672*a3cefe7fSPierre Pronchery fprintf(stderr, "Please specify at least one package name on the command line.\n");
1673*a3cefe7fSPierre Pronchery ret = EXIT_FAILURE;
1674*a3cefe7fSPierre Pronchery goto out;
1675*a3cefe7fSPierre Pronchery }
1676*a3cefe7fSPierre Pronchery
1677*a3cefe7fSPierre Pronchery ret = EXIT_SUCCESS;
1678*a3cefe7fSPierre Pronchery
1679*a3cefe7fSPierre Pronchery if (!pkgconf_queue_solve(&pkg_client, &pkgq, &world, maximum_traverse_depth))
1680*a3cefe7fSPierre Pronchery {
1681*a3cefe7fSPierre Pronchery ret = EXIT_FAILURE;
1682*a3cefe7fSPierre Pronchery goto out;
1683*a3cefe7fSPierre Pronchery }
1684*a3cefe7fSPierre Pronchery
1685*a3cefe7fSPierre Pronchery /* we shouldn't need to unveil any more filesystem accesses from this point, so lock it down */
1686*a3cefe7fSPierre Pronchery if (pkgconf_unveil(NULL, NULL) == -1)
1687*a3cefe7fSPierre Pronchery {
1688*a3cefe7fSPierre Pronchery fprintf(stderr, "pkgconf: unveil lockdown failed: %s\n", strerror(errno));
1689*a3cefe7fSPierre Pronchery return EXIT_FAILURE;
1690*a3cefe7fSPierre Pronchery }
1691*a3cefe7fSPierre Pronchery
1692*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
1693*a3cefe7fSPierre Pronchery if ((want_flags & PKG_SIMULATE) == PKG_SIMULATE)
1694*a3cefe7fSPierre Pronchery {
1695*a3cefe7fSPierre Pronchery want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
1696*a3cefe7fSPierre Pronchery
1697*a3cefe7fSPierre Pronchery pkgconf_client_set_flags(&pkg_client, want_client_flags | PKGCONF_PKG_PKGF_SKIP_ERRORS);
1698*a3cefe7fSPierre Pronchery apply_simulate(&pkg_client, &world, NULL, -1);
1699*a3cefe7fSPierre Pronchery }
1700*a3cefe7fSPierre Pronchery #endif
1701*a3cefe7fSPierre Pronchery
1702*a3cefe7fSPierre Pronchery if ((want_flags & PKG_VALIDATE) == PKG_VALIDATE)
1703*a3cefe7fSPierre Pronchery goto out;
1704*a3cefe7fSPierre Pronchery
1705*a3cefe7fSPierre Pronchery if ((want_flags & PKG_DUMP_LICENSE) == PKG_DUMP_LICENSE)
1706*a3cefe7fSPierre Pronchery {
1707*a3cefe7fSPierre Pronchery apply_license(&pkg_client, &world, &ret, 2);
1708*a3cefe7fSPierre Pronchery goto out;
1709*a3cefe7fSPierre Pronchery }
1710*a3cefe7fSPierre Pronchery
1711*a3cefe7fSPierre Pronchery if ((want_flags & PKG_UNINSTALLED) == PKG_UNINSTALLED)
1712*a3cefe7fSPierre Pronchery {
1713*a3cefe7fSPierre Pronchery ret = EXIT_FAILURE;
1714*a3cefe7fSPierre Pronchery apply_uninstalled(&pkg_client, &world, &ret, 2);
1715*a3cefe7fSPierre Pronchery goto out;
1716*a3cefe7fSPierre Pronchery }
1717*a3cefe7fSPierre Pronchery
1718*a3cefe7fSPierre Pronchery if (want_env_prefix != NULL)
1719*a3cefe7fSPierre Pronchery {
1720*a3cefe7fSPierre Pronchery apply_env(&pkg_client, &world, want_env_prefix, 2);
1721*a3cefe7fSPierre Pronchery goto out;
1722*a3cefe7fSPierre Pronchery }
1723*a3cefe7fSPierre Pronchery
1724*a3cefe7fSPierre Pronchery if ((want_flags & PKG_PROVIDES) == PKG_PROVIDES)
1725*a3cefe7fSPierre Pronchery {
1726*a3cefe7fSPierre Pronchery want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
1727*a3cefe7fSPierre Pronchery apply_provides(&pkg_client, &world, NULL, 2);
1728*a3cefe7fSPierre Pronchery }
1729*a3cefe7fSPierre Pronchery
1730*a3cefe7fSPierre Pronchery #ifndef PKGCONF_LITE
1731*a3cefe7fSPierre Pronchery if ((want_flags & PKG_DIGRAPH) == PKG_DIGRAPH)
1732*a3cefe7fSPierre Pronchery {
1733*a3cefe7fSPierre Pronchery want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
1734*a3cefe7fSPierre Pronchery apply_digraph(&pkg_client, &world, &pkgq, 2);
1735*a3cefe7fSPierre Pronchery }
1736*a3cefe7fSPierre Pronchery
1737*a3cefe7fSPierre Pronchery if ((want_flags & PKG_SOLUTION) == PKG_SOLUTION)
1738*a3cefe7fSPierre Pronchery {
1739*a3cefe7fSPierre Pronchery want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
1740*a3cefe7fSPierre Pronchery apply_print_solution(&pkg_client, &world, NULL, 2);
1741*a3cefe7fSPierre Pronchery }
1742*a3cefe7fSPierre Pronchery #endif
1743*a3cefe7fSPierre Pronchery
1744*a3cefe7fSPierre Pronchery if ((want_flags & PKG_MODVERSION) == PKG_MODVERSION)
1745*a3cefe7fSPierre Pronchery {
1746*a3cefe7fSPierre Pronchery want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
1747*a3cefe7fSPierre Pronchery apply_modversion(&pkg_client, &world, &pkgq, 2);
1748*a3cefe7fSPierre Pronchery }
1749*a3cefe7fSPierre Pronchery
1750*a3cefe7fSPierre Pronchery if ((want_flags & PKG_PATH) == PKG_PATH)
1751*a3cefe7fSPierre Pronchery {
1752*a3cefe7fSPierre Pronchery want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
1753*a3cefe7fSPierre Pronchery
1754*a3cefe7fSPierre Pronchery pkgconf_client_set_flags(&pkg_client, want_client_flags | PKGCONF_PKG_PKGF_SKIP_ROOT_VIRTUAL);
1755*a3cefe7fSPierre Pronchery apply_path(&pkg_client, &world, NULL, 2);
1756*a3cefe7fSPierre Pronchery }
1757*a3cefe7fSPierre Pronchery
1758*a3cefe7fSPierre Pronchery if ((want_flags & PKG_VARIABLES) == PKG_VARIABLES)
1759*a3cefe7fSPierre Pronchery {
1760*a3cefe7fSPierre Pronchery want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
1761*a3cefe7fSPierre Pronchery apply_variables(&pkg_client, &world, NULL, 2);
1762*a3cefe7fSPierre Pronchery }
1763*a3cefe7fSPierre Pronchery
1764*a3cefe7fSPierre Pronchery if (want_variable)
1765*a3cefe7fSPierre Pronchery {
1766*a3cefe7fSPierre Pronchery want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
1767*a3cefe7fSPierre Pronchery
1768*a3cefe7fSPierre Pronchery pkgconf_client_set_flags(&pkg_client, want_client_flags | PKGCONF_PKG_PKGF_SKIP_ROOT_VIRTUAL);
1769*a3cefe7fSPierre Pronchery apply_variable(&pkg_client, &world, want_variable, 2);
1770*a3cefe7fSPierre Pronchery }
1771*a3cefe7fSPierre Pronchery
1772*a3cefe7fSPierre Pronchery if ((want_flags & PKG_REQUIRES) == PKG_REQUIRES)
1773*a3cefe7fSPierre Pronchery {
1774*a3cefe7fSPierre Pronchery want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
1775*a3cefe7fSPierre Pronchery apply_requires(&pkg_client, &world, NULL, 2);
1776*a3cefe7fSPierre Pronchery }
1777*a3cefe7fSPierre Pronchery
1778*a3cefe7fSPierre Pronchery if ((want_flags & PKG_REQUIRES_PRIVATE) == PKG_REQUIRES_PRIVATE)
1779*a3cefe7fSPierre Pronchery {
1780*a3cefe7fSPierre Pronchery want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
1781*a3cefe7fSPierre Pronchery
1782*a3cefe7fSPierre Pronchery apply_requires_private(&pkg_client, &world, NULL, 2);
1783*a3cefe7fSPierre Pronchery }
1784*a3cefe7fSPierre Pronchery
1785*a3cefe7fSPierre Pronchery if ((want_flags & PKG_FRAGMENT_TREE))
1786*a3cefe7fSPierre Pronchery {
1787*a3cefe7fSPierre Pronchery want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
1788*a3cefe7fSPierre Pronchery
1789*a3cefe7fSPierre Pronchery apply_fragment_tree(&pkg_client, &world, NULL, 2);
1790*a3cefe7fSPierre Pronchery }
1791*a3cefe7fSPierre Pronchery
1792*a3cefe7fSPierre Pronchery if ((want_flags & PKG_CFLAGS))
1793*a3cefe7fSPierre Pronchery {
1794*a3cefe7fSPierre Pronchery apply_cflags(&pkg_client, &world, NULL, 2);
1795*a3cefe7fSPierre Pronchery }
1796*a3cefe7fSPierre Pronchery
1797*a3cefe7fSPierre Pronchery if ((want_flags & PKG_LIBS))
1798*a3cefe7fSPierre Pronchery {
1799*a3cefe7fSPierre Pronchery if (want_flags & PKG_CFLAGS)
1800*a3cefe7fSPierre Pronchery printf(" ");
1801*a3cefe7fSPierre Pronchery
1802*a3cefe7fSPierre Pronchery if (!(want_flags & PKG_STATIC))
1803*a3cefe7fSPierre Pronchery pkgconf_client_set_flags(&pkg_client, pkg_client.flags & ~PKGCONF_PKG_PKGF_SEARCH_PRIVATE);
1804*a3cefe7fSPierre Pronchery
1805*a3cefe7fSPierre Pronchery apply_libs(&pkg_client, &world, NULL, 2);
1806*a3cefe7fSPierre Pronchery }
1807*a3cefe7fSPierre Pronchery
1808*a3cefe7fSPierre Pronchery if (want_flags & (PKG_CFLAGS|PKG_LIBS))
1809*a3cefe7fSPierre Pronchery printf("\n");
1810*a3cefe7fSPierre Pronchery
1811*a3cefe7fSPierre Pronchery out:
1812*a3cefe7fSPierre Pronchery pkgconf_solution_free(&pkg_client, &world);
1813*a3cefe7fSPierre Pronchery pkgconf_queue_free(&pkgq);
1814*a3cefe7fSPierre Pronchery pkgconf_cross_personality_deinit(personality);
1815*a3cefe7fSPierre Pronchery pkgconf_client_deinit(&pkg_client);
1816*a3cefe7fSPierre Pronchery
1817*a3cefe7fSPierre Pronchery if (logfile_out != NULL)
1818*a3cefe7fSPierre Pronchery fclose(logfile_out);
1819*a3cefe7fSPierre Pronchery if (opened_error_msgout)
1820*a3cefe7fSPierre Pronchery fclose(error_msgout);
1821*a3cefe7fSPierre Pronchery
1822*a3cefe7fSPierre Pronchery return ret;
1823*a3cefe7fSPierre Pronchery }
1824