0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-25 23:14:13 +01:00

configure/ircd: Overhaul install system directory related.

This commit is contained in:
Jason Volk 2018-08-12 11:56:53 -07:00
parent e388d28585
commit 8fb580aaf5
8 changed files with 161 additions and 234 deletions

View file

@ -9,7 +9,7 @@ AC_INIT([construct], [1.0])
AC_GNU_SOURCE AC_GNU_SOURCE
AC_USE_SYSTEM_EXTENSIONS AC_USE_SYSTEM_EXTENSIONS
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
AC_PREFIX_DEFAULT($HOME/ircd) AC_PREFIX_DEFAULT([/])
AC_PATH_PROG(AUTOMAKE, automake) AC_PATH_PROG(AUTOMAKE, automake)
AC_PATH_PROG(ACLOCAL, aclocal) AC_PATH_PROG(ACLOCAL, aclocal)
@ -713,8 +713,7 @@ AM_COND_IF(LINUX,
AC_ARG_ENABLE(aio, AC_HELP_STRING([--disable-aio], [Disable kernel AIO support]), AC_ARG_ENABLE(aio, AC_HELP_STRING([--disable-aio], [Disable kernel AIO support]),
[ [
aio=$enableval aio=$enableval
], ], [
[
aio=yes aio=yes
]) ])
], []) ], [])
@ -736,180 +735,96 @@ dnl
PKG_PROG_PKG_CONFIG PKG_PROG_PKG_CONFIG
if test "$prefix" = "NONE"; then if test "$prefix" = "NONE"; then
AC_DEFINE_UNQUOTED(RB_PREFIX, "$ac_default_prefix", [Prefix where librb is installed.]) prefix="$ac_default_prefix"
else else
dnl Don't get bitten by Cygwin's stupidity if the user specified dnl Don't get bitten by Cygwin's stupidity if the user specified
dnl a custom prefix with a trailing slash dnl a custom prefix with a trailing slash
prefix=`echo $prefix | sed 's/\/$//'` prefix=`echo $prefix | sed 's/\/$//'`
AC_DEFINE_UNQUOTED(RB_PREFIX, "$prefix", [Prefix where librb is installed.])
AC_SUBST(RB_PREFIX)
fi fi
RB_DEFINE_UNQUOTED(PREFIX, ["$prefix"], [Prefix of IRCd install])
AC_SUBST_DIR([prefix])
if test "$prefix" = "NONE"; then dnl
AC_DEFINE_UNQUOTED(IRCD_PREFIX, "$ac_default_prefix", [Prefix where the ircd is installed.]) dnl bindir
else dnl
dnl Don't get bitten by Cygwin's stupidity if the user specified
dnl a custom prefix with a trailing slash
prefix=`echo $prefix | sed 's/\/$//'`
AC_DEFINE_UNQUOTED(IRCD_PREFIX, "$prefix", [Prefix where the ircd is installed.])
fi
RB_DEFINE_UNQUOTED([BIN_DIR], ["$(bindir)"], [Directory where binary executables are to be found.])
AC_SUBST_DIR([bindir])
AC_ARG_ENABLE([fhs-paths], dnl
[AS_HELP_STRING([--enable-fhs-paths], [Use more FHS-like pathnames (for packagers).])], dnl libdir
[], dnl
[dnl detect if the user appears to want --enable-fhs-paths
AS_IF([test "$libexecdir" = '${exec_prefix}/libexec' && \
test "$localstatedir" = '${prefix}/var' && \
test "$libdir" = '${exec_prefix}/lib'],
[enable_fhs_paths=no],
[enable_fhs_paths=yes])
])
dnl use directory structure of cached as default (hack)
AS_IF([test "x$enable_fhs_paths" = "xyes"],
[dnl Avoid name collisions.
pkglibexecdir='${libexecdir}/${PACKAGE_TARNAME}'
rundir=${rundir-'${prefix}/run'}
pkgrundir='${rundir}/${PACKAGE_TARNAME}'
pkglocalstatedir='${localstatedir}/${PACKAGE_TARNAME}'
AC_DEFINE([ENABLE_FHS_PATHS], [1], [Uncomment if FHS pathnames are enabled])],
[libexecdir='${bindir}'
pkglibexecdir='${libexecdir}'
rundir='${sysconfdir}'
pkgrundir='${rundir}'
localstatedir='${prefix}'
pkglocalstatedir='${sysconfdir}'])
pkglibdir='${libdir}/${PACKAGE_TARNAME}'
AC_SUBST([pkglibdir])
AC_SUBST([rundir])
AC_SUBST([pkgrundir])
AC_SUBST([pkglocalstatedir])
AC_DEFINE_DIR([PKGLOCALSTATEDIR], [pkglocalstatedir], [[Directory in which to store state, such as ban database]])
AC_SUBST([pkglibexecdir])
AC_DEFINE_DIR([PKGLIBEXECDIR], [pkglibexecdir], [Directory where binaries the IRCd itself spawns live])
RB_DEFINE_UNQUOTED([LIB_DIR], ["$(libdir)"], [Prefix where libs are installed.])
AC_SUBST_DIR([libdir])
dnl
dnl localstatedir
dnl
dnl Avoid name collisions.
RB_DEFINE_UNQUOTED([LOCALSTATE_DIR], ["$(localstatedir)"], [Prefix where db and logs go.])
AC_SUBST_DIR([localstatedir])
dnl dnl
dnl Check for --with-confdir [deprecated, use --sysconfdir instead] dnl Check for --with-confdir [deprecated, use --sysconfdir instead]
dnl dnl
AC_ARG_WITH([confdir], RB_DEFINE_UNQUOTED([CONF_DIR], ["$(sysconfdir)"], [Prefix where config files are installed.])
[AC_HELP_STRING([--with-confdir=DIR], AC_SUBST_DIR([sysconfdir])
[Directory to install config files [deprecated, use --sysconfdir instead].])],
[ sysconfdir=`echo $withval | sed 's/\/$//'` ],
[ confdir='etc' ])
RB_DEFINE_UNQUOTED([ETC_DIR], ["${prefix}/${confdir}"], [Prefix where config files are installed.])
dnl dnl
dnl Check for --with-bindir dnl Check for --with-dbdir
dnl dnl
AC_MSG_CHECKING([whether to modify binary directory]) AC_MSG_CHECKING([whether to modify database directory])
AC_ARG_WITH(bindir, AC_ARG_WITH(dbdir, AC_HELP_STRING([--with-dbdir=DIR], [Directory where databases are located]),
AC_HELP_STRING([--with-bindir=DIR], [
[Directory where binary executables are placed.]), AC_MSG_RESULT(yes)
[ logdir=`echo $withval | sed 's/\/$//'` dbdir=`echo $withval | sed 's/\/$//'`
AC_MSG_RESULT(yes)], ], [
[ AS_IF([test "x$enable_fhs_paths" = "xyes"], AC_MSG_RESULT(no)
[bindir="${prefix}/bin"], dbdir="${localstatedir}/db/${PACKAGE_TARNAME}"
[bindir="${prefix}/bin"]) ])
AC_MSG_RESULT(no)])
RB_DEFINE_UNQUOTED([BIN_DIR], ["${bindir}"], [Directory where binary executables are to be found.])
AC_SUBST_DIR([bindir])
RB_DEFINE_UNQUOTED([DB_DIR], ["$dbdir"], [Directory where databases are located])
AC_SUBST_DIR([dbdir])
dnl dnl
dnl Check for --with-logdir dnl Check for --with-logdir
dnl dnl
AC_MSG_CHECKING([whether to modify logdir]) AC_MSG_CHECKING([whether to modify logdir])
AC_ARG_WITH(logdir, AC_ARG_WITH(logdir, AC_HELP_STRING([--with-logdir=DIR], [Directory where to write logfiles.]),
AC_HELP_STRING([--with-logdir=DIR], [
[Directory where to write logfiles.]), AC_MSG_RESULT(yes)
[ logdir=`echo $withval | sed 's/\/$//'` logdir=`echo $withval | sed 's/\/$//'`
AC_MSG_RESULT(yes)], ], [
[ AS_IF([test "x$enable_fhs_paths" = "xyes"], AC_MSG_RESULT(no)
[logdir="${prefix}/var/log"], logdir="${localstatedir}/log/${PACKAGE_TARNAME}"
[logdir="${prefix}/var/${PACKAGE_TARNAME}/log"]) ])
AC_MSG_RESULT(no)])
RB_DEFINE_UNQUOTED([LOG_DIR], ["${logdir}"], [Prefix where to write logfiles.]) RB_DEFINE_UNQUOTED([LOG_DIR], ["$logdir"], [Prefix where to write logfiles.])
AC_SUBST_DIR([logdir]) AC_SUBST_DIR([logdir])
dnl
dnl Check for --with-helpdir
dnl
AC_MSG_CHECKING([whether to modify helpdir])
AC_ARG_WITH(helpdir,
AC_HELP_STRING([--with-helpdir=DIR],
[Directory to install help files.]),
[ helpdir=`echo $withval | sed 's/\/$//'`
AC_MSG_RESULT(yes) ],
[ AS_IF([test "x$enable_fhs_paths" = "xyes"],
[helpdir="${prefix}/share/help"],
[helpdir="${prefix}/share/${PACKAGE_TARNAME}/help"])
AC_MSG_RESULT(no) ])
RB_DEFINE_UNQUOTED([HELP_DIR], ["${helpdir}"], [Prefix where help files are installed.])
AC_SUBST_DIR([helpdir])
dnl dnl
dnl Check for --with-moduledir dnl Check for --with-moduledir
dnl dnl
AC_MSG_CHECKING([whether to modify moduledir]) AC_MSG_CHECKING([whether to modify moduledir])
AC_ARG_WITH(moduledir, AC_ARG_WITH(moduledir, [AC_HELP_STRING([--with-moduledir=DIR], [Directory to install modules.])],
[AC_HELP_STRING([--with-moduledir=DIR], [
[Directory to install modules.])], AC_MSG_RESULT(yes)
[ moduledir=`echo $withval | sed 's/\/$//'` moduledir=`echo $withval | sed 's/\/$//'`
AC_MSG_RESULT(yes)], ], [
[ AS_IF([test "x$enable_fhs_paths" = "xyes"], AC_MSG_RESULT(no)
[moduledir="${prefix}/lib/modules"], moduledir="${libdir}/modules/${PACKAGE_TARNAME}"
[moduledir="${prefix}/lib/${PACKAGE_TARNAME}/modules"]) ])
AC_MSG_RESULT(no)
]) RB_DEFINE_UNQUOTED([MODULE_DIR], ["$moduledir"], [Prefix where modules are installed.])
RB_DEFINE_UNQUOTED([MODULE_DIR], ["${moduledir}"], [Prefix where modules are installed.])
AC_SUBST_DIR([moduledir]) AC_SUBST_DIR([moduledir])
dnl
dnl Check for --with-rundir
dnl
AC_MSG_CHECKING([whether or modify rundir])
AC_ARG_WITH([rundir],
[AC_HELP_STRING([--with-rundir=DIR],
[Directory in which to store pidfile.])],
[AC_MSG_RESULT([yes])
rundir=`echo $withval | sed 's/\/$//'`],
[AC_MSG_RESULT([no])
AS_IF([test "x$enable_fhs_paths" = "xyes"],
[rundir="${prefix}/var/run"],
[rundir="${prefix}/${PACKAGE_TARNAME}/run"])])
AC_SUBST([rundir])
AC_DEFINE_DIR([PKGRUNDIR], ["${rundir}"], [Directory to store pidfile in.])
dnl
dnl Check for --with-program-prefix
dnl
dnl Installed utility program prefixes (does not affect binaries
dnl installed into pkglibexecdir)
AC_MSG_CHECKING([for program prefix])
AC_ARG_WITH([program-prefix],
[AS_HELP_STRING([--with-program-prefix=], [If set, programs installed into PATH will be installed with names prefixed by this prefix.])],
[test "x$with_program_prefix" = "xno" && with_program_prefix=],
[with_program_prefix=])
AC_MSG_RESULT(["$with_program_prefix"])
PROGRAM_PREFIX="$with_program_prefix"
AC_SUBST([PROGRAM_PREFIX])
AC_DEFINE_UNQUOTED([PROGRAM_PREFIX], ["$with_program_prefix"], [String with which all programs intended to be in PATH are prefixed.])
dnl *************************************************************************** dnl ***************************************************************************
dnl dnl
dnl Third party dnl Third party

