add support for making paths relocatable (closes #103)
parent
bd6be71115
commit
7237b811e7
|
@ -14,6 +14,7 @@ bin_PROGRAMS = pkgconf
|
||||||
lib_LTLIBRARIES = libpkgconf.la
|
lib_LTLIBRARIES = libpkgconf.la
|
||||||
|
|
||||||
EXTRA_DIST = pkg.m4 \
|
EXTRA_DIST = pkg.m4 \
|
||||||
|
tests/lib-relocatable/lib/pkgconfig/foo.pc \
|
||||||
tests/lib1/argv-parse-2.pc \
|
tests/lib1/argv-parse-2.pc \
|
||||||
tests/lib1/dos-lineendings.pc \
|
tests/lib1/dos-lineendings.pc \
|
||||||
tests/lib1/paren-quoting.pc \
|
tests/lib1/paren-quoting.pc \
|
||||||
|
|
|
@ -184,6 +184,7 @@ void pkgconf_client_set_prefix_varname(pkgconf_client_t *client, const char *pre
|
||||||
#define PKGCONF_PKG_PKGF_SKIP_ERRORS 0x080
|
#define PKGCONF_PKG_PKGF_SKIP_ERRORS 0x080
|
||||||
#define PKGCONF_PKG_PKGF_ITER_PKG_IS_PRIVATE 0x100
|
#define PKGCONF_PKG_PKGF_ITER_PKG_IS_PRIVATE 0x100
|
||||||
#define PKGCONF_PKG_PKGF_SKIP_PROVIDES 0x200
|
#define PKGCONF_PKG_PKGF_SKIP_PROVIDES 0x200
|
||||||
|
#define PKGCONF_PKG_PKGF_REDEFINE_PREFIX 0x400
|
||||||
|
|
||||||
#define PKGCONF_PKG_ERRF_OK 0x0
|
#define PKGCONF_PKG_ERRF_OK 0x0
|
||||||
#define PKGCONF_PKG_ERRF_PACKAGE_NOT_FOUND 0x1
|
#define PKGCONF_PKG_ERRF_PACKAGE_NOT_FOUND 0x1
|
||||||
|
|
|
@ -181,6 +181,44 @@ pkgconf_pkg_parser_keyword_set(const pkgconf_client_t *client, pkgconf_pkg_t *pk
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
determine_prefix(const pkgconf_pkg_t *pkg)
|
||||||
|
{
|
||||||
|
static char buf[PKGCONF_BUFSIZE];
|
||||||
|
char *pathiter;
|
||||||
|
|
||||||
|
pkgconf_strlcpy(buf, pkg->filename, sizeof buf);
|
||||||
|
pkgconf_path_relocate(buf, sizeof buf);
|
||||||
|
|
||||||
|
pathiter = strrchr(buf, PKG_DIR_SEP_S);
|
||||||
|
if (pathiter == NULL)
|
||||||
|
pathiter = strrchr(buf, '/');
|
||||||
|
if (pathiter != NULL)
|
||||||
|
pathiter[0] = '\0';
|
||||||
|
|
||||||
|
pathiter = strrchr(buf, PKG_DIR_SEP_S);
|
||||||
|
if (pathiter == NULL)
|
||||||
|
pathiter = strrchr(buf, '/');
|
||||||
|
if (pathiter == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* parent dir is not pkgconfig, can't relocate then */
|
||||||
|
if (strcmp(pathiter + 1, "pkgconfig"))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* okay, work backwards and do it again. */
|
||||||
|
pathiter[0] = '\0';
|
||||||
|
pathiter = strrchr(buf, PKG_DIR_SEP_S);
|
||||||
|
if (pathiter == NULL)
|
||||||
|
pathiter = strrchr(buf, '/');
|
||||||
|
if (pathiter == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
pathiter[0] = '\0';
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* !doc
|
* !doc
|
||||||
*
|
*
|
||||||
|
@ -249,7 +287,19 @@ pkgconf_pkg_new_from_file(const pkgconf_client_t *client, const char *filename,
|
||||||
pkgconf_pkg_parser_keyword_set(client, pkg, key, value);
|
pkgconf_pkg_parser_keyword_set(client, pkg, key, value);
|
||||||
break;
|
break;
|
||||||
case '=':
|
case '=':
|
||||||
|
if (strcmp(key, client->prefix_varname) || !(client->flags & PKGCONF_PKG_PKGF_REDEFINE_PREFIX))
|
||||||
pkgconf_tuple_add(client, &pkg->vars, key, value, true);
|
pkgconf_tuple_add(client, &pkg->vars, key, value, true);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const char *relvalue = determine_prefix(pkg);
|
||||||
|
if (relvalue != NULL)
|
||||||
|
{
|
||||||
|
pkgconf_tuple_add(client, &pkg->vars, "orig_prefix", value, true);
|
||||||
|
pkgconf_tuple_add(client, &pkg->vars, key, relvalue, false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pkgconf_tuple_add(client, &pkg->vars, key, value, true);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
23
main.c
23
main.c
|
@ -52,6 +52,7 @@
|
||||||
#define PKG_NO_PROVIDES (((uint64_t) 1) << 32)
|
#define PKG_NO_PROVIDES (((uint64_t) 1) << 32)
|
||||||
#define PKG_PURE (((uint64_t) 1) << 33)
|
#define PKG_PURE (((uint64_t) 1) << 33)
|
||||||
#define PKG_PATH (((uint64_t) 1) << 34)
|
#define PKG_PATH (((uint64_t) 1) << 34)
|
||||||
|
#define PKG_DEFINE_PREFIX (((uint64_t) 1) << 35)
|
||||||
|
|
||||||
static pkgconf_client_t pkg_client;
|
static pkgconf_client_t pkg_client;
|
||||||
|
|
||||||
|
@ -569,8 +570,11 @@ usage(void)
|
||||||
printf(" walking the dependency graph\n");
|
printf(" walking the dependency graph\n");
|
||||||
printf(" --log-file=filename write an audit log to a specified file\n");
|
printf(" --log-file=filename write an audit log to a specified file\n");
|
||||||
printf(" --with-path=path adds a directory to the search path\n");
|
printf(" --with-path=path adds a directory to the search path\n");
|
||||||
|
printf(" --define-prefix override the prefix variable with one that is guessed based on\n");
|
||||||
|
printf(" the location of the .pc file\n");
|
||||||
printf(" --prefix-variable=varname sets the name of the variable that pkgconf considers\n");
|
printf(" --prefix-variable=varname sets the name of the variable that pkgconf considers\n");
|
||||||
printf(" to be the package prefix\n");
|
printf(" to be the package prefix\n");
|
||||||
|
printf(" --relocate=path relocates a path and exits (mostly for testsuite)\n");
|
||||||
|
|
||||||
printf("\nchecking specific pkg-config database entries:\n\n");
|
printf("\nchecking specific pkg-config database entries:\n\n");
|
||||||
|
|
||||||
|
@ -614,6 +618,17 @@ usage(void)
|
||||||
printf("\nreport bugs to <%s>.\n", PACKAGE_BUGREPORT);
|
printf("\nreport bugs to <%s>.\n", PACKAGE_BUGREPORT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
relocate_path(const char *path)
|
||||||
|
{
|
||||||
|
char buf[PKGCONF_BUFSIZE];
|
||||||
|
|
||||||
|
pkgconf_strlcpy(buf, path, sizeof buf);
|
||||||
|
pkgconf_path_relocate(buf, sizeof buf);
|
||||||
|
|
||||||
|
printf("%s\n", buf);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
@ -678,6 +693,8 @@ main(int argc, char *argv[])
|
||||||
{ "path", no_argument, &want_flags, PKG_PATH },
|
{ "path", no_argument, &want_flags, PKG_PATH },
|
||||||
{ "with-path", required_argument, NULL, 42 },
|
{ "with-path", required_argument, NULL, 42 },
|
||||||
{ "prefix-variable", required_argument, NULL, 43 },
|
{ "prefix-variable", required_argument, NULL, 43 },
|
||||||
|
{ "define-prefix", no_argument, &want_flags, PKG_DEFINE_PREFIX },
|
||||||
|
{ "relocate", required_argument, NULL, 45 },
|
||||||
{ NULL, 0, NULL, 0 }
|
{ NULL, 0, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -717,6 +734,9 @@ main(int argc, char *argv[])
|
||||||
case 43:
|
case 43:
|
||||||
pkgconf_client_set_prefix_varname(&pkg_client, pkg_optarg);
|
pkgconf_client_set_prefix_varname(&pkg_client, pkg_optarg);
|
||||||
break;
|
break;
|
||||||
|
case 45:
|
||||||
|
relocate_path(pkg_optarg);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
case '?':
|
case '?':
|
||||||
case ':':
|
case ':':
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
@ -787,6 +807,9 @@ main(int argc, char *argv[])
|
||||||
if ((want_flags & PKG_NO_CACHE) == PKG_NO_CACHE)
|
if ((want_flags & PKG_NO_CACHE) == PKG_NO_CACHE)
|
||||||
want_client_flags |= PKGCONF_PKG_PKGF_NO_CACHE;
|
want_client_flags |= PKGCONF_PKG_PKGF_NO_CACHE;
|
||||||
|
|
||||||
|
if ((want_flags & PKG_DEFINE_PREFIX) == PKG_DEFINE_PREFIX)
|
||||||
|
want_client_flags |= PKGCONF_PKG_PKGF_REDEFINE_PREFIX;
|
||||||
|
|
||||||
if ((want_flags & PKG_NO_UNINSTALLED) == PKG_NO_UNINSTALLED || getenv("PKG_CONFIG_DISABLE_UNINSTALLED") != NULL)
|
if ((want_flags & PKG_NO_UNINSTALLED) == PKG_NO_UNINSTALLED || getenv("PKG_CONFIG_DISABLE_UNINSTALLED") != NULL)
|
||||||
want_client_flags |= PKGCONF_PKG_PKGF_NO_UNINSTALLED;
|
want_client_flags |= PKGCONF_PKG_PKGF_NO_UNINSTALLED;
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,8 @@ tests_init \
|
||||||
nolibs \
|
nolibs \
|
||||||
nocflags \
|
nocflags \
|
||||||
arbitary_path \
|
arbitary_path \
|
||||||
with_path
|
with_path \
|
||||||
|
relocatable
|
||||||
|
|
||||||
noargs_body()
|
noargs_body()
|
||||||
{
|
{
|
||||||
|
@ -289,3 +290,11 @@ arbitary_path_body()
|
||||||
-o inline:"-L/test/lib -lfoo \n" \
|
-o inline:"-L/test/lib -lfoo \n" \
|
||||||
pkgconf --libs foo.pc
|
pkgconf --libs foo.pc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
relocatable_body()
|
||||||
|
{
|
||||||
|
basedir=$(pkgconf --relocate ${selfdir})
|
||||||
|
atf_check \
|
||||||
|
-o inline:"${basedir}/lib-relocatable\n" \
|
||||||
|
pkgconf --define-prefix --variable=prefix ${basedir}/lib-relocatable/lib/pkgconfig/foo.pc
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
prefix=/test
|
||||||
|
exec_prefix=${prefix}
|
||||||
|
libdir=${prefix}/lib
|
||||||
|
includedir=${prefix}/include
|
||||||
|
|
||||||
|
Name: foo
|
||||||
|
Description: A testing pkg-config file
|
||||||
|
Version: 1.2.3
|
||||||
|
Libs: -L${libdir} -lfoo
|
||||||
|
Cflags: -fPIC -I${includedir}/foo
|
||||||
|
Cflags.private: -DFOO_STATIC
|
Loading…
Reference in New Issue