X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=configure;h=f1813bf09801322db0617e615f851d12aee474c6;hb=refs%2Fheads%2Finsp3;hp=767929a1d280df4b35638e3cb7edc8f6bba8c855;hpb=b64fe8320ecbcc3f6099a3c0ae1b2739447bfc76;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/configure b/configure index 767929a1d..f1813bf09 100755 --- a/configure +++ b/configure @@ -2,10 +2,10 @@ # # InspIRCd -- Internet Relay Chat Daemon # +# Copyright (C) 2020 Nicole Kleinhoff +# Copyright (C) 2020 Daniel Vassdal # Copyright (C) 2019 Matt Schatz -# Copyright (C) 2019 Anatole Denis -# Copyright (C) 2017 emerson -# Copyright (C) 2013-2020 Sadie Powell +# Copyright (C) 2013-2021 Sadie Powell # Copyright (C) 2012, 2019 Robby # Copyright (C) 2012 ChrisTX # Copyright (C) 2010 Daniel De Graaf @@ -28,11 +28,7 @@ # -BEGIN { - require 5.10.0; -} - -use feature ':5.10'; +use v5.10.0; use strict; use warnings FATAL => qw(all); @@ -56,6 +52,7 @@ my ($opt_binary_dir, $opt_development, $opt_disable_auto_extras, $opt_disable_interactive, + $opt_disable_ownership, $opt_distribution_label, $opt_example_dir, $opt_gid, @@ -64,6 +61,7 @@ my ($opt_binary_dir, $opt_module_dir, $opt_portable, $opt_prefix, + $opt_runtime_dir, $opt_script_dir, $opt_socketengine, $opt_system, @@ -89,6 +87,7 @@ exit 1 unless GetOptions( 'development' => \$opt_development, 'disable-auto-extras' => \$opt_disable_auto_extras, 'disable-interactive' => \$opt_disable_interactive, + 'disable-ownership' => \$opt_disable_ownership, 'distribution-label=s' => \$opt_distribution_label, 'example-dir=s' => \$opt_example_dir, 'gid=s' => \$opt_gid, @@ -97,20 +96,20 @@ exit 1 unless GetOptions( 'module-dir=s' => \$opt_module_dir, 'portable' => \$opt_portable, 'prefix=s' => \$opt_prefix, + 'runtime-dir=s' => \$opt_runtime_dir, 'script-dir=s' => \$opt_script_dir, 'socketengine=s' => \$opt_socketengine, 'system' => \$opt_system, 'uid=s' => \$opt_uid, - # TODO: when the modulemanager rewrite is done these should be removed. 'disable-extras=s@' => \@opt_disableextras, 'enable-extras=s@' => \@opt_enableextras, 'list-extras' => sub { list_extras; exit 0; }, ); if (scalar(@opt_enableextras) + scalar(@opt_disableextras) > 0) { - @opt_enableextras = split /[, ]+/, join(',', @opt_enableextras); - @opt_disableextras = split /[, ]+/, join(',', @opt_disableextras); + @opt_enableextras = grep { /\S/ } split /[, ]+/, join(',', @opt_enableextras); + @opt_disableextras = grep { /\S/ } split /[, ]+/, join(',', @opt_disableextras); enable_extras(@opt_enableextras); disable_extras(@opt_disableextras); list_extras; @@ -127,6 +126,7 @@ our $interactive = !( defined $opt_development || defined $opt_disable_auto_extras || defined $opt_disable_interactive || + defined $opt_disable_ownership || defined $opt_distribution_label || defined $opt_example_dir || defined $opt_gid || @@ -135,6 +135,7 @@ our $interactive = !( defined $opt_module_dir || defined $opt_portable || defined $opt_prefix || + defined $opt_runtime_dir || defined $opt_script_dir || defined $opt_socketengine || defined $opt_system || @@ -142,7 +143,7 @@ our $interactive = !( ); my %version = get_version $opt_distribution_label; -print_format "<|BOLD Configuring InspIRCd $version{FULL} on $^O.|>\n"; +say console_format "<|BOLD Configuring InspIRCd $version{FULL} on $^O.|>"; my %config; if ($interactive) { @@ -201,17 +202,19 @@ if (defined $opt_portable) { $config{LOG_DIR} = $opt_log_dir // 'logs'; $config{MANUAL_DIR} = $opt_manual_dir // 'manuals'; $config{MODULE_DIR} = $opt_module_dir // 'modules'; + $config{RUNTIME_DIR} = $opt_runtime_dir // $config{DATA_DIR}; $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' + $config{BASE_DIR} = $opt_prefix // '/'; + $config{BINARY_DIR} = $opt_binary_dir // catdir $config{BASE_DIR}, 'usr/sbin'; + $config{CONFIG_DIR} = $opt_config_dir // catdir $config{BASE_DIR}, 'etc/inspircd'; + $config{DATA_DIR} = $opt_data_dir // catdir $config{BASE_DIR}, 'var/lib/inspircd'; + $config{EXAMPLE_DIR} = $opt_example_dir // catdir $config{BASE_DIR}, 'usr/share/doc/inspircd'; + $config{LOG_DIR} = $opt_log_dir // catdir $config{BASE_DIR}, 'var/log/inspircd'; + $config{MANUAL_DIR} = $opt_manual_dir // catdir $config{BASE_DIR}, 'usr/share/man/man1'; + $config{MODULE_DIR} = $opt_module_dir // catdir $config{BASE_DIR}, 'usr/lib/inspircd'; + $config{RUNTIME_DIR} = $opt_runtime_dir // catdir $config{BASE_DIR}, $^O eq 'linux' ? '/run/inspircd' : '/var/run/inspircd'; + $config{SCRIPT_DIR} = $opt_script_dir // catdir $config{BASE_DIR}, 'usr/share/inspircd'; } else { $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'; @@ -221,12 +224,16 @@ if (defined $opt_portable) { $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{RUNTIME_DIR} = $opt_runtime_dir // $config{RUNTIME_DIR} // $config{DATA_DIR}; $config{SCRIPT_DIR} = $opt_script_dir // $config{SCRIPT_DIR} // $config{BASE_DIR}; } # Parse --gid=123 or --gid=foo and extract the group id. my @group; -if (defined $opt_gid) { +if (defined $opt_disable_ownership) { + @group = qw(insert-group-here . -1); + print_error 'you can not use --disable-ownership and --gid at the same time!' if defined $opt_gid; +} elsif (defined $opt_gid) { @group = $opt_gid =~ /^\d+$/ ? getgrgid($opt_gid) : getgrnam($opt_gid); print_error "there is no '$opt_gid' group on this system!" unless @group; } else { @@ -242,7 +249,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. + # PACKAGERS: You do not need to delete this check. Use `--disable-ownership` 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; } @@ -253,7 +260,10 @@ $config{GID} = $group[2]; # Parse --uid=123 or --uid=foo and extract the user id. my @user; -if (defined $opt_uid) { +if (defined $opt_disable_ownership) { + @user = qw(insert-user-here . -1); + print_error 'you can not use --disable-ownership and --uid at the same time!' if defined $opt_uid; +} elsif (defined $opt_uid) { @user = $opt_uid =~ /^\d+$/ ? getpwuid($opt_uid) : getpwnam($opt_uid); print_error "there is no '$opt_uid' user on this system!" unless @user; } else { @@ -269,7 +279,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. + # PACKAGERS: You do not need to delete this check. Use `--disable-ownership` 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; } @@ -296,6 +306,29 @@ and crashes. Please consider using a different OS like FreeBSD/NetBSD instead. EOW } +# Warn about Perl versions that will not be supported in the future. +if ($^V lt 'v5.26.0') { + print_warning <<"EOW"; +You are building InspIRCd with Perl $^V. This is very old and will +not be supported by the next major version of InspIRCd. Please consider updating +to Perl v5.26 or newer. +EOW +} + +# Warn about compiler versions that will not be supported in the future. +my %future_compilers = ( + AppleClang => version->parse('10.0'), + Clang => version->parse('5.0'), + GCC => version->parse('7.0'), +); +if (exists $future_compilers{$compiler{NAME}} && $compiler{VERSION} lt $future_compilers{$compiler{NAME}}) { + print_warning <<"EOW"; +You are building InspIRCd with $compiler{NAME} v$compiler{VERSION}. This is very old and +will not be supported by the next major version of InspIRCd. Please consider +updating to $compiler{NAME} v$future_compilers{$compiler{NAME}} or newer. +EOW +} + # Check that the user actually wants this version. if (defined $version{REAL_LABEL}) { print_warning <<'EOW'; @@ -318,7 +351,6 @@ EOW my $question = <<"EOQ"; Currently, InspIRCd is configured with the following paths: -<|BOLD Base:|> $config{BASE_DIR} <|BOLD Binary:|> $config{BINARY_DIR} <|BOLD Config:|> $config{CONFIG_DIR} <|BOLD Data:|> $config{DATA_DIR} @@ -332,7 +364,7 @@ EOQ if (prompt_bool $interactive, $question, 0) { my $original_base_dir = $config{BASE_DIR}; $config{BASE_DIR} = prompt_dir $interactive, 'In what directory do you wish to install the InspIRCd base?', $config{BASE_DIR}; - foreach my $key (qw(BINARY_DIR CONFIG_DIR DATA_DIR LOG_DIR MANUAL_DIR MODULE_DIR SCRIPT_DIR)) { + for my $key (qw(BINARY_DIR CONFIG_DIR DATA_DIR LOG_DIR MANUAL_DIR MODULE_DIR SCRIPT_DIR)) { $config{$key} =~ s/^\Q$original_base_dir\E/$config{BASE_DIR}/; } $config{BINARY_DIR} = prompt_dir $interactive, 'In what directory should the InspIRCd binary be placed?', $config{BINARY_DIR}; @@ -343,6 +375,7 @@ if (prompt_bool $interactive, $question, 0) { $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'; + $config{RUNTIME_DIR} = $config{DATA_DIR}; } # Configure module settings. @@ -352,26 +385,27 @@ Currently, InspIRCd is configured to automatically enable all available extra mo Would you like to enable extra modules manually? EOQ if (prompt_bool $interactive, $question, 0) { - foreach my $extra (<$RealDir/src/modules/extra/m_*.cpp>) { - my $module_name = basename $extra, '.cpp'; - if (prompt_bool $interactive, "Would you like to enable $module_name?", 0) { + for my $extra (<$RealDir/src/modules/extra/m_*.cpp>) { + my $module_name = module_shrink $extra; + if (prompt_bool $interactive, "Would you like to enable the <|BOLD $module_name|> module?", 0) { enable_extras $module_name; } } } elsif (!defined $opt_disable_auto_extras) { - # TODO: finish modulemanager rewrite and replace this code with: - # system './modulemanager', 'enable', '--auto'; my %modules = ( - # Missing: m_ldap, m_regex_stdlib, m_ssl_mbedtls + 'm_argon2.cpp' => 'pkg-config --exists libargon2', 'm_geo_maxmind.cpp' => 'pkg-config --exists libmaxminddb', 'm_mysql.cpp' => 'mysql_config --version', 'm_pgsql.cpp' => 'pg_config --version', + 'm_ldap.cpp' => "echo '#include ' | $config{CXX} -E -", 'm_regex_pcre.cpp' => 'pcre-config --version', 'm_regex_posix.cpp' => undef, 'm_regex_re2.cpp' => 'pkg-config --exists re2', + 'm_regex_stdlib.cpp' => "$config{CXX} -o /dev/null -std=c++11 $RealDir/make/test/compiler.cpp", 'm_regex_tre.cpp' => 'pkg-config --exists tre', 'm_sqlite3.cpp' => 'pkg-config --exists sqlite3', 'm_ssl_gnutls.cpp' => 'pkg-config --exists gnutls', + 'm_ssl_mbedtls.cpp' => "echo '#include ' | $config{CXX} -E -", 'm_ssl_openssl.cpp' => 'pkg-config --exists openssl', 'm_sslrehashsignal.cpp' => undef, ); @@ -409,7 +443,7 @@ EOQ } } elsif (!defined $opt_disable_auto_extras) { print_warning <<"EOM"; -You are building without enabling any SSL modules. This is not +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. @@ -423,11 +457,12 @@ EOM # Cache the distribution label so that its not lost when --update is run. $config{DISTRIBUTION} = $opt_distribution_label if $opt_distribution_label; +$config{DISABLE_OWNERSHIP} = $opt_disable_ownership // 0; write_configure_cache %config; parse_templates \%config, \%compiler, \%version; -print_format <<"EOM"; +print console_format <<"EOM"; Configuration is complete! You have chosen to build with the following settings: @@ -440,18 +475,16 @@ Configuration is complete! You have chosen to build with the following settings: EOM for my $file (<$RealDir/src/modules/m_*>) { - my $module = basename $file, '.cpp'; - say " * $module" if -l $file; + say " * ${\module_shrink $file}" if -l $file; } my @makeargs; push @makeargs, "-C${\abs2rel $RealDir}" unless getcwd eq $RealDir; push @makeargs, "-j${\(get_cpu_count() + 1)}"; -print_format <<"EOM"; +print console_format <<"EOM"; <|GREEN Paths:|> - <|GREEN Base:|> $config{BASE_DIR} <|GREEN Binary:|> $config{BINARY_DIR} <|GREEN Config:|> $config{CONFIG_DIR} <|GREEN Data:|> $config{DATA_DIR} @@ -459,6 +492,7 @@ print_format <<"EOM"; <|GREEN Log:|> $config{LOG_DIR} <|GREEN Manual:|> $config{MANUAL_DIR} <|GREEN Module:|> $config{MODULE_DIR} + <|GREEN Runtime:|> $config{RUNTIME_DIR} <|GREEN Script:|> $config{SCRIPT_DIR} <|GREEN Execution Group:|> $config{GROUP} ($config{GID}) @@ -489,7 +523,7 @@ sub list_extras () { my @sources = map { File::Spec->case_tolerant() ? lc($_) : $_ } (readdir($dd)); closedir $dd; undef $dd; - my $maxlen = (sort { $b <=> $a } (map {length($_)} (@extras)))[0]; + my $maxlen = (sort { $b <=> $a } (map { length module_shrink $_ } (@extras)))[0]; my %extras = (); EXTRA: for my $extra (@extras) { next if (File::Spec->curdir() eq $extra || File::Spec->updir() eq $extra); @@ -557,9 +591,9 @@ EXTRA: for my $extra (@extras) { for my $extra (sort {$a cmp $b} keys(%extras)) { my $text = $extras{$extra}; if ($text =~ m/needed by/ && $text !~ m/enabled/) { - printf "\e[31;1;5m%-*s = %s%s\e[0m\n", $maxlen, $extra, $text, ($text =~ m/needed by/ ? ")" : ""); + printf "\e[31;1;5m%-*s = %s%s\e[0m\n", $maxlen, module_shrink($extra), $text, ($text =~ m/needed by/ ? ")" : ""); } else { - printf "%-*s = %s%s\n", $maxlen, $extra, $text, ($text =~ m/needed by/ ? "\e[0m)" : ""); + printf "%-*s = %s%s\n", $maxlen, module_shrink($extra), $text, ($text =~ m/needed by/ ? "\e[0m)" : ""); } } return keys(%extras) if wantarray; # Can be used by manage_extras. @@ -570,8 +604,8 @@ sub enable_extras(@) { my $extradir = catdir $moduledir, 'extra'; for my $extra (@_) { - my $shortname = $extra =~ s/(?:^m_|\.cpp$)//gr; - my $extrafile = "m_$shortname.cpp"; + my $shortname = module_shrink $extra; + my $extrafile = module_expand $extra; my $extrapath = catfile $extradir, $extrafile; if (!-f $extrapath) { @@ -590,7 +624,7 @@ sub enable_extras(@) { if (-e $modulepath) { print_error "unable to symlink <|GREEN ${\abs2rel $modulepath}|> to <|GREEN ${\abs2rel $extrapath}|>: the target exists and is not a symlink."; } else { - print_format "Enabling the <|GREEN $shortname|> module ...\n"; + say console_format "Enabling the <|GREEN $shortname|> module ..."; symlink $extrapath, $modulepath or print_error "unable to symlink <|GREEN ${\abs2rel $modulepath}|> to <|GREEN ${\abs2rel $extrapath}|>: $!"; } } @@ -601,8 +635,8 @@ sub disable_extras(@) { my $extradir = catdir $moduledir, 'extra'; for my $extra (@_) { - my $shortname = $extra =~ s/(?:^m_|\.cpp$)//gr; - my $extrafile = "m_$shortname.cpp"; + my $shortname = module_shrink $extra; + my $extrafile = module_expand $extra; my $modulepath = catfile $moduledir, $extrafile; my $extrapath = catfile $extradir, $extrafile; @@ -613,7 +647,7 @@ sub disable_extras(@) { } elsif ((-e $modulepath && !-e $extrapath) || !-l $modulepath) { print_error "the <|GREEN $shortname|> module is not an extra module!"; } else { - print_format "Disabling the <|GREEN $shortname|> module ...\n"; + say console_format "Disabling the <|GREEN $shortname|> module ..."; unlink $modulepath or print_error "unable to unlink <|GREEN $extrapath|>: $!"; } }