add support for making paths relocatable (closes #103)

pull/109/head
William Pitcock 2017-01-20 00:58:48 -06:00
parent bd6be71115
commit 7237b811e7
6 changed files with 97 additions and 2 deletions

View File

@ -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 \

View File

@ -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

View File

@ -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 '=':
pkgconf_tuple_add(client, &pkg->vars, key, value, true); if (strcmp(key, client->prefix_varname) || !(client->flags & PKGCONF_PKG_PKGF_REDEFINE_PREFIX))
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
View File

@ -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;

View File

@ -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
}

View File

@ -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