diff options
Diffstat (limited to 'make')
-rwxr-xr-x | make/calcdep.pl | 2 | ||||
-rw-r--r-- | make/common.pm | 37 | ||||
-rw-r--r-- | make/configure.pm | 69 | ||||
-rw-r--r-- | make/console.pm | 55 | ||||
-rw-r--r-- | make/directive.pm | 6 | ||||
-rw-r--r-- | make/test/clock_gettime.cpp | 1 | ||||
-rw-r--r-- | make/test/compiler.cpp | 2 | ||||
-rw-r--r-- | make/test/compiler_info.cpp | 41 |
8 files changed, 151 insertions, 62 deletions
diff --git a/make/calcdep.pl b/make/calcdep.pl index 882e75f22..99355efa4 100755 --- a/make/calcdep.pl +++ b/make/calcdep.pl @@ -166,7 +166,7 @@ END obj/ld-extra.cmd: $core_src \@\$(SOURCEPATH)/make/unit-cc.pl gen-ld \$\@ \$^ \$> -bin/inspircd: obj/ld-extra.cmd $core_mk +bin/inspircd: $core_mk obj/ld-extra.cmd \@\$(SOURCEPATH)/make/unit-cc.pl static-ld \$\@ \$^ \$> inspircd: bin/inspircd diff --git a/make/common.pm b/make/common.pm index b1608db56..6ca280bec 100644 --- a/make/common.pm +++ b/make/common.pm @@ -1,7 +1,7 @@ # # InspIRCd -- Internet Relay Chat Daemon # -# Copyright (C) 2013-2014 Peter Powell <petpow@saberuk.com> +# Copyright (C) 2013-2017 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 @@ -31,10 +31,13 @@ use Exporter qw(import); use File::Path qw(mkpath); use File::Spec::Functions qw(rel2abs); +use make::console; + our @EXPORT = qw(create_directory get_cpu_count get_version - module_installed); + read_config_file + write_config_file); sub create_directory($$) { my ($location, $permissions) = @_; @@ -86,12 +89,6 @@ sub get_version { return %version; } -sub module_installed($) { - my $module = shift; - eval("use $module;"); - return !$@; -} - sub get_cpu_count { my $count = 1; if ($^O =~ /bsd/) { @@ -107,4 +104,28 @@ sub get_cpu_count { return $count; } +sub read_config_file($) { + my $path = shift; + my %config; + open(my $fh, $path) or return %config; + while (my $line = <$fh>) { + next if $line =~ /^\s*($|\#)/; + my ($key, $value) = ($line =~ /^(\S+)(?:\s(.*))?$/); + $config{$key} = $value; + } + close $fh; + return %config; +} + +sub write_config_file($%) { + my $path = shift; + my %config = @_; + open(my $fh, '>', $path) or print_error "unable to write to $path: $!"; + while (my ($key, $value) = each %config) { + $value //= ''; + say $fh "$key $value"; + } + close $fh; +} + 1; diff --git a/make/configure.pm b/make/configure.pm index 6b4693d45..dbbbf6509 100644 --- a/make/configure.pm +++ b/make/configure.pm @@ -1,7 +1,7 @@ # # InspIRCd -- Internet Relay Chat Daemon # -# Copyright (C) 2012-2014 Peter Powell <petpow@saberuk.com> +# Copyright (C) 2012-2017 Peter Powell <petpow@saberuk.com> # Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net> # Copyright (C) 2007-2008 Craig Edwards <craigedwards@brainbox.cc> # Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org> @@ -42,6 +42,7 @@ use make::console; use constant CONFIGURE_DIRECTORY => '.configure'; use constant CONFIGURE_CACHE_FILE => catfile(CONFIGURE_DIRECTORY, 'cache.cfg'); use constant CONFIGURE_CACHE_VERSION => '1'; +use constant CONFIGURE_ERROR_PIPE => $ENV{INSPIRCD_VERBOSE} ? '' : '1>/dev/null 2>/dev/null'; our @EXPORT = qw(CONFIGURE_CACHE_FILE CONFIGURE_CACHE_VERSION @@ -51,7 +52,6 @@ our @EXPORT = qw(CONFIGURE_CACHE_FILE run_test test_file test_header - read_configure_cache write_configure_cache get_compiler_info find_compiler @@ -97,7 +97,7 @@ sub __get_template_settings($$$) { sub __test_compiler($) { my $compiler = shift; - return 0 unless run_test("`$compiler`", !system "$compiler -v >/dev/null 2>&1"); + return 0 unless run_test("`$compiler`", !system "$compiler -v ${\CONFIGURE_ERROR_PIPE}"); return 0 unless run_test("`$compiler`", test_file($compiler, 'compiler.cpp', '-fno-rtti'), 'compatible'); return 1; } @@ -179,7 +179,7 @@ EOH sub cmd_update { print_error "You have not run $0 before. Please do this before trying to update the generated files." unless -f CONFIGURE_CACHE_FILE; say 'Updating...'; - my %config = read_configure_cache(); + my %config = read_config_file(CONFIGURE_CACHE_FILE); my %compiler = get_compiler_info($config{CXX}); my %version = get_version $config{DISTRIBUTION}; parse_templates(\%config, \%compiler, \%version); @@ -199,8 +199,8 @@ sub test_file($$;$) { my ($compiler, $file, $args) = @_; my $status = 0; $args //= ''; - $status ||= system "$compiler -o __test_$file make/test/$file $args >/dev/null 2>&1"; - $status ||= system "./__test_$file >/dev/null 2>&1"; + $status ||= system "$compiler -o __test_$file make/test/$file $args ${\CONFIGURE_ERROR_PIPE}"; + $status ||= system "./__test_$file ${\CONFIGURE_ERROR_PIPE}"; unlink "./__test_$file"; return !$status; } @@ -208,24 +208,12 @@ sub test_file($$;$) { sub test_header($$;$) { my ($compiler, $header, $args) = @_; $args //= ''; - open(COMPILER, "| $compiler -E - $args >/dev/null 2>&1") or return 0; - print COMPILER "#include <$header>"; - close(COMPILER); + open(my $fh, "| $compiler -E - $args ${\CONFIGURE_ERROR_PIPE}") or return 0; + print $fh "#include <$header>"; + close $fh; return !$?; } -sub read_configure_cache { - my %config; - open(CACHE, CONFIGURE_CACHE_FILE) or return %config; - while (my $line = <CACHE>) { - next if $line =~ /^\s*($|\#)/; - my ($key, $value) = ($line =~ /^(\S+)(?:\s(.*))?$/); - $config{$key} = $value; - } - close(CACHE); - return %config; -} - sub write_configure_cache(%) { unless (-e CONFIGURE_DIRECTORY) { print_format "Creating <|GREEN ${\CONFIGURE_DIRECTORY}|> ...\n"; @@ -234,29 +222,20 @@ sub write_configure_cache(%) { print_format "Writing <|GREEN ${\CONFIGURE_CACHE_FILE}|> ...\n"; my %config = @_; - open(CACHE, '>', CONFIGURE_CACHE_FILE) or print_error "unable to write ${\CONFIGURE_CACHE_FILE}: $!"; - while (my ($key, $value) = each %config) { - $value //= ''; - say CACHE "$key $value"; - } - close(CACHE); + write_config_file CONFIGURE_CACHE_FILE, %config; } sub get_compiler_info($) { my $binary = shift; - my $version = `$binary -v 2>&1`; - if ($version =~ /Apple\sLLVM\sversion\s(\d+\.\d+)/i) { - # Apple version their LLVM releases slightly differently to the mainline LLVM. - # See https://trac.macports.org/wiki/XcodeVersionInfo for more information. - return (NAME => 'AppleClang', VERSION => $1); - } elsif ($version =~ /clang\sversion\s(\d+\.\d+)/i) { - return (NAME => 'Clang', VERSION => $1); - } elsif ($version =~ /gcc\sversion\s(\d+\.\d+)/i) { - return (NAME => 'GCC', VERSION => $1); - } elsif ($version =~ /(?:icc|icpc)\sversion\s(\d+\.\d+).\d+\s\(gcc\sversion\s(\d+\.\d+).\d+/i) { - return (NAME => 'ICC', VERSION => $1); + my %info = (NAME => 'Unknown', VERSION => '0.0'); + return %info if system "$binary -o __compiler_info make/test/compiler_info.cpp ${\CONFIGURE_ERROR_PIPE}"; + open(my $fh, '-|', './__compiler_info 2>/dev/null'); + while (my $line = <$fh>) { + $info{$1} = $2 if $line =~ /^([A-Z]+)\s(.+)$/; } - return (NAME => $binary, VERSION => '0.0'); + close $fh; + unlink './__compiler_info'; + return %info; } sub find_compiler { @@ -278,11 +257,11 @@ sub parse_templates($$$) { # Iterate through files in make/template. foreach (<make/template/*>) { print_format "Parsing <|GREEN $_|> ...\n"; - open(TEMPLATE, $_) or print_error "unable to read $_: $!"; + open(my $fh, $_) or print_error "unable to read $_: $!"; my (@lines, $mode, @platforms, %targets); # First pass: parse template variables and directives. - while (my $line = <TEMPLATE>) { + while (my $line = <$fh>) { chomp $line; # Does this line match a variable? @@ -322,7 +301,7 @@ sub parse_templates($$$) { } push @lines, $line; } - close(TEMPLATE); + close $fh; # Only proceed if this file should be templated on this platform. if ($#platforms < 0 || grep { $_ eq $^O } @platforms) { @@ -418,11 +397,11 @@ sub parse_templates($$$) { # Write the template file. print_format "Writing <|GREEN $target|> ...\n"; - open(TARGET, '>', $target) or print_error "unable to write $target: $!"; + open(my $fh, '>', $target) or print_error "unable to write $target: $!"; foreach (@final_lines) { - say TARGET $_; + say $fh $_; } - close(TARGET); + close $fh; # Set file permissions. if (defined $mode) { diff --git a/make/console.pm b/make/console.pm index 84fbaae4a..0d3c1b38d 100644 --- a/make/console.pm +++ b/make/console.pm @@ -1,7 +1,7 @@ # # InspIRCd -- Internet Relay Chat Daemon # -# Copyright (C) 2014 Peter Powell <petpow@saberuk.com> +# Copyright (C) 2014-2017 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 @@ -27,11 +27,14 @@ use feature ':5.10'; use strict; use warnings FATAL => qw(all); +use Class::Struct qw(struct); +use Exporter qw(import); use File::Path qw(mkpath); use File::Spec::Functions qw(rel2abs); -use Exporter qw(import); -our @EXPORT = qw(print_format +our @EXPORT = qw(command + execute_command + print_format print_error print_warning prompt_bool @@ -39,8 +42,9 @@ our @EXPORT = qw(print_format prompt_string); my %FORMAT_CODES = ( - DEFAULT => "\e[0m", - BOLD => "\e[1m", + DEFAULT => "\e[0m", + BOLD => "\e[1m", + UNDERLINE => "\e[4m", RED => "\e[1;31m", GREEN => "\e[1;32m", @@ -48,6 +52,13 @@ my %FORMAT_CODES = ( BLUE => "\e[1;34m" ); +my %commands; + +struct 'command' => { + 'callback' => '$', + 'description' => '$', +}; + sub __console_format($$) { my ($name, $data) = @_; return $data unless -t STDOUT; @@ -111,4 +122,38 @@ sub prompt_string($$$) { return $answer ? $answer : $default; } +sub command($$$) { + my ($name, $description, $callback) = @_; + $commands{$name} = command->new; + $commands{$name}->callback($callback); + $commands{$name}->description($description); +} + +sub command_alias($$) { + my ($source, $target) = @_; + command $source, undef, sub(@) { + execute_command $target, @_; + }; +} + +sub execute_command(@) { + my $command = defined $_[0] ? lc shift : 'help'; + if ($command eq 'help') { + print_format "<|GREEN Usage:|> $0 <<|UNDERLINE COMMAND|>> [<|UNDERLINE OPTIONS...|>]\n\n"; + print_format "<|GREEN Commands:|>\n"; + for my $key (sort keys %commands) { + next unless defined $commands{$key}->description; + my $name = sprintf "%-15s", $key; + my $description = $commands{$key}->description; + print_format " <|BOLD $name|> # $description\n"; + } + exit 0; + } elsif (!$commands{$command}) { + print_error "no command called <|BOLD $command|> exists!", + "See <|BOLD $0 help|> for a list of commands."; + } else { + return $commands{$command}->callback->(@_); + } +} + 1; diff --git a/make/directive.pm b/make/directive.pm index 4501fc5ec..2e9e7ed61 100644 --- a/make/directive.pm +++ b/make/directive.pm @@ -41,16 +41,16 @@ our @EXPORT = qw(get_directive sub get_directive($$;$) { my ($file, $property, $default) = @_; - open(MODULE, $file) or return $default; + open(my $fh, $file) or return $default; my $value = ''; - while (<MODULE>) { + while (<$fh>) { if ($_ =~ /^\/\* \$(\S+): (.+) \*\/$/ || $_ =~ /^\/\/\/ \$(\S+): (.+)/) { next unless $1 eq $property; $value .= ' ' . execute_functions($file, $1, $2); } } - close(MODULE); + close $fh; # Strip all extraneous whitespace. $value =~ s/^\s+|\s+$//g; diff --git a/make/test/clock_gettime.cpp b/make/test/clock_gettime.cpp index 91d8cd412..d111d591f 100644 --- a/make/test/clock_gettime.cpp +++ b/make/test/clock_gettime.cpp @@ -1,6 +1,7 @@ /* * InspIRCd -- Internet Relay Chat Daemon * + * Copyright (C) 2013 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 diff --git a/make/test/compiler.cpp b/make/test/compiler.cpp index e2cbd9f64..f01423325 100644 --- a/make/test/compiler.cpp +++ b/make/test/compiler.cpp @@ -1,6 +1,8 @@ /* * InspIRCd -- Internet Relay Chat Daemon * + * Copyright (C) 2016 Attila Molnar <attilamolnar@hush.com> + * Copyright (C) 2014-2015 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 diff --git a/make/test/compiler_info.cpp b/make/test/compiler_info.cpp new file mode 100644 index 000000000..10b156fc8 --- /dev/null +++ b/make/test/compiler_info.cpp @@ -0,0 +1,41 @@ +/* + * InspIRCd -- Internet Relay Chat Daemon + * + * Copyright (C) 2017 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/>. + */ + + +#include <iostream> + +#if defined __INTEL_COMPILER // Also defines __clang__ and __GNUC__ +# define INSPIRCD_COMPILER_NAME "Intel" +# define INSPIRCD_COMPILER_VERSION (__INTEL_COMPILER / 100) << '.' << (__INTEL_COMPILER % 100) +#elif defined __clang__ // Also defines __GNUC__ +# if defined __apple_build_version__ +# define INSPIRCD_COMPILER_NAME "AppleClang" +# else +# define INSPIRCD_COMPILER_NAME "Clang" +# endif +# define INSPIRCD_COMPILER_VERSION __clang_major__ << '.' << __clang_minor__ +#elif defined __GNUC__ +# define INSPIRCD_COMPILER_NAME "GCC" +# define INSPIRCD_COMPILER_VERSION __GNUC__ << '.' << __GNUC_MINOR__ +#endif + +int main() { + std::cout << "NAME " << INSPIRCD_COMPILER_NAME << std::endl + << "VERSION " << INSPIRCD_COMPILER_VERSION << std::endl; + return 0; +} |