]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - configure
Implement support for portable installations.
[user/henk/code/inspircd.git] / configure
index 328fefe1728bd6d8ef69add4d66e8835bcbb9437..9d064c693d97455c1fed77378dccd5e45e7997e1 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,17 +1,18 @@
 #!/usr/bin/env perl
-
 #
 # InspIRCd -- Internet Relay Chat Daemon
 #
-#   Copyright (C) 2012-2017 Peter Powell <petpow@saberuk.com>
-#   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
-#   Copyright (C) 2007, 2009 Dennis Friis <peavey@inspircd.org>
-#   Copyright (C) 2003, 2006-2008 Craig Edwards <craigedwards@brainbox.cc>
-#   Copyright (C) 2006-2008 Robin Burchell <robin+git@viroteck.net>
+#   Copyright (C) 2019 Matt Schatz <genius3000@g3k.solutions>
+#   Copyright (C) 2019 Anatole Denis <natolumin@rezel.net>
+#   Copyright (C) 2017 emerson <github@emersonveenstra.net>
+#   Copyright (C) 2013-2020 Sadie Powell <sadie@witchery.services>
+#   Copyright (C) 2012, 2019 Robby <robby@chatbelgie.be>
+#   Copyright (C) 2012 ChrisTX <xpipe@hotmail.de>
+#   Copyright (C) 2010 Daniel De Graaf <danieldg@inspircd.org>
 #   Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
-#   Copyright (C) 2007 John Brooks <john.brooks@dereferenced.net>
-#   Copyright (C) 2006 Oliver Lupton <oliverlupton@gmail.com>
-#   Copyright (C) 2003-2006 Craig McLure <craig@chatspike.net>
+#   Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
+#   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+#   Copyright (C) 2006-2008 Craig Edwards <brain@inspircd.org>
 #
 # This file is part of InspIRCd.  InspIRCd is free software: you can
 # redistribute it and/or modify it under the terms of the GNU General Public
@@ -37,7 +38,7 @@ use warnings FATAL => qw(all);
 
 use File::Basename        qw(basename);
 use File::Copy            ();
-use File::Spec::Functions qw(rel2abs);
+use File::Spec::Functions qw(catfile catdir rel2abs);
 use FindBin               qw($RealDir);
 use Getopt::Long          qw(GetOptions);
 use POSIX                 qw(getgid getuid);
