cli: implement --exists-cflags feature
ci/woodpecker/push/woodpecker Pipeline was successful Details

This feature adds autoconf-style -DHAVE_FOO definitions to the
--cflags output when it is requested.  This has been requested
a few times over the years as it allows for simplifying build
system logic in scenarios where a standalone Makefile or similar
build process is used without a configuration step.
master
Ariadne Conill 2024-08-05 14:29:53 -07:00
parent 174db1a17a
commit d76aa357e4
1 changed files with 42 additions and 0 deletions

View File

@ -503,6 +503,46 @@ apply_env(pkgconf_client_t *client, pkgconf_pkg_t *world, void *env_prefix_p, in
return true; return true;
} }
static void
maybe_add_module_definitions(pkgconf_client_t *client, pkgconf_pkg_t *world, pkgconf_list_t *fragment_list)
{
pkgconf_node_t *world_iter;
if ((want_flags & PKG_EXISTS_CFLAGS) != PKG_EXISTS_CFLAGS)
return;
PKGCONF_FOREACH_LIST_ENTRY(world->required.head, world_iter)
{
pkgconf_dependency_t *dep = world_iter->data;
char havebuf[PKGCONF_ITEM_SIZE];
char *p;
if ((dep->flags & PKGCONF_PKG_DEPF_QUERY) != PKGCONF_PKG_DEPF_QUERY)
continue;
if (dep->match == NULL)
continue;
snprintf(havebuf, sizeof havebuf, "HAVE_%s", dep->match->id);
for (p = havebuf; *p; p++)
{
switch (*p)
{
case ' ':
case '-':
*p = '_';
break;
default:
*p = toupper((unsigned char) *p);
}
}
pkgconf_fragment_insert(client, fragment_list, 'D', havebuf, false);
}
}
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)
{ {
@ -521,6 +561,8 @@ apply_cflags(pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int m
if (filtered_list.head == NULL) if (filtered_list.head == NULL)
goto out; goto out;
maybe_add_module_definitions(client, world, &filtered_list);
render_buf = pkgconf_fragment_render(&filtered_list, true, want_render_ops); render_buf = pkgconf_fragment_render(&filtered_list, true, want_render_ops);
printf("%s", render_buf); printf("%s", render_buf);
free(render_buf); free(render_buf);