View file

@ -92,7 +92,7 @@ try
// argument or fall back to the default. // argument or fall back to the default.
const std::string confpath const std::string confpath
{ {
configfile?: fs::get(fs::IRCD_CONF) configfile?: ""
}; };
// Associates libircd with our io_context and posts the initial routines // Associates libircd with our io_context and posts the initial routines

View file

@ -36,38 +36,17 @@ namespace ircd::fs
{ {
struct aio; struct aio;
struct init; struct init;
enum index :int;
IRCD_EXCEPTION(ircd::error, error) IRCD_EXCEPTION(ircd::error, error)
IRCD_EXCEPTION(error, filesystem_error) IRCD_EXCEPTION(error, filesystem_error)
constexpr auto DPATH = IRCD_PREFIX; constexpr size_t PATH_MAX { 2048 };
constexpr auto BINPATH = IRCD_PREFIX "/bin";
constexpr auto ETCPATH = RB_ETC_DIR;
constexpr auto LOGPATH = RB_LOG_DIR;
constexpr auto MODPATH = RB_MODULE_DIR;
constexpr auto CPATH = RB_ETC_DIR "/ircd.conf"; // ircd.conf file
constexpr auto SPATH = RB_BIN_DIR "/" BRANDING_NAME; // ircd executable
constexpr auto DBPATH = PKGLOCALSTATEDIR "/db"; // database prefix
// Below are the elements for default paths. extern aio *aioctx;
enum index
{
PREFIX,
BIN,
ETC,
LOG,
LIBEXEC,
MODULES,
IRCD_CONF,
IRCD_EXEC,
DB,
_NUM_
};
const char *get(index) noexcept;
const char *name(index) noexcept;
string_view get(index) noexcept;
string_view name(index) noexcept;
std::string make_path(const vector_view<const string_view> &); std::string make_path(const vector_view<const string_view> &);
bool exists(const string_view &path); bool exists(const string_view &path);
@ -80,17 +59,29 @@ namespace ircd::fs
bool rename(std::nothrow_t, const string_view &old, const string_view &new_); bool rename(std::nothrow_t, const string_view &old, const string_view &new_);
void rename(const string_view &old, const string_view &new_); void rename(const string_view &old, const string_view &new_);
bool remove(std::nothrow_t, const string_view &path); bool remove(std::nothrow_t, const string_view &path);
bool remove(const string_view &path); bool remove(const string_view &path);
std::string cwd();
void chdir(const string_view &path); void chdir(const string_view &path);
bool mkdir(const string_view &path); bool mkdir(const string_view &path);
extern aio *aioctx; std::string cwd();
} }
/// elements for default paths.
enum ircd::fs::index
:int
{
PREFIX,
BIN,
CONF,
DB,
LOG,
MODULES,
_NUM_
};
#include "fd.h" #include "fd.h"
#include "read.h" #include "read.h"
#include "write.h" #include "write.h"

