forked from ariadne/pkgconf
libpkgconf: refactor building the dir lists into separate concerns
parent
854490c5b9
commit
6b0e346c28
|
@ -711,6 +711,7 @@ main(int argc, char *argv[])
|
|||
char *logfile_arg = NULL;
|
||||
char *want_env_prefix = NULL;
|
||||
unsigned int want_client_flags = PKGCONF_PKG_PKGF_NONE;
|
||||
const pkgconf_cross_personality_t *personality;
|
||||
|
||||
want_flags = 0;
|
||||
|
||||
|
@ -789,7 +790,8 @@ main(int argc, char *argv[])
|
|||
pkgconf_client_set_trace_handler(&pkg_client, error_handler, NULL);
|
||||
}
|
||||
|
||||
pkgconf_client_init(&pkg_client, error_handler, NULL, pkgconf_cross_personality_default());
|
||||
personality = pkgconf_cross_personality_default();
|
||||
pkgconf_client_init(&pkg_client, error_handler, NULL, personality);
|
||||
|
||||
while ((ret = pkg_getopt_long_only(argc, argv, "", options, NULL)) != -1)
|
||||
{
|
||||
|
@ -983,7 +985,7 @@ main(int argc, char *argv[])
|
|||
pkgconf_client_set_flags(&pkg_client, want_client_flags);
|
||||
|
||||
/* at this point, want_client_flags should be set, so build the dir list */
|
||||
pkgconf_pkg_dir_list_build(&pkg_client);
|
||||
pkgconf_client_dir_list_build(&pkg_client, personality);
|
||||
|
||||
if (required_pkgconfig_version != NULL)
|
||||
{
|
||||
|
|
|
@ -45,6 +45,27 @@ trace_path_list(const pkgconf_client_t *client, const char *desc, pkgconf_list_t
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* !doc
|
||||
*
|
||||
* .. c:function:: void pkgconf_client_dir_list_build(pkgconf_client_t *client)
|
||||
*
|
||||
* Bootstraps the package search paths. If the ``PKGCONF_PKG_PKGF_ENV_ONLY`` `flag` is set on the client,
|
||||
* then only the ``PKG_CONFIG_PATH`` environment variable will be used, otherwise both the
|
||||
* ``PKG_CONFIG_PATH`` and ``PKG_CONFIG_LIBDIR`` environment variables will be used.
|
||||
*
|
||||
* :param pkgconf_client_t* client: The pkgconf client object to bootstrap.
|
||||
* :return: nothing
|
||||
*/
|
||||
void
|
||||
pkgconf_client_dir_list_build(pkgconf_client_t *client, const pkgconf_cross_personality_t *personality)
|
||||
{
|
||||
pkgconf_path_build_from_environ("PKG_CONFIG_PATH", NULL, &client->dir_list, true);
|
||||
|
||||
if (!(client->flags & PKGCONF_PKG_PKGF_ENV_ONLY) && (pkgconf_path_build_from_environ("PKG_CONFIG_LIBDIR", NULL, &client->dir_list, true)) < 1)
|
||||
pkgconf_path_copy_list(&client->dir_list, &personality->dir_list);
|
||||
}
|
||||
|
||||
/*
|
||||
* !doc
|
||||
*
|
||||
|
|
|
@ -210,6 +210,7 @@ PKGCONF_API pkgconf_error_handler_func_t pkgconf_client_get_error_handler(const
|
|||
PKGCONF_API void pkgconf_client_set_error_handler(pkgconf_client_t *client, pkgconf_error_handler_func_t error_handler, void *error_handler_data);
|
||||
PKGCONF_API pkgconf_error_handler_func_t pkgconf_client_get_trace_handler(const pkgconf_client_t *client);
|
||||
PKGCONF_API void pkgconf_client_set_trace_handler(pkgconf_client_t *client, pkgconf_error_handler_func_t trace_handler, void *trace_handler_data);
|
||||
PKGCONF_API void pkgconf_client_dir_list_build(pkgconf_client_t *client, const pkgconf_cross_personality_t *personality);
|
||||
|
||||
/* personality.c */
|
||||
PKGCONF_API const pkgconf_cross_personality_t *pkgconf_cross_personality_default(void);
|
||||
|
@ -282,7 +283,6 @@ PKGCONF_API pkgconf_pkg_t *pkgconf_builtin_pkg_get(const char *name);
|
|||
|
||||
PKGCONF_API int pkgconf_compare_version(const char *a, const char *b);
|
||||
PKGCONF_API pkgconf_pkg_t *pkgconf_scan_all(pkgconf_client_t *client, void *ptr, pkgconf_pkg_iteration_func_t func);
|
||||
PKGCONF_API void pkgconf_pkg_dir_list_build(pkgconf_client_t *client);
|
||||
|
||||
/* parse.c */
|
||||
PKGCONF_API pkgconf_pkg_t *pkgconf_pkg_new_from_file(pkgconf_client_t *client, const char *path, FILE *f);
|
||||
|
|
|
@ -22,6 +22,54 @@ static pkgconf_cross_personality_t default_personality = {
|
|||
.name = "default",
|
||||
};
|
||||
|
||||
static inline void
|
||||
build_default_search_path(pkgconf_list_t* dirlist)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
char namebuf[MAX_PATH];
|
||||
char outbuf[MAX_PATH];
|
||||
char *p;
|
||||
|
||||
int sizepath = GetModuleFileName(NULL, namebuf, sizeof namebuf);
|
||||
char * winslash;
|
||||
namebuf[sizepath] = '\0';
|
||||
while ((winslash = strchr (namebuf, '\\')) != NULL)
|
||||
{
|
||||
*winslash = '/';
|
||||
}
|
||||
p = strrchr(namebuf, '/');
|
||||
if (p == NULL)
|
||||
pkgconf_path_split(PKG_DEFAULT_PATH, dirlist, true);
|
||||
|
||||
*p = '\0';
|
||||
pkgconf_strlcpy(outbuf, namebuf, sizeof outbuf);
|
||||
pkgconf_strlcat(outbuf, "/", sizeof outbuf);
|
||||
pkgconf_strlcat(outbuf, "../lib/pkgconfig", sizeof outbuf);
|
||||
pkgconf_path_add(outbuf, dirlist, true);
|
||||
pkgconf_strlcpy(outbuf, namebuf, sizeof outbuf);
|
||||
pkgconf_strlcat(outbuf, "/", sizeof outbuf);
|
||||
pkgconf_strlcat(outbuf, "../share/pkgconfig", sizeof outbuf);
|
||||
pkgconf_path_add(outbuf, dirlist, true);
|
||||
#elif __HAIKU__
|
||||
char **paths;
|
||||
size_t count;
|
||||
if (find_paths(B_FIND_PATH_DEVELOP_LIB_DIRECTORY, "pkgconfig", &paths, &count) == B_OK) {
|
||||
for (size_t i = 0; i < count; i++)
|
||||
pkgconf_path_add(paths[i], dirlist, true);
|
||||
free(paths);
|
||||
paths = NULL;
|
||||
}
|
||||
if (find_paths(B_FIND_PATH_DATA_DIRECTORY, "pkgconfig", &paths, &count) == B_OK) {
|
||||
for (size_t i = 0; i < count; i++)
|
||||
pkgconf_path_add(paths[i], dirlist, true);
|
||||
free(paths);
|
||||
paths = NULL;
|
||||
}
|
||||
#else
|
||||
pkgconf_path_split(PKG_DEFAULT_PATH, dirlist, true);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* !doc
|
||||
*
|
||||
|
@ -38,6 +86,8 @@ pkgconf_cross_personality_default(void)
|
|||
if (default_personality_init)
|
||||
return &default_personality;
|
||||
|
||||
build_default_search_path(&default_personality.dir_list);
|
||||
|
||||
pkgconf_path_split(SYSTEM_LIBDIR, &default_personality.filter_libdirs, true);
|
||||
pkgconf_path_split(SYSTEM_INCLUDEDIR, &default_personality.filter_includedirs, true);
|
||||
|
||||
|
|
|
@ -49,54 +49,6 @@ str_has_suffix(const char *str, const char *suffix)
|
|||
return !strncasecmp(str + str_len - suf_len, suffix, suf_len);
|
||||
}
|
||||
|
||||
static inline void
|
||||
build_default_pkgconfig_path(pkgconf_list_t* dirlist)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
char namebuf[MAX_PATH];
|
||||
char outbuf[MAX_PATH];
|
||||
char *p;
|
||||
|
||||
int sizepath = GetModuleFileName(NULL, namebuf, sizeof namebuf);
|
||||
char * winslash;
|
||||
namebuf[sizepath] = '\0';
|
||||
while ((winslash = strchr (namebuf, '\\')) != NULL)
|
||||
{
|
||||
*winslash = '/';
|
||||
}
|
||||
p = strrchr(namebuf, '/');
|
||||
if (p == NULL)
|
||||
pkgconf_path_split(PKG_DEFAULT_PATH, dirlist, true);
|
||||
|
||||
*p = '\0';
|
||||
pkgconf_strlcpy(outbuf, namebuf, sizeof outbuf);
|
||||
pkgconf_strlcat(outbuf, "/", sizeof outbuf);
|
||||
pkgconf_strlcat(outbuf, "../lib/pkgconfig", sizeof outbuf);
|
||||
pkgconf_path_add(outbuf, dirlist, true);
|
||||
pkgconf_strlcpy(outbuf, namebuf, sizeof outbuf);
|
||||
pkgconf_strlcat(outbuf, "/", sizeof outbuf);
|
||||
pkgconf_strlcat(outbuf, "../share/pkgconfig", sizeof outbuf);
|
||||
pkgconf_path_add(outbuf, dirlist, true);
|
||||
#elif __HAIKU__
|
||||
char **paths;
|
||||
size_t count;
|
||||
if (find_paths(B_FIND_PATH_DEVELOP_LIB_DIRECTORY, "pkgconfig", &paths, &count) == B_OK) {
|
||||
for (size_t i = 0; i < count; i++)
|
||||
pkgconf_path_add(paths[i], dirlist, true);
|
||||
free(paths);
|
||||
paths = NULL;
|
||||
}
|
||||
if (find_paths(B_FIND_PATH_DATA_DIRECTORY, "pkgconfig", &paths, &count) == B_OK) {
|
||||
for (size_t i = 0; i < count; i++)
|
||||
pkgconf_path_add(paths[i], dirlist, true);
|
||||
free(paths);
|
||||
paths = NULL;
|
||||
}
|
||||
#else
|
||||
pkgconf_path_split(PKG_DEFAULT_PATH, dirlist, true);
|
||||
#endif
|
||||
}
|
||||
|
||||
static const char *
|
||||
pkg_get_parent_dir(pkgconf_pkg_t *pkg, char *buf, size_t buflen)
|
||||
{
|
||||
|
@ -112,27 +64,6 @@ pkg_get_parent_dir(pkgconf_pkg_t *pkg, char *buf, size_t buflen)
|
|||
return buf;
|
||||
}
|
||||
|
||||
/*
|
||||
* !doc
|
||||
*
|
||||
* .. c:function:: void pkgconf_pkg_dir_list_build(pkgconf_client_t *client)
|
||||
*
|
||||
* Bootstraps the package search paths. If the ``PKGCONF_PKG_PKGF_ENV_ONLY`` `flag` is set on the client,
|
||||
* then only the ``PKG_CONFIG_PATH`` environment variable will be used, otherwise both the
|
||||
* ``PKG_CONFIG_PATH`` and ``PKG_CONFIG_LIBDIR`` environment variables will be used.
|
||||
*
|
||||
* :param pkgconf_client_t* client: The pkgconf client object to bootstrap.
|
||||
* :return: nothing
|
||||
*/
|
||||
void
|
||||
pkgconf_pkg_dir_list_build(pkgconf_client_t *client)
|
||||
{
|
||||
pkgconf_path_build_from_environ("PKG_CONFIG_PATH", NULL, &client->dir_list, true);
|
||||
|
||||
if (!(client->flags & PKGCONF_PKG_PKGF_ENV_ONLY) && (pkgconf_path_build_from_environ("PKG_CONFIG_LIBDIR", NULL, &client->dir_list, true)) < 1)
|
||||
build_default_pkgconfig_path(&client->dir_list);
|
||||
}
|
||||
|
||||
typedef void (*pkgconf_pkg_parser_keyword_func_t)(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, const char *keyword, const size_t lineno, const ptrdiff_t offset, char *value);
|
||||
typedef struct {
|
||||
const char *keyword;
|
||||
|
|
Loading…
Reference in New Issue