main: implement --env (closes #159)

feature/tap-sh
William Pitcock 2017-12-06 17:45:17 -06:00
parent 69a05a74b5
commit 7ab4dffaf1
2 changed files with 71 additions and 0 deletions

67
main.c
View File

@ -374,6 +374,57 @@ apply_variable(pkgconf_client_t *client, pkgconf_pkg_t *world, void *variable, i
return true; return true;
} }
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))
{
pkgconf_list_t unfiltered_list = PKGCONF_LIST_INITIALIZER;
pkgconf_list_t filtered_list = PKGCONF_LIST_INITIALIZER;
unsigned int eflag;
char *render_buf;
eflag = collect_fn(client, world, &unfiltered_list, maxdepth);
if (eflag != PKGCONF_PKG_ERRF_OK)
return false;
pkgconf_fragment_filter(client, &filtered_list, &unfiltered_list, filter_fn, NULL);
if (filtered_list.head == NULL)
goto out;
render_buf = pkgconf_fragment_render(&filtered_list, true);
printf("%s=%s\n", prefix, render_buf);
free(render_buf);
out:
pkgconf_fragment_free(&unfiltered_list);
pkgconf_fragment_free(&filtered_list);
return true;
}
static bool
apply_env(pkgconf_client_t *client, pkgconf_pkg_t *world, void *env_prefix_p, int maxdepth)
{
const char *want_env_prefix = env_prefix_p, *it;
char workbuf[PKGCONF_ITEM_SIZE];
for (it = want_env_prefix; *it != '\0'; it++)
if (!isalpha(*it) && !isdigit(*it))
return false;
snprintf(workbuf, sizeof workbuf, "%s_CFLAGS", want_env_prefix);
if (!apply_env_var(workbuf, client, world, maxdepth, pkgconf_pkg_cflags, filter_cflags))
return false;
snprintf(workbuf, sizeof workbuf, "%s_LIBS", want_env_prefix);
if (!apply_env_var(workbuf, client, world, maxdepth, pkgconf_pkg_libs, filter_libs))
return false;
return true;
}
static bool static bool
apply_cflags(pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth) apply_cflags(pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth)
{ {
@ -659,6 +710,7 @@ main(int argc, char *argv[])
char *required_max_module_version = NULL; char *required_max_module_version = NULL;
char *required_module_version = NULL; char *required_module_version = NULL;
char *logfile_arg = NULL; char *logfile_arg = NULL;
char *want_env_prefix = NULL;
unsigned int want_client_flags = PKGCONF_PKG_PKGF_NONE; unsigned int want_client_flags = PKGCONF_PKG_PKGF_NONE;
want_flags = 0; want_flags = 0;
@ -725,6 +777,7 @@ main(int argc, char *argv[])
{ "relocate", required_argument, NULL, 45 }, { "relocate", required_argument, NULL, 45 },
{ "dont-define-prefix", no_argument, &want_flags, PKG_DONT_DEFINE_PREFIX }, { "dont-define-prefix", no_argument, &want_flags, PKG_DONT_DEFINE_PREFIX },
{ "dont-relocate-paths", no_argument, &want_flags, PKG_DONT_RELOCATE_PATHS }, { "dont-relocate-paths", no_argument, &want_flags, PKG_DONT_RELOCATE_PATHS },
{ "env", required_argument, NULL, 48 },
{ NULL, 0, NULL, 0 } { NULL, 0, NULL, 0 }
}; };
@ -773,6 +826,9 @@ main(int argc, char *argv[])
case 45: case 45:
relocate_path(pkg_optarg); relocate_path(pkg_optarg);
return EXIT_SUCCESS; return EXIT_SUCCESS;
case 48:
want_env_prefix = pkg_optarg;
break;
case '?': case '?':
case ':': case ':':
return EXIT_FAILURE; return EXIT_FAILURE;
@ -1108,6 +1164,17 @@ main(int argc, char *argv[])
goto out; goto out;
} }
if (want_env_prefix != NULL)
{
if (!pkgconf_queue_apply(&pkg_client, &pkgq, apply_env, maximum_traverse_depth, want_env_prefix))
{
ret = EXIT_FAILURE;
goto out;
}
want_flags = 0;
}
if ((want_flags & PKG_PROVIDES) == PKG_PROVIDES) if ((want_flags & PKG_PROVIDES) == PKG_PROVIDES)
{ {
want_flags &= ~(PKG_CFLAGS|PKG_LIBS); want_flags &= ~(PKG_CFLAGS|PKG_LIBS);

View File

@ -155,6 +155,10 @@ file. This can be used with graphviz to visualize module interdependencies.
Display the filenames of the Display the filenames of the
.Sq .pc .Sq .pc
files used by the dependency resolver for a given dependency set. files used by the dependency resolver for a given dependency set.
.It Fl -env Ns = Ns Ar VARNAME
Print the requested values as variable declarations in a similar format as the
.Xr env 1
command.
.El .El
.Sh ENVIRONMENT .Sh ENVIRONMENT
.Bl -tag -width indent .Bl -tag -width indent