View file

@ -139,4 +139,5 @@ libircd_la_SOURCES += \
endif endif
install-data-local: install-data-local:
test -d $(prefix)/@logdir@ || mkdir -p $(prefix)/@logdir@ test -d $(logdir) || mkdir -p $(logdir)
test -d $(dbdir) || mkdir -p $(dbdir)

View file

@ -10,8 +10,10 @@
namespace ircd::conf namespace ircd::conf
{ {
extern const string_view default_filename;
std::string _config; std::string _config;
static std::string read_json_file(string_view filename); static std::string read_json_file(std::string filename);
} }
//TODO: X //TODO: X
@ -21,10 +23,16 @@ ircd::conf::config
_config _config
}; };
decltype(ircd::conf::default_filename)
ircd::conf::default_filename
{
"ircd.conf"
};
void void
ircd::conf::init(const string_view &filename) ircd::conf::init(const string_view &filename)
{ {
_config = read_json_file(filename); _config = read_json_file(std::string{filename});
} }
bool bool
@ -149,7 +157,7 @@ const
// //
std::string std::string
ircd::conf::read_json_file(string_view filename) ircd::conf::read_json_file(std::string filename)
try try
{ {
if(!filename.empty()) if(!filename.empty())
@ -159,7 +167,10 @@ try
}; };
if(filename.empty()) if(filename.empty())
filename = fs::CPATH; filename = fs::make_path(
{
fs::get(fs::CONF), conf::default_filename
});
if(!fs::exists(filename)) if(!fs::exists(filename))
return {}; return {};