@@ -55,10 +56,12 @@ my ($opt_binary_dir,
     $opt_disable_auto_extras,
     $opt_disable_interactive,
     $opt_distribution_label,
+    $opt_example_dir,
     $opt_gid,
     $opt_log_dir,
     $opt_manual_dir,
     $opt_module_dir,
+    $opt_portable,
     $opt_prefix,
     $opt_script_dir,
     $opt_socketengine,
@@ -86,10 +89,12 @@ exit 1 unless GetOptions(
        'disable-auto-extras'  => \$opt_disable_auto_extras,
        'disable-interactive'  => \$opt_disable_interactive,
        'distribution-label=s' => \$opt_distribution_label,
+       'example-dir=s'        => \$opt_example_dir,
        'gid=s'                => \$opt_gid,
        'log-dir=s'            => \$opt_log_dir,
        'manual-dir=s'         => \$opt_manual_dir,
        'module-dir=s'         => \$opt_module_dir,
+       'portable'             => \$opt_portable,
        'prefix=s'             => \$opt_prefix,
        'script-dir=s'         => \$opt_script_dir,
        'socketengine=s'       => \$opt_socketengine,
@@ -103,8 +108,8 @@ exit 1 unless GetOptions(
 );
 
 if (scalar(@opt_enableextras) + scalar(@opt_disableextras) > 0) {
-       @opt_enableextras = split /,/, join(',', @opt_enableextras);
-       @opt_disableextras = split /,/, join(',', @opt_disableextras);
+       @opt_enableextras = split /[, ]+/, join(',', @opt_enableextras);
+       @opt_disableextras = split /[, ]+/, join(',', @opt_disableextras);
        enable_extras(@opt_enableextras);
        disable_extras(@opt_disableextras);
        list_extras;
@@ -122,10 +127,12 @@ our $interactive = !(
        defined $opt_disable_auto_extras ||
        defined $opt_disable_interactive ||
        defined $opt_distribution_label ||
+       defined $opt_example_dir ||
        defined $opt_gid ||
        defined $opt_log_dir ||
        defined $opt_manual_dir ||
        defined $opt_module_dir ||
+       defined $opt_portable ||
        defined $opt_prefix ||
        defined $opt_script_dir ||
        defined $opt_socketengine ||
@@ -182,24 +189,38 @@ if (defined $opt_socketengine) {
 }
 $config{SOCKETENGINE} = $opt_socketengine // $socketengines[0];
 
-if (defined $opt_system) {
-       $config{BASE_DIR}   = $opt_prefix     // '/var/lib/inspircd';
-       $config{BINARY_DIR} = $opt_binary_dir // '/usr/sbin';
-       $config{CONFIG_DIR} = $opt_config_dir // '/etc/inspircd';
-       $config{DATA_DIR}   = $opt_data_dir   // '/var/inspircd';
-       $config{LOG_DIR}    = $opt_log_dir    // '/var/log/inspircd';
-       $config{MANUAL_DIR} = $opt_manual_dir // '/usr/share/man/man1';
-       $config{MODULE_DIR} = $opt_module_dir // '/usr/lib/inspircd';
-       $config{SCRIPT_DIR} = $opt_script_dir // '/usr/share/inspircd'
+if (defined $opt_portable) {
+       print_error '--portable and --system can not be used together!' if defined $opt_system;
+       $config{DESTDIR}     = catfile $RealDir, 'run', '';
+       $config{BASE_DIR}    = $opt_prefix      // '';
+       $config{BINARY_DIR}  = $opt_binary_dir  // 'bin';
+       $config{CONFIG_DIR}  = $opt_config_dir  // 'conf';
+       $config{DATA_DIR}    = $opt_data_dir    // 'data';
+       $config{EXAMPLE_DIR} = $opt_example_dir // catdir $config{CONFIG_DIR}, 'examples';
+       $config{LOG_DIR}     = $opt_log_dir     // 'logs';
+       $config{MANUAL_DIR}  = $opt_manual_dir  // 'manuals';
+       $config{MODULE_DIR}  = $opt_module_dir  // 'modules';
+       $config{SCRIPT_DIR}  = $opt_script_dir  // $config{BASE_DIR};
+} elsif (defined $opt_system) {
+       $config{BASE_DIR}    = $opt_prefix      // '/var/lib/inspircd';
+       $config{BINARY_DIR}  = $opt_binary_dir  // '/usr/sbin';
+       $config{CONFIG_DIR}  = $opt_config_dir  // '/etc/inspircd';
+       $config{DATA_DIR}    = $opt_data_dir    // '/var/inspircd';
+       $config{EXAMPLE_DIR} = $opt_example_dir // '/usr/share/doc/inspircd';
+       $config{LOG_DIR}     = $opt_log_dir     // '/var/log/inspircd';
+       $config{MANUAL_DIR}  = $opt_manual_dir  // '/usr/share/man/man1';
+       $config{MODULE_DIR}  = $opt_module_dir  // '/usr/lib/inspircd';
+       $config{SCRIPT_DIR}  = $opt_script_dir  // '/usr/share/inspircd'
 } else {
-       $config{BASE_DIR}   = $opt_prefix     // $config{BASE_DIR}   // rel2abs 'run';
-       $config{BINARY_DIR} = $opt_binary_dir // $config{BINARY_DIR} // rel2abs $config{BASE_DIR} . '/bin';
-       $config{CONFIG_DIR} = $opt_config_dir // $config{CONFIG_DIR} // rel2abs $config{BASE_DIR} . '/conf';
-       $config{DATA_DIR}   = $opt_data_dir   // $config{DATA_DIR}   // rel2abs $config{BASE_DIR} . '/data';
-       $config{LOG_DIR}    = $opt_log_dir    // $config{LOG_DIR}    // rel2abs $config{BASE_DIR} . '/logs';
-       $config{MANUAL_DIR} = $opt_manual_dir // $config{MANUAL_DIR} // rel2abs $config{BASE_DIR} . '/manuals';
-       $config{MODULE_DIR} = $opt_module_dir // $config{MODULE_DIR} // rel2abs $config{BASE_DIR} . '/modules';
-       $config{SCRIPT_DIR} = $opt_script_dir // $config{SCRIPT_DIR} // $config{BASE_DIR};
+       $config{BASE_DIR}    = rel2abs $opt_prefix // $config{BASE_DIR}    // catdir $RealDir,            'run';
+       $config{BINARY_DIR}  = $opt_binary_dir     // $config{BINARY_DIR}  // catdir $config{BASE_DIR},   'bin';
+       $config{CONFIG_DIR}  = $opt_config_dir     // $config{CONFIG_DIR}  // catdir $config{BASE_DIR},   'conf';
+       $config{DATA_DIR}    = $opt_data_dir       // $config{DATA_DIR}    // catdir $config{BASE_DIR},   'data';
+       $config{EXAMPLE_DIR} = $opt_example_dir    // $config{EXAMPLE_DIR} // catdir $config{CONFIG_DIR}, 'examples';
+       $config{LOG_DIR}     = $opt_log_dir        // $config{LOG_DIR}     // catdir $config{BASE_DIR},   'logs';
+       $config{MANUAL_DIR}  = $opt_manual_dir     // $config{MANUAL_DIR}  // catdir $config{BASE_DIR},   'manuals';
+       $config{MODULE_DIR}  = $opt_module_dir     // $config{MODULE_DIR}  // catdir $config{BASE_DIR},   'modules';
+       $config{SCRIPT_DIR}  = $opt_script_dir     // $config{SCRIPT_DIR}  // $config{BASE_DIR};
 }
 
 # Parse --gid=123 or --gid=foo and extract the group id.
@@ -220,6 +241,7 @@ unprivileged user/group to build and run as or pass the '--gid [id|name]' flag
 to specify an unprivileged group to run as.
 EOW
                if (!prompt_bool $interactive, "Are you sure you want to build as the $group[0] group?", 0) {
+                       # PACKAGERS: You do not need to delete this check. Use `--gid $(id -g)` or `--gid 0` instead.
                        say STDERR "If you are sure you want to build as the $group[0] group pass the --gid $group[2] flag." unless $interactive;
                        exit 1;
                }
@@ -246,6 +268,7 @@ unprivileged user/group to build and run as or pass the '--uid [id|name]' flag
 to specify an unprivileged user to run as.
 EOW
                if (!prompt_bool $interactive, "Are you sure you want to build as the $user[0] user?", 0) {
+                       # PACKAGERS: You do not need to delete this check. Use `--uid $(id -u)` or `--uid 0` instead.
                        say STDERR "If you are sure you want to build as the $user[0] user pass the --uid $user[2] flag." unless $interactive;
                        exit 1;
                }
@@ -263,6 +286,15 @@ configured on the Hardware Node. Failure to do so may result in clock drifting!
 EOW
 }
 
+# Warn the user about OpenBSD shipping incredibly broken compilers/linkers.
+if ($^O eq 'openbsd') {
+       print_warning <<'EOW';
+You are building InspIRCd on OpenBSD. The C++ compilers and linkers
+that OpenBSD ship are incredibly broken. You may have strange linker errors
+and crashes. Please consider using a different OS like FreeBSD/NetBSD instead.
+EOW
+}
+
 # Check that the user actually wants this version.
 if (defined $version{REAL_LABEL}) {
        print_warning <<'EOW';
@@ -309,6 +341,7 @@ if (prompt_bool $interactive, $question, 0) {
        $config{MANUAL_DIR} = prompt_dir $interactive, 'In what directory are manual pages to be placed?',        $config{MANUAL_DIR};
        $config{MODULE_DIR} = prompt_dir $interactive, 'In what directory are modules to be placed?',             $config{MODULE_DIR};
        $config{SCRIPT_DIR} = prompt_dir $interactive, 'In what directory are scripts to be placed?',             $config{SCRIPT_DIR};
+       $config{EXAMPLE_DIR} = $config{CONFIG_DIR} . '/examples';
 }
 
 # Configure module settings.
@@ -357,8 +390,22 @@ Note: you can get a <|BOLD free|> CA-signed certificate from Let's Encrypt. See
 https://letsencrypt.org/getting-started/ for more details.
 EOQ
 
-if (<src/modules/m_ssl_*.cpp> && prompt_bool $interactive, $question, $interactive) {
-       system './tools/genssl', 'auto';
+if (<src/modules/m_ssl_*.cpp>) {
+       if (prompt_bool $interactive, $question, $interactive) {
+               system './tools/genssl', 'auto';
+       }
+} else {
+       print_warning <<"EOM";
+You are building without enabling any SSL modules. This is not
+recommended as SSL greatly enhances the security and privacy of your IRC server
+and in a future version will be <|BOLD required|> for linking servers.
+
+Please read the following documentation pages on how to enable SSL support:
+
+GnuTLS (recommended): https://docs.inspircd.org/3/modules/ssl_gnutls
+mbedTLS:              https://docs.inspircd.org/3/modules/ssl_mbedtls
+OpenSSL:              https://docs.inspircd.org/3/modules/ssl_openssl
+EOM
 }
 
 # Cache the distribution label so that its not lost when --update is run.
@@ -387,20 +434,21 @@ for my $file (<src/modules/m_*>) {
 print_format <<"EOM";
 
 <|GREEN Paths:|>
-  <|GREEN Base:|>   $config{BASE_DIR}
-  <|GREEN Binary:|> $config{BINARY_DIR}
-  <|GREEN Config:|> $config{CONFIG_DIR}
-  <|GREEN Data:|>   $config{DATA_DIR}
-  <|GREEN Log:|>    $config{LOG_DIR}
-  <|GREEN Manual:|> $config{MANUAL_DIR}
-  <|GREEN Module:|> $config{MODULE_DIR}
-  <|GREEN Script:|> $config{SCRIPT_DIR}
+  <|GREEN Base:|>    $config{BASE_DIR}
+  <|GREEN Binary:|>  $config{BINARY_DIR}
+  <|GREEN Config:|>  $config{CONFIG_DIR}
+  <|GREEN Data:|>    $config{DATA_DIR}
+  <|GREEN Example:|> $config{EXAMPLE_DIR}
+  <|GREEN Log:|>     $config{LOG_DIR}
+  <|GREEN Manual:|>  $config{MANUAL_DIR}
+  <|GREEN Module:|>  $config{MODULE_DIR}
+  <|GREEN Script:|>  $config{SCRIPT_DIR}
 
 <|GREEN Execution Group:|> $config{GROUP} ($config{GID})
 <|GREEN Execution User:|>  $config{USER} ($config{UID})
 <|GREEN Socket Engine:|>   $config{SOCKETENGINE}
 
-To build with these settings run '<|GREEN make -j${\get_cpu_count} install|>' now.
+To build with these settings run '<|GREEN make -j${\(get_cpu_count() + 1)} install|>' now.
 
 EOM
 
@@ -503,6 +551,8 @@ EXTRA:      for my $extra (@extras) {
 sub enable_extras (@) {
        my (@extras) = @_;
        for my $extra (@extras) {
+               $extra = "m_$extra" unless $extra =~ /^m_/;
+               $extra = "$extra.cpp" unless $extra =~ /\.cpp$/;
                my $extrapath = "src/modules/extra/$extra";
                if (!-e $extrapath) {
                        print STDERR "Cannot enable \e[32;1m$extra\e[0m : No such file or directory in src/modules/extra\n";
@@ -538,6 +588,8 @@ sub disable_extras (@)
        closedir $dd;
        my (@extras) = @_;
 EXTRA: for my $extra (@extras) {
+               $extra = "m_$extra" unless $extra =~ /^m_/;
+               $extra = "$extra.cpp" unless $extra =~ /\.cpp$/;
                my $extrapath = "src/modules/extra/$extra";
                my $source = "src/modules/$extra";
                if (!-e $extrapath) {