diff options
author | Peter Powell <petpow@saberuk.com> | 2016-09-11 21:19:28 +0100 |
---|---|---|
committer | Peter Powell <petpow@saberuk.com> | 2016-09-16 04:23:56 +0100 |
commit | 806e57433a38193ae14942ee60f573fe47f4b643 (patch) | |
tree | d02a60dca483d429505f77d74fb349552f57f7ff | |
parent | 6c98c2987402d9e9310cad9af1bab523bd60cb51 (diff) |
Rewrite the build system directive parser.
-rwxr-xr-x | configure | 7 | ||||
-rw-r--r-- | make/configure.pm | 17 | ||||
-rw-r--r-- | make/directive.pm | 264 | ||||
-rwxr-xr-x | make/unit-cc.pl | 18 | ||||
-rw-r--r-- | make/utilities.pm | 412 | ||||
-rw-r--r-- | src/modules/extra/m_geoip.cpp | 7 | ||||
-rw-r--r-- | src/modules/extra/m_ldap.cpp | 5 | ||||
-rw-r--r-- | src/modules/extra/m_mysql.cpp | 9 | ||||
-rw-r--r-- | src/modules/extra/m_pgsql.cpp | 17 | ||||
-rw-r--r-- | src/modules/extra/m_regex_pcre.cpp | 9 | ||||
-rw-r--r-- | src/modules/extra/m_regex_re2.cpp | 8 | ||||
-rw-r--r-- | src/modules/extra/m_regex_stdlib.cpp | 5 | ||||
-rw-r--r-- | src/modules/extra/m_regex_tre.cpp | 8 | ||||
-rw-r--r-- | src/modules/extra/m_sqlite3.cpp | 8 | ||||
-rw-r--r-- | src/modules/extra/m_ssl_gnutls.cpp | 12 | ||||
-rw-r--r-- | src/modules/extra/m_ssl_mbedtls.cpp | 5 | ||||
-rw-r--r-- | src/modules/extra/m_ssl_openssl.cpp | 9 | ||||
-rwxr-xr-x | tools/genssl | 2 |
18 files changed, 344 insertions, 478 deletions
@@ -43,6 +43,7 @@ use POSIX qw(getgid getuid); use make::common; use make::configure; use make::console; +use make::directive; my ($opt_binary_dir, $opt_config_dir, @@ -409,7 +410,7 @@ EXTRA: for my $extra (@extras) { for my $extra (keys(%extras)) { next unless $extras{$extra} =~ m/enabled/; # only process enabled extras. my $abs_extra = File::Spec->catfile($abs_srcdir, "extra", $extra); - my @deps = split /\s+/, get_property($abs_extra, 'ModDep'); + my @deps = split /\s+/, get_directive($abs_extra, 'ModDep', ''); for my $dep (@deps) { if (exists($extras{$dep})) { my $ref = \$extras{$dep}; # Take reference. @@ -456,7 +457,7 @@ sub enable_extras (@) { next; } # Get dependencies, and add them to be processed. - my @deps = split /\s+/, get_property($extrapath, 'ModDep'); + my @deps = split /\s+/, get_directive($extrapath, 'ModDep', ''); for my $dep (@deps) { next if scalar(grep { $_ eq $dep } (@extras)) > 0; # Skip if we're going to be enabling it anyway. if (!-e "src/modules/$dep" && !-e "include/$dep") { @@ -492,7 +493,7 @@ EXTRA: for my $extra (@extras) { } # Check if anything needs this. for my $file (@files) { - my @deps = split /\s+/, get_property("src/modules/extra/$file", 'ModDep'); + my @deps = split /\s+/, get_directive("src/modules/extra/$file", 'ModDep', ''); # File depends on this extra... if (scalar(grep { $_ eq $extra } @deps) > 0) { # And is both enabled and not about to be disabled. diff --git a/make/configure.pm b/make/configure.pm index 8619d5be2..e88454658 100644 --- a/make/configure.pm +++ b/make/configure.pm @@ -38,7 +38,6 @@ use File::Spec::Functions qw(catfile); use make::common; use make::console; -use make::utilities; use constant CONFIGURE_DIRECTORY => '.configure'; use constant CONFIGURE_CACHE_FILE => catfile(CONFIGURE_DIRECTORY, 'cache.cfg'); @@ -56,7 +55,6 @@ our @EXPORT = qw(CONFIGURE_CACHE_FILE write_configure_cache get_compiler_info find_compiler - get_property parse_templates); sub __get_socketengines { @@ -268,21 +266,6 @@ sub find_compiler { } } -sub get_property($$;$) -{ - my ($file, $property, $default) = @_; - open(MODULE, $file) or return $default; - while (<MODULE>) { - if ($_ =~ /^\/\* \$(\S+): (.+) \*\/$/) { - next unless $1 eq $property; - close(MODULE); - return translate_functions($2, $file); - } - } - close(MODULE); - return $default // ''; -} - sub parse_templates($$$) { # These are actually hash references diff --git a/make/directive.pm b/make/directive.pm new file mode 100644 index 000000000..c490135fd --- /dev/null +++ b/make/directive.pm @@ -0,0 +1,264 @@ +# +# InspIRCd -- Internet Relay Chat Daemon +# +# Copyright (C) 2016 Peter Powell <petpow@saberuk.com> +# +# 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 +# License as published by the Free Software Foundation, version 2. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + + +package make::directive; + +BEGIN { + require 5.10.0; +} + +use feature ':5.10'; +use strict; +use warnings FATAL => qw(all); + +use File::Basename qw(basename); +use Exporter qw(import); + +use make::configure; +use make::console; + +use constant DIRECTIVE_ERROR_PIPE => $ENV{INSPIRCD_VERBOSE} ? '' : '2>/dev/null'; + +our @EXPORT = qw(get_directive + execute_functions); + +sub get_directive($$;$) +{ + my ($file, $property, $default) = @_; + open(MODULE, $file) or return $default; + + my $value = ''; + while (<MODULE>) { + if ($_ =~ /^\/\* \$(\S+): (.+) \*\/$/ || $_ =~ /^\/\/\/ \$(\S+): (.+)/) { + next unless $1 eq $property; + $value .= ' ' . execute_functions($file, $1, $2); + } + } + close(MODULE); + + # Strip all extraneous whitespace. + $value =~ s/^\s+|\s+$//g; + return $value || $default; +} + +sub execute_functions($$$) { + my ($file, $name, $line) = @_; + + # NOTE: we have to use 'our' instead of 'my' here because of a Perl bug. + for (our @parameters = (); $line =~ /([a-z_]+)\((?:\s*"([^"]*)(?{push @parameters, $2})"\s*)*\)/; undef @parameters) { + my $sub = make::directive->can("__function_$1"); + print_error "unknown $name directive '$1' in $file!" unless $sub; + + # Call the subroutine and replace the function. + my $result = $sub->($file, @parameters); + if (defined $result) { + $line = $` . $result . $'; + next; + } + + # If the subroutine returns undef then it is a sign that we should + # disregard the rest of the line and stop processing it. + $line = $`; + } + + return $line; +} + +sub __error { + my ($file, @message) = @_; + push @message, ''; + + # If we have package details then suggest to the user that they check + # that they have the packages installed.= + my $dependencies = get_directive($file, 'PackageInfo'); + if (defined $dependencies) { + my @packages = sort grep { /^\S+$/ } split /\s/, $dependencies; + push @message, 'You should make sure you have the following packages installed:'; + for (@packages) { + push @message, " * $_"; + } + } else { + push @message, 'You should make sure that you have all of the required dependencies'; + push @message, 'for this module installed.'; + } + push @message, ''; + + # If we have author information then tell the user to report the bug + # to them. Otherwise, assume it is a bundled module and tell the user + # to report it to the InspIRCd issue tracker. + my $author = get_directive($file, 'ModAuthor'); + if (defined $author) { + push @message, 'If you believe this error to be a bug then you can try to contact the'; + push @message, 'author of this module:'; + my $author_mail = get_directive($file, 'ModAuthorMail'); + if (defined $author_mail) { + push @message, " * $author <$author_mail>"; + } else { + push @message, " * $author"; + } + } else { + push @message, 'If you believe this error to be a bug then you can file a bug report'; + push @message, 'at https://github.com/inspircd/inspircd/issues'; + } + push @message, ''; + + push @message, 'If you would like help with fixing this problem then visit our IRC'; + push @message, 'channel at irc.inspircd.org #InspIRCd for support.'; + push @message, ''; + + print_error @message; +} + +sub __function_error { + my ($file, @messages) = @_; + __error $file, @messages; +} + +sub __function_execute { + my ($file, $command, $environment, $defaults) = @_; + + # Try to execute the command... + chomp(my $result = `$command ${\DIRECTIVE_ERROR_PIPE}`); + unless ($?) { + print_format "Execution of `<|GREEN $command|>` succeeded: <|BOLD $result|>\n"; + return $result; + } + + # If looking up with pkg-config fails then check the environment... + if (defined $environment && $environment ne '') { + $environment = sprintf('INSPIRCD_%s', uc $environment); + if (defined $ENV{$environment}) { + print_format "Execution of `<|GREEN $command|>` failed; using the environment: <|BOLD $ENV{$environment}|>\n"; + return $ENV{$environment}; + } + } + + # If all else fails then look for the defaults.. + if (defined $defaults) { + print_format "Execution of `<|GREEN $command|>` failed; using the defaults: <|BOLD $defaults|>\n"; + return $defaults; + } + + # Executing the command failed and we don't have any defaults so give up. + __error $file, "`<|GREEN $command|>` exited with a non-zero exit code!"; +} + +sub __function_find_compiler_flags { + my ($file, $name, $defaults) = @_; + + # Try to look up the compiler flags with pkg-config... + chomp(my $flags = `pkg-config --cflags $name ${\DIRECTIVE_ERROR_PIPE}`); + unless ($?) { + print_format "Found the compiler flags for <|GREEN ${\basename $file, '.cpp'}|> using pkg-config: <|BOLD $flags|>\n"; + return $flags; + } + + # If looking up with pkg-config fails then check the environment... + my $key = sprintf('INSPIRCD_CXXFLAGS_%s', uc $name); + if (defined $ENV{$key}) { + print_format "Found the compiler flags for <|GREEN ${\basename $file, '.cpp'}|> using the environment: <|BOLD $ENV{$key}|>\n"; + return $ENV{$key}; + } + + # If all else fails then look for the defaults.. + if (defined $defaults) { + print_format "Found the compiler flags for <|GREEN ${\basename $file, '.cpp'}|> using the defaults: <|BOLD $defaults|>\n"; + return $defaults; + } + + # We can't find it via pkg-config, via the environment, or via the defaults so give up. + __error $file, "unable to find the compiler flags for <|GREEN ${\basename $file, '.cpp'}|>!"; +} + +sub __function_find_linker_flags { + my ($file, $name, $defaults) = @_; + + # Try to look up the linker flags with pkg-config... + chomp(my $flags = `pkg-config --libs $name ${\DIRECTIVE_ERROR_PIPE}`); + unless ($?) { + print_format "Found the linker flags for <|GREEN ${\basename $file, '.cpp'}|> using pkg-config: <|BOLD $flags|>\n"; + return $flags; + } + + # If looking up with pkg-config fails then check the environment... + my $key = sprintf('INSPIRCD_LDFLAGS_%s', uc $name); + if (defined $ENV{$key}) { + print_format "Found the linker flags for <|GREEN ${\basename $file, '.cpp'}|> using the environment: <|BOLD $ENV{$key}|>\n"; + return $ENV{$key}; + } + + # If all else fails then look for the defaults.. + if (defined $defaults) { + print_format "Found the linker flags for <|GREEN ${\basename $file, '.cpp'}|> using the defaults: <|BOLD $defaults|>\n"; + return $defaults; + } + + # We can't find it via pkg-config, via the environment, or via the defaults so give up. + __error $file, "unable to find the linker flags for <|GREEN ${\basename $file, '.cpp'}|>!"; +} + +sub __function_require_system { + my ($file, $name, $minimum, $maximum) = @_; + my ($system, $version); + + # Linux is special and can be compared by distribution names. + if ($^O eq 'linux' && $name ne 'linux') { + chomp($system = lc `lsb_release --id --short 2>/dev/null`); + chomp($version = lc `lsb_release --release --short 2>/dev/null`); + } + + # Gather information on the system if we don't have it already. + chomp($system ||= lc `uname -s 2>/dev/null`); + chomp($version ||= lc `uname -r 2>/dev/null`); + + # We only care about the important bit of the version number so trim the rest. + $version =~ s/^(\d+\.\d+).+/$1/; + + # Check whether the current system is suitable. + return undef if $name ne $system; + return undef if defined $minimum && $version < $minimum; + return undef if defined $maximum && $version > $maximum; + + # Requirement directives don't change anything directly. + return ""; +} + +sub __function_require_version { + my ($file, $name, $minimum, $maximum) = @_; + + # If pkg-config isn't installed then we can't do anything here. + if (system "pkg-config --exists $name ${\DIRECTIVE_ERROR_PIPE}") { + print_warning "unable to look up the version of $name using pkg-config!"; + return undef; + } + + # Check with pkg-config whether we have the required version. + return undef if defined $minimum && system "pkg-config --atleast-version $minimum $name"; + return undef if defined $maximum && system "pkg-config --max-version $maximum $name"; + + # Requirement directives don't change anything directly. + return ""; +} + +sub __function_warning { + my ($file, @messages) = @_; + print_warning @messages; +} + +1; diff --git a/make/unit-cc.pl b/make/unit-cc.pl index f04423ce3..1cf6cf866 100755 --- a/make/unit-cc.pl +++ b/make/unit-cc.pl @@ -29,16 +29,14 @@ use warnings FATAL => qw(all); use File::Spec::Functions qw(abs2rel); -use make::configure; use make::console; +use make::directive; chdir $ENV{BUILDPATH}; my $type = shift; my $out = shift; -our %config = read_configure_cache(); - if ($type eq 'gen-ld') { do_static_find(@ARGV); } elsif ($type eq 'static-ld') { @@ -67,10 +65,16 @@ sub message($$$) { } } +sub rpath($) { + my $message = shift; + $message =~ s/-L(\S+)/-Wl,-rpath,$1 -L$1/g unless defined $ENV{INSPIRCD_DISABLE_RPATH}; + return $message; +} + sub do_static_find { my @flags; for my $file (@ARGV) { - push @flags, get_property($file, 'LinkerFlags'); + push @flags, rpath(get_directive($file, 'LinkerFlags', '')); } open F, '>', $out; print F join ' ', @flags; @@ -106,7 +110,7 @@ sub do_core_link { sub do_link_dir { my ($dir, $link_flags) = (shift, ''); for my $file (<$dir/*.cpp>) { - $link_flags .= get_property($file, 'LinkerFlags') . ' '; + $link_flags .= rpath(get_directive($file, 'LinkerFlags', '')) . ' '; } my $execstr = "$ENV{CXX} -o $out $ENV{PICLDFLAGS} $link_flags @_"; message 'LINK', $out, $execstr; @@ -119,7 +123,7 @@ sub do_compile { my $flags = ''; my $libs = ''; if ($do_compile) { - $flags = $ENV{CORECXXFLAGS} . ' ' . get_property($file, 'CompileFlags'); + $flags = $ENV{CORECXXFLAGS} . ' ' . get_directive($file, 'CompilerFlags', ''); if ($file =~ m#(?:^|/)((?:m|core)_[^/. ]+)(?:\.cpp|/.*\.cpp)$#) { $flags .= ' -DMODNAME=\\"'.$1.'\\"'; @@ -128,7 +132,7 @@ sub do_compile { if ($do_link) { $flags = join ' ', $flags, $ENV{PICLDFLAGS}; - $libs = get_property($file, 'LinkerFlags'); + $libs = rpath(get_directive($file, 'LinkerFlags', '')); } else { $flags .= ' -c'; } diff --git a/make/utilities.pm b/make/utilities.pm deleted file mode 100644 index f2d645f33..000000000 --- a/make/utilities.pm +++ /dev/null @@ -1,412 +0,0 @@ -# -# InspIRCd -- Internet Relay Chat Daemon -# -# Copyright (C) 2010 Daniel De Graaf <danieldg@inspircd.org> -# Copyright (C) 2007-2008 Craig Edwards <craigedwards@brainbox.cc> -# Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org> -# Copyright (C) 2007 Dennis Friis <peavey@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 -# License as published by the Free Software Foundation, version 2. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - - -BEGIN { - require 5.8.0; -} - -package make::utilities; - -use strict; -use warnings FATAL => qw(all); - -use Exporter 'import'; -use Fcntl; -use File::Path; -use File::Temp; -use Getopt::Long; -use POSIX; - -our @EXPORT = qw(make_rpath pkgconfig_get_include_dirs pkgconfig_get_lib_dirs pkgconfig_check_version translate_functions promptstring); - -my %already_added = (); - -sub promptstring($$$$$) -{ - my ($prompt, $configitem, $default, $package, $commandlineswitch) = @_; - my $var; - if (!$main::interactive) - { - my $opt_commandlineswitch; - GetOptions ("$commandlineswitch=s" => \$opt_commandlineswitch); - if (defined $opt_commandlineswitch) - { - print "\e[1;32m$opt_commandlineswitch\e[0m\n"; - $var = $opt_commandlineswitch; - } - else - { - die "Could not detect $package! Please specify the $prompt via the command line option \e[1;32m--$commandlineswitch=\"/path/to/file\"\e[0m"; - } - } - else - { - print "\nPlease enter the $prompt?\n"; - print "[\e[1;32m$default\e[0m] -> "; - chomp($var = <STDIN>); - } - if ($var eq "") - { - $var = $default; - } - $main::config{$configitem} = $var; -} - -sub make_rpath($;$) -{ - my ($executable, $module) = @_; - return "" if defined $ENV{DISABLE_RPATH}; - chomp(my $data = `$executable`); - my $output = ""; - while ($data =~ /-L(\S+)/) - { - my $libpath = $1; - if (!exists $already_added{$libpath}) - { - print "Adding runtime library path to \e[1;32m$module\e[0m ... \e[1;32m$libpath\e[0m\n"; - $already_added{$libpath} = 1; - } - $output .= "-Wl,-rpath -Wl,$libpath -L$libpath "; - $data =~ s/-L(\S+)//; - } - return $output; -} - -sub pkgconfig_get_include_dirs($$$;$) -{ - my ($packagename, $headername, $defaults, $module) = @_; - - print "Locating include directory for package \e[1;32m$packagename\e[0m for module \e[1;32m$module\e[0m... "; - - my $v = `pkg-config --modversion $packagename 2>/dev/null`; - my $ret = `pkg-config --cflags $packagename 2>/dev/null`; - my $foo = ""; - if ((!defined $v) || ($v eq "")) - { - print "\e[31mCould not find $packagename via pkg-config\e[m (\e[1;32mplease install pkg-config\e[m)\n"; - my $locbin = $^O eq 'solaris' ? 'slocate' : 'locate'; - $foo = `$locbin "$headername" 2>/dev/null | head -n 1`; - my $find = $foo =~ /(.+)\Q$headername\E/ ? $1 : ''; - chomp($find); - if ((defined $find) && ($find ne "") && ($find ne $packagename)) - { - print "(\e[1;32mFound via search\e[0m) "; - $foo = "-I$1"; - } - else - { - $foo = " "; - undef $v; - } - $ret = "$foo"; - } - if (($defaults ne "") && (($ret eq "") || (!defined $ret))) - { - $ret = "$foo " . $defaults; - } - chomp($ret); - if ((($ret eq " ") || (!defined $ret)) && ((!defined $v) || ($v eq ""))) - { - my $key = "default_includedir_$packagename"; - if (exists $main::config{$key}) - { - $ret = $main::config{$key}; - } - else - { - $headername =~ s/^\///; - promptstring("path to the directory containing $headername", $key, "/usr/include",$packagename,"$packagename-includes"); - $packagename =~ tr/a-z/A-Z/; - if (defined $v) - { - $main::config{$key} = "-I$main::config{$key}" . " $defaults -DVERSION_$packagename=\"$v\""; - } - else - { - $main::config{$key} = "-I$main::config{$key}" . " $defaults -DVERSION_$packagename=\"0.0\""; - } - $main::config{$key} =~ s/^\s+//g; - $ret = $main::config{$key}; - return $ret; - } - } - else - { - chomp($v); - my $key = "default_includedir_$packagename"; - $packagename =~ tr/a-z/A-Z/; - $main::config{$key} = "$ret -DVERSION_$packagename=\"$v\""; - $main::config{$key} =~ s/^\s+//g; - $ret = $main::config{$key}; - print "\e[1;32m$ret\e[0m (version $v)\n"; - } - $ret =~ s/^\s+//g; - return $ret; -} - -sub pkgconfig_check_version($$;$) -{ - my ($packagename, $version, $module) = @_; - - print "Checking version of package \e[1;32m$packagename\e[0m is >= \e[1;32m$version\e[0m... "; - - my $v = `pkg-config --modversion $packagename 2>/dev/null`; - if (defined $v) - { - chomp($v); - } - if ((defined $v) && ($v ne "")) - { - if (!system "pkg-config --atleast-version $version $packagename") - { - print "\e[1;32mYes (version $v)\e[0m\n"; - return 1; - } - else - { - print "\e[1;32mNo (version $v)\e[0m\n"; - return 0; - } - } - # If we didnt find it, we cant definitively say its too old. - # Return ok, and let pkgconflibs() or pkgconfincludes() pick up - # the missing library later on. - print "\e[1;32mNo (not found)\e[0m\n"; - return 1; -} - -sub pkgconfig_get_lib_dirs($$$;$) -{ - my ($packagename, $libname, $defaults, $module) = @_; - - print "Locating library directory for package \e[1;32m$packagename\e[0m for module \e[1;32m$module\e[0m... "; - - my $v = `pkg-config --modversion $packagename 2>/dev/null`; - my $ret = `pkg-config --libs $packagename 2>/dev/null`; - - my $foo = ""; - if ((!defined $v) || ($v eq "")) - { - my $locbin = $^O eq 'solaris' ? 'slocate' : 'locate'; - $foo = `$locbin "$libname" | head -n 1`; - $foo =~ /(.+)\Q$libname\E/; - my $find = $1; - chomp($find); - if ((defined $find) && ($find ne "") && ($find ne $packagename)) - { - print "(\e[1;32mFound via search\e[0m) "; - $foo = "-L$1"; - } - else - { - $foo = " "; - undef $v; - } - $ret = "$foo"; - } - - if (($defaults ne "") && (($ret eq "") || (!defined $ret))) - { - $ret = "$foo " . $defaults; - } - chomp($ret); - if ((($ret eq " ") || (!defined $ret)) && ((!defined $v) || ($v eq ""))) - { - my $key = "default_libdir_$packagename"; - if (exists $main::config{$key}) - { - $ret = $main::config{$key}; - } - else - { - $libname =~ s/^\///; - promptstring("path to the directory containing $libname", $key, "/usr/lib",$packagename,"$packagename-libs"); - $main::config{$key} = "-L$main::config{$key}" . " $defaults"; - $main::config{$key} =~ s/^\s+//g; - $ret = $main::config{$key}; - return $ret; - } - } - else - { - chomp($v); - print "\e[1;32m$ret\e[0m (version $v)\n"; - my $key = "default_libdir_$packagename"; - $main::config{$key} = $ret; - $main::config{$key} =~ s/^\s+//g; - $ret =~ s/^\s+//g; - } - $ret =~ s/^\s+//g; - return $ret; -} - -# Translate a $CompileFlags etc line and parse out function calls -# to functions within these modules at configure time. -sub translate_functions($$) -{ - my ($line,$module) = @_; - - eval - { - $module =~ /modules*\/(.+?)$/; - $module = $1; - - if ($line =~ /ifuname\(\!"(\w+)"\)/) - { - my $uname = $1; - if ($uname eq $^O) - { - $line = ""; - return ""; - } - - $line =~ s/ifuname\(\!"(.+?)"\)//; - } - - if ($line =~ /ifuname\("(\w+)"\)/) - { - my $uname = $1; - if ($uname ne $^O) - { - $line = ""; - return ""; - } - - $line =~ s/ifuname\("(.+?)"\)//; - } - - if ($line =~ /if\("(\w+)"\)/) - { - if (defined $main::config{$1}) - { - if (($main::config{$1} !~ /y/i) and ($main::config{$1} ne "1")) - { - $line = ""; - return ""; - } - } - - $line =~ s/if\("(.+?)"\)//; - } - if ($line =~ /if\(\!"(\w+)"\)/) - { - if (!exists $main::config{$1}) - { - $line = ""; - return ""; - } - else - { - if (defined $1) - { - if (exists ($main::config{$1}) and (($main::config{$1} =~ /y/i) or ($main::config{$1} eq "1"))) - { - $line = ""; - return ""; - } - } - } - - $line =~ s/if\(\!"(.+?)"\)//; - } - while ($line =~ /exec\("(.+?)"\)/) - { - print "Executing program for module \e[1;32m$module\e[0m ... \e[1;32m$1\e[0m\n"; - my $replace = `$1`; - die $replace if ($replace =~ /Configuration failed/); - chomp($replace); - $line =~ s/exec\("(.+?)"\)/$replace/; - } - while ($line =~ /execruntime\("(.+?)"\)/) - { - $line =~ s/execruntime\("(.+?)"\)/`$1`/; - } - while ($line =~ /eval\("(.+?)"\)/) - { - print "Evaluating perl code for module \e[1;32m$module\e[0m ... "; - my $tmpfile; - do - { - $tmpfile = File::Temp::tmpnam(); - } until sysopen(TF, $tmpfile, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0700); - print "(Created and executed \e[1;32m$tmpfile\e[0m)\n"; - print TF $1; - close TF; - my $replace = `perl $tmpfile`; - chomp($replace); - unlink($tmpfile); - $line =~ s/eval\("(.+?)"\)/$replace/; - } - while ($line =~ /pkgconflibs\("(.+?)","(.+?)","(.+?)"\)/) - { - my $replace = pkgconfig_get_lib_dirs($1, $2, $3, $module); - $line =~ s/pkgconflibs\("(.+?)","(.+?)","(.+?)"\)/$replace/; - } - while ($line =~ /pkgconfversion\("(.+?)","(.+?)"\)/) - { - if (pkgconfig_check_version($1, $2, $module) != 1) - { - die "Version of package $1 is too old. Please upgrade it to version \e[1;32m$2\e[0m or greater and try again."; - } - # This doesnt actually get replaced with anything - $line =~ s/pkgconfversion\("(.+?)","(.+?)"\)//; - } - while ($line =~ /pkgconflibs\("(.+?)","(.+?)",""\)/) - { - my $replace = pkgconfig_get_lib_dirs($1, $2, "", $module); - $line =~ s/pkgconflibs\("(.+?)","(.+?)",""\)/$replace/; - } - while ($line =~ /pkgconfincludes\("(.+?)","(.+?)",""\)/) - { - my $replace = pkgconfig_get_include_dirs($1, $2, "", $module); - $line =~ s/pkgconfincludes\("(.+?)","(.+?)",""\)/$replace/; - } - while ($line =~ /pkgconfincludes\("(.+?)","(.+?)","(.+?)"\)/) - { - my $replace = pkgconfig_get_include_dirs($1, $2, $3, $module); - $line =~ s/pkgconfincludes\("(.+?)","(.+?)","(.+?)"\)/$replace/; - } - while ($line =~ /rpath\("(.+?)"\)/) - { - my $replace = make_rpath($1,$module); - $line =~ s/rpath\("(.+?)"\)/$replace/; - } - }; - if ($@) - { - my $err = $@; - #$err =~ s/at .+? line \d+.*//g; - print "\n\nConfiguration failed. The following error occured:\n\n$err\n"; - print "\nMake sure you have pkg-config installed\n"; - print "\nIn the case of gnutls configuration errors on debian,\n"; - print "Ubuntu, etc, you should ensure that you have installed\n"; - print "gnutls-bin as well as libgnutls-dev and libgnutls.\n"; - exit; - } - else - { - return $line; - } -} - -1; - diff --git a/src/modules/extra/m_geoip.cpp b/src/modules/extra/m_geoip.cpp index 967c6a761..564599bf8 100644 --- a/src/modules/extra/m_geoip.cpp +++ b/src/modules/extra/m_geoip.cpp @@ -17,6 +17,11 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/// $CompilerFlags: find_compiler_flags("geoip" "") +/// $LinkerFlags: find_linker_flags("geoip" "-lGeoIP") + +/// $PackageInfo: require_system("darwin") geoip pkg-config +/// $PackageInfo: require_system("ubuntu") libgeoip-dev pkg-config #include "inspircd.h" #include "xline.h" @@ -27,8 +32,6 @@ # pragma comment(lib, "GeoIP.lib") #endif -/* $LinkerFlags: -lGeoIP */ - class ModuleGeoIP : public Module { LocalStringExt ext; diff --git a/src/modules/extra/m_ldap.cpp b/src/modules/extra/m_ldap.cpp index 698738145..67a4e6745 100644 --- a/src/modules/extra/m_ldap.cpp +++ b/src/modules/extra/m_ldap.cpp @@ -17,6 +17,9 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/// $LinkerFlags: -llber -lldap_r +/// $PackageInfo: require_system("ubuntu") libldap2-dev + #include "inspircd.h" #include "modules/ldap.h" @@ -27,8 +30,6 @@ # pragma comment(lib, "liblber.lib") #endif -/* $LinkerFlags: -lldap_r -llber */ - class LDAPService; class LDAPRequest diff --git a/src/modules/extra/m_mysql.cpp b/src/modules/extra/m_mysql.cpp index e65a8de92..d965c88fb 100644 --- a/src/modules/extra/m_mysql.cpp +++ b/src/modules/extra/m_mysql.cpp @@ -19,6 +19,12 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/// $CompilerFlags: execute("mysql_config --include" "MYSQL_CXXFLAGS") +/// $LinkerFlags: execute("mysql_config --libs_r" "MYSQL_LDFLAGS" "-lmysqlclient") + +/// $PackageInfo: require_system("darwin") mysql-connector-c +/// $PackageInfo: require_system("ubuntu") libmysqlclient-dev + // Fix warnings about the use of `long long` on C++03. #if defined __clang__ @@ -37,9 +43,6 @@ /* VERSION 3 API: With nonblocking (threaded) requests */ -/* $CompileFlags: exec("mysql_config --include") */ -/* $LinkerFlags: exec("mysql_config --libs_r") rpath("mysql_config --libs_r") */ - /* THE NONBLOCKING MYSQL API! * * MySQL provides no nonblocking (asyncronous) API of its own, and its developers recommend diff --git a/src/modules/extra/m_pgsql.cpp b/src/modules/extra/m_pgsql.cpp index ff8c1174c..56455a718 100644 --- a/src/modules/extra/m_pgsql.cpp +++ b/src/modules/extra/m_pgsql.cpp @@ -21,15 +21,18 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/// $CompilerFlags: -Iexecute("pg_config --includedir" "POSTGRESQL_INCLUDE_DIR") +/// $LinkerFlags: -Lexecute("pg_config --libdir" "POSTGRESQL_LIBRARY_DIR") -lpq + +/// $PackageInfo: require_system("darwin") postgresql +/// $PackageInfo: require_system("ubuntu") libpq-dev + #include "inspircd.h" #include <cstdlib> #include <libpq-fe.h> #include "modules/sql.h" -/* $CompileFlags: -Iexec("pg_config --includedir") eval("my $s = `pg_config --version`;$s =~ /^.*?(\d+)\.(\d+)\.(\d+).*?$/;my $v = hex(sprintf("0x%02x%02x%02x", $1, $2, $3));print "-DPGSQL_HAS_ESCAPECONN" if(($v >= 0x080104) || ($v >= 0x07030F && $v < 0x070400) || ($v >= 0x07040D && $v < 0x080000) || ($v >= 0x080008 && $v < 0x080100));") */ -/* $LinkerFlags: -Lexec("pg_config --libdir") -lpq */ - /* SQLConn rewritten by peavey to * use EventHandler instead of * BufferedSocket. This is much neater @@ -412,14 +415,10 @@ restart: { std::string parm = p[param++]; std::vector<char> buffer(parm.length() * 2 + 1); -#ifdef PGSQL_HAS_ESCAPECONN int error; size_t escapedsize = PQescapeStringConn(sql, &buffer[0], parm.data(), parm.length(), &error); if (error) ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "BUG: Apparently PQescapeStringConn() failed"); -#else - size_t escapedsize = PQescapeString(&buffer[0], parm.data(), parm.length()); -#endif res.append(&buffer[0], escapedsize); } } @@ -447,14 +446,10 @@ restart: { std::string parm = it->second; std::vector<char> buffer(parm.length() * 2 + 1); -#ifdef PGSQL_HAS_ESCAPECONN int error; size_t escapedsize = PQescapeStringConn(sql, &buffer[0], parm.data(), parm.length(), &error); if (error) ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "BUG: Apparently PQescapeStringConn() failed"); -#else - size_t escapedsize = PQescapeString(&buffer[0], parm.data(), parm.length()); -#endif res.append(&buffer[0], escapedsize); } } diff --git a/src/modules/extra/m_regex_pcre.cpp b/src/modules/extra/m_regex_pcre.cpp index 9ae6719ba..5ad27858f 100644 --- a/src/modules/extra/m_regex_pcre.cpp +++ b/src/modules/extra/m_regex_pcre.cpp @@ -17,14 +17,17 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/// $CompilerFlags: execute("pcre-config --cflags" "PCRE_CXXFLAGS") +/// $LinkerFlags: execute("pcre-config --libs" "PCRE_LDFLAGS" "-lpcre") + +/// $PackageInfo: require_system("darwin") pcre pkg-config +/// $PackageInfo: require_system("ubuntu") libpcre3-dev pkg-config + #include "inspircd.h" #include <pcre.h> #include "modules/regex.h" -/* $CompileFlags: exec("pcre-config --cflags") */ -/* $LinkerFlags: exec("pcre-config --libs") rpath("pcre-config --libs") -lpcre */ - #ifdef _WIN32 # pragma comment(lib, "libpcre.lib") #endif diff --git a/src/modules/extra/m_regex_re2.cpp b/src/modules/extra/m_regex_re2.cpp index c4657bf8b..2f0ee2998 100644 --- a/src/modules/extra/m_regex_re2.cpp +++ b/src/modules/extra/m_regex_re2.cpp @@ -17,6 +17,12 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/// $CompilerFlags: find_compiler_flags("re2" "") +/// $LinkerFlags: find_linker_flags("re2" "-lre2") + +/// $PackageInfo: require_system("darwin") pkg-config re2 +/// $PackageInfo: require_system("ubuntu" "15.10") libre2-dev pkg-config + #include "inspircd.h" #include "modules/regex.h" @@ -32,8 +38,6 @@ #include <re2/re2.h> -/* $LinkerFlags: -lre2 */ - class RE2Regex : public Regex { RE2 regexcl; diff --git a/src/modules/extra/m_regex_stdlib.cpp b/src/modules/extra/m_regex_stdlib.cpp index 8e7bd0da2..7a888ed72 100644 --- a/src/modules/extra/m_regex_stdlib.cpp +++ b/src/modules/extra/m_regex_stdlib.cpp @@ -16,12 +16,13 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/// $CompilerFlags: -std=c++11 + + #include "inspircd.h" #include "modules/regex.h" #include <regex> -/* $CompileFlags: -std=c++11 */ - class StdRegex : public Regex { std::regex regexcl; diff --git a/src/modules/extra/m_regex_tre.cpp b/src/modules/extra/m_regex_tre.cpp index 8a1d54248..e2eafcd01 100644 --- a/src/modules/extra/m_regex_tre.cpp +++ b/src/modules/extra/m_regex_tre.cpp @@ -17,15 +17,17 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/// $CompilerFlags: find_compiler_flags("tre") +/// $LinkerFlags: find_linker_flags("tre" "-ltre") + +/// $PackageInfo: require_system("darwin") pkg-config tre +/// $PackageInfo: require_system("ubuntu") libtre-dev pkg-config #include "inspircd.h" #include "modules/regex.h" #include <sys/types.h> #include <tre/regex.h> -/* $CompileFlags: pkgconfincludes("tre","tre/regex.h","") */ -/* $LinkerFlags: pkgconflibs("tre","/libtre.so","-ltre") rpath("pkg-config --libs tre") */ - class TRERegex : public Regex { regex_t regbuf; diff --git a/src/modules/extra/m_sqlite3.cpp b/src/modules/extra/m_sqlite3.cpp index 8c07bfc6a..fa88cacc3 100644 --- a/src/modules/extra/m_sqlite3.cpp +++ b/src/modules/extra/m_sqlite3.cpp @@ -19,6 +19,11 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/// $CompilerFlags: find_compiler_flags("sqlite3") +/// $LinkerFlags: find_linker_flags("sqlite3" "-lsqlite3") + +/// $PackageInfo: require_system("darwin") pkg-config sqlite3 +/// $PackageInfo: require_system("ubuntu") libsqlite3-dev pkg-config #include "inspircd.h" #include "modules/sql.h" @@ -36,9 +41,6 @@ # pragma comment(lib, "sqlite3.lib") #endif -/* $CompileFlags: pkgconfversion("sqlite3","3.3") pkgconfincludes("sqlite3","/sqlite3.h","") */ -/* $LinkerFlags: pkgconflibs("sqlite3","/libsqlite3.so","-lsqlite3") */ - class SQLConn; typedef insp::flat_map<std::string, SQLConn*> ConnMap; diff --git a/src/modules/extra/m_ssl_gnutls.cpp b/src/modules/extra/m_ssl_gnutls.cpp index e5cb8ee90..a42efa1ab 100644 --- a/src/modules/extra/m_ssl_gnutls.cpp +++ b/src/modules/extra/m_ssl_gnutls.cpp @@ -20,6 +20,15 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/// $CompilerFlags: find_compiler_flags("gnutls") +/// $CompilerFlags: require_version("gnutls" "1.0" "2.12") execute("libgcrypt-config --cflags" "LIBGCRYPT_CXXFLAGS") + +/// $LinkerFlags: find_linker_flags("gnutls" "-lgnutls") +/// $LinkerFlags: require_version("gnutls" "1.0" "2.12") execute("libgcrypt-config --libs" "LIBGCRYPT_LDFLAGS") + +/// $PackageInfo: require_system("darwin") gnutls pkg-config +/// $PackageInfo: require_system("ubuntu" "1.0" "13.10") libgcrypt11-dev +/// $PackageInfo: require_system("ubuntu" "14.04") gnutls-bin libgnutls-dev pkg-config #include "inspircd.h" #include "modules/ssl.h" @@ -62,9 +71,6 @@ # pragma comment(lib, "libgnutls-30.lib") #endif -/* $CompileFlags: pkgconfincludes("gnutls","/gnutls/gnutls.h","") eval("print `libgcrypt-config --cflags | tr -d \r` if `pkg-config --modversion gnutls 2>/dev/null | tr -d \r` lt '2.12'") */ -/* $LinkerFlags: rpath("pkg-config --libs gnutls") pkgconflibs("gnutls","/libgnutls.so","-lgnutls") eval("print `libgcrypt-config --libs | tr -d \r` if `pkg-config --modversion gnutls 2>/dev/null | tr -d \r` lt '2.12'") */ - // These don't exist in older GnuTLS versions #if INSPIRCD_GNUTLS_HAS_VERSION(2, 1, 7) #define GNUTLS_NEW_PRIO_API diff --git a/src/modules/extra/m_ssl_mbedtls.cpp b/src/modules/extra/m_ssl_mbedtls.cpp index 50bf38266..f3b5adfd5 100644 --- a/src/modules/extra/m_ssl_mbedtls.cpp +++ b/src/modules/extra/m_ssl_mbedtls.cpp @@ -16,8 +16,11 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/// $LinkerFlags: -lmbedtls + +/// $PackageInfo: require_system("darwin") mbedtls +/// $PackageInfo: require_system("ubuntu" "16.04") libmbedtls-dev -/* $LinkerFlags: -lmbedtls */ #include "inspircd.h" #include "modules/ssl.h" diff --git a/src/modules/extra/m_ssl_openssl.cpp b/src/modules/extra/m_ssl_openssl.cpp index 8467cc6d4..8843c34f6 100644 --- a/src/modules/extra/m_ssl_openssl.cpp +++ b/src/modules/extra/m_ssl_openssl.cpp @@ -21,6 +21,12 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/// $CompilerFlags: find_compiler_flags("openssl") +/// $LinkerFlags: find_linker_flags("openssl" "-lssl -lcrypto") + +/// $PackageInfo: require_system("darwin") openssl pkg-config +/// $PackageInfo: require_system("ubuntu" "16.04") libssl-dev openssl pkg-config + #include "inspircd.h" #include "iohook.h" @@ -46,9 +52,6 @@ # pragma comment(lib, "libeay32.lib") #endif -/* $CompileFlags: pkgconfversion("openssl","0.9.7") pkgconfincludes("openssl","/openssl/ssl.h","") */ -/* $LinkerFlags: rpath("pkg-config --libs openssl") pkgconflibs("openssl","/libssl.so","-lssl -lcrypto") */ - #if ((OPENSSL_VERSION_NUMBER >= 0x10000000L) && (!(defined(OPENSSL_NO_ECDH)))) // OpenSSL 0.9.8 includes some ECC support, but it's unfinished. Enable only for 1.0.0 and later. #define INSPIRCD_OPENSSL_ENABLE_ECDH diff --git a/tools/genssl b/tools/genssl index 739f7fc7d..c88f9534f 100755 --- a/tools/genssl +++ b/tools/genssl @@ -31,7 +31,7 @@ use warnings FATAL => qw(all); use File::Temp(); # IMPORTANT: This script has to be able to run by itself so that it can be used -# by binary distributions where the make/utilities.pm module will not +# by binary distributions where the make/console.pm module will not # be available! sub prompt($$) { |