View file

@ -19,10 +19,6 @@ namespace filesystem = boost::filesystem;
namespace ircd::fs namespace ircd::fs
{ {
enum { NAME, PATH };
using ent = std::pair<std::string, std::string>;
extern const std::array<ent, num_of<index>()> paths;
filesystem::path path(std::string); filesystem::path path(std::string);
filesystem::path path(const string_view &); filesystem::path path(const string_view &);
filesystem::path path(const vector_view<const string_view> &); filesystem::path path(const vector_view<const string_view> &);
@ -33,20 +29,6 @@ decltype(ircd::fs::aioctx)
ircd::fs::aioctx ircd::fs::aioctx
{}; {};
decltype(ircd::fs::paths)
ircd::fs::paths
{{
{ "prefix", DPATH },
{ "binary dir", BINPATH },
{ "config", ETCPATH },
{ "log", LOGPATH },
{ "libexec dir", PKGLIBEXECDIR },
{ "modules", MODPATH },
{ "ircd.conf", CPATH },
{ "ircd binary", SPATH },
{ "db", DBPATH },
}};
ircd::fs::init::init() ircd::fs::init::init()
{ {
#ifdef IRCD_USE_AIO #ifdef IRCD_USE_AIO
@ -71,6 +53,55 @@ noexcept
assert(!aioctx); assert(!aioctx);
} }
//
// Compile-time path index
//
namespace ircd::fs
{
struct sysent;
extern const std::array<struct sysent, num_of<index>()> syspaths;
}
struct ircd::fs::sysent
{
string_view name;
string_view path;
};
decltype(ircd::fs::syspaths)
ircd::fs::syspaths
{{
{ "prefix", RB_PREFIX },
{ "binary dir", RB_BIN_DIR },
{ "database", RB_DB_DIR },
{ "conf", RB_CONF_DIR },
{ "log", RB_LOG_DIR },
{ "modules", RB_MODULE_DIR },
}};
ircd::string_view
ircd::fs::get(index index)
noexcept try
{
return syspaths.at(index).path;
}
catch(const std::out_of_range &e)
{
return {};
}
ircd::string_view
ircd::fs::name(index index)
noexcept try
{
return syspaths.at(index).name;
}
catch(const std::out_of_range &e)
{
return {};
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// //
// fs/stdin.h // fs/stdin.h
@ -355,7 +386,7 @@ catch(const std::exception &e)
namespace ircd::fs namespace ircd::fs
{ {
thread_local char path_buf[2048]; thread_local char path_buf[PATH_MAX];
static const char *path_str(const string_view &); static const char *path_str(const string_view &);
static uint posix_flags(const std::ios::open_mode &mode); static uint posix_flags(const std::ios::open_mode &mode);
} }
@ -481,6 +512,20 @@ noexcept(false)
// fs.h / misc // fs.h / misc
// //
std::string
ircd::fs::cwd()
try
{
return filesystem::current_path().string();
}
catch(const filesystem::filesystem_error &e)
{
throw filesystem_error
{
"%s", e.what()
};
}
void void
ircd::fs::chdir(const string_view &path) ircd::fs::chdir(const string_view &path)
try try
@ -509,20 +554,6 @@ catch(const filesystem::filesystem_error &e)
}; };
} }
std::string
ircd::fs::cwd()
try
{
return filesystem::current_path().string();
}
catch(const filesystem::filesystem_error &e)
{
throw filesystem_error
{
"%s", e.what()
};
}
bool bool
ircd::fs::remove(const string_view &path) ircd::fs::remove(const string_view &path)
try try
@ -703,25 +734,3 @@ ircd::fs::path(std::string s)
{ {
return filesystem::path(std::move(s)); return filesystem::path(std::move(s));
} }
const char *
ircd::fs::get(index index)
noexcept try
{
return std::get<PATH>(paths.at(index)).c_str();
}
catch(const std::out_of_range &e)
{
return nullptr;
}
const char *
ircd::fs::name(index index)
noexcept try
{
return std::get<NAME>(paths.at(index)).c_str();
}
catch(const std::out_of_range &e)
{
return nullptr;
}

View file

@ -473,7 +473,7 @@ namespace ircd::mods
decltype(ircd::mods::modroot) decltype(ircd::mods::modroot)
ircd::mods::modroot ircd::mods::modroot
{ {
ircd::fs::get(ircd::fs::MODULES) std::string{ircd::fs::get(ircd::fs::MODULES)}
}; };
decltype(ircd::mods::paths) decltype(ircd::mods::paths)

View file

@ -1878,7 +1878,7 @@ console_cmd__db__list(opt &out, const string_view &line)
{ {
const auto name const auto name
{ {
replace(lstrip(lstrip(path, fs::DBPATH), '/'), "/", ":") replace(lstrip(lstrip(path, fs::get(fs::DB)), '/'), "/", ":")
}; };
const auto &d const auto &d