diff --git a/contrib/pkgconf/libpkgconf/personality.c b/contrib/pkgconf/libpkgconf/personality.c --- a/contrib/pkgconf/libpkgconf/personality.c +++ b/contrib/pkgconf/libpkgconf/personality.c @@ -17,6 +17,11 @@ #include #include +#ifdef __FreeBSD__ +# include +# include +#endif + /* * !doc * @@ -77,6 +82,41 @@ free(paths); paths = NULL; } +#elif defined(__FreeBSD__) + pkgconf_buffer_t path1 = PKGCONF_BUFFER_INITIALIZER; + pkgconf_buffer_t path2 = PKGCONF_BUFFER_INITIALIZER; + char const * localbase; + char *str = NULL; + size_t len; + + localbase = getenv("LOCALBASE"); + + if (localbase == NULL) { + if ((str = malloc((len = PATH_MAX) + 1)) == NULL) + err(1, NULL); + while (sysctlbyname("user.localbase", str, &len, NULL, 0) < 0) { + if (errno != ENOMEM) + err(1, "sysctl(user.localbase)"); + if ((str = realloc(str, len + 1)) == NULL) + err(1, NULL); + } + str[len] = '\0'; + localbase = str; + } + + if (!pkgconf_buffer_append(&path1, localbase) || + !pkgconf_buffer_append(&path1, "/libdata/pkgconfig")) + err(1, NULL); + pkgconf_path_add(pkgconf_buffer_str(&path1), dirlist, false); + + pkgconf_path_add("/usr/libdata/pkgconfig", dirlist, false); + + if (!pkgconf_buffer_append(&path2, localbase) || + !pkgconf_buffer_append(&path2, "/share/pkgconfig")) + err(1, NULL); + pkgconf_path_add(pkgconf_buffer_str(&path2), dirlist, false); + + free(str); #else pkgconf_path_split(PKG_DEFAULT_PATH, dirlist, false); #endif @@ -308,6 +348,12 @@ #if ! defined(_WIN32) && ! defined(__HAIKU__) const char *envvar; #endif +#if defined(__FreeBSD__) + pkgconf_buffer_t path = PKGCONF_BUFFER_INITIALIZER; + char const * localbase; + char *str = NULL; + size_t len; +#endif out = load_personality_with_path(triplet, NULL, false); if (out != NULL) @@ -346,7 +392,35 @@ pkgconf_path_free(&plist); #endif +#ifdef __FreeBSD__ + localbase = getenv("LOCALBASE"); + + if (localbase == NULL) { + if ((str = malloc((len = PATH_MAX) + 1)) == NULL) + err(1, NULL); + while (sysctlbyname("user.localbase", str, &len, NULL, 0) < 0) { + if (errno != ENOMEM) + err(1, "sysctl(user.localbase)"); + if ((str = realloc(str, len + 1)) == NULL) + err(1, NULL); + } + str[len] = '\0'; + localbase = str; + } + + pkgconf_path_add("/usr/share/pkgconfig/personality.d", &plist, true); + pkgconf_path_add("/etc/pkgconfig/personality.d", &plist, true); + + if (!pkgconf_buffer_append(&path, localbase) || + !pkgconf_buffer_append(&path, + "/etc/pkgconfig/personality.d")) + err(1, NULL); + pkgconf_path_add(pkgconf_buffer_str(&path), &plist, true); + + free(str); +#else pkgconf_path_split(PERSONALITY_PATH, &plist, true); +#endif PKGCONF_FOREACH_LIST_ENTRY(plist.head, n) { diff --git a/lib/libpkgconf/Makefile b/lib/libpkgconf/Makefile --- a/lib/libpkgconf/Makefile +++ b/lib/libpkgconf/Makefile @@ -15,8 +15,6 @@ WARNS?= 3 -CFLAGS+= -DPERSONALITY_PATH=\"/usr/share/pkgconfig/personality.d:/etc/pkgconfig/personality.d:${LOCALBASE:U/usr/local}/etc/pkgconfig/personality.d\" -CFLAGS+= -DPKG_DEFAULT_PATH=\"${LOCALBASE:U/usr/local}/libdata/pkgconfig:/usr/libdata/pkgconfig:${LOCALBASE:U/usr/local}/share/pkgconfig\" CFLAGS+= -DSYSTEM_INCLUDEDIR=\"/usr/include\" CFLAGS+= -DSYSTEM_LIBDIR=\"/usr/lib\" CFLAGS+= -I${SRCTOP}/lib/libpkgconf -I${PKGCONFDIR}