summaryrefslogtreecommitdiff
path: root/make
diff options
context:
space:
mode:
Diffstat (limited to 'make')
-rwxr-xr-xmake/calcdep.pl2
-rw-r--r--make/common.pm37
-rw-r--r--make/configure.pm69
-rw-r--r--make/console.pm55
-rw-r--r--make/directive.pm6
-rw-r--r--make/test/clock_gettime.cpp1
-rw-r--r--make/test/compiler.cpp2
-rw-r--r--make/test/compiler_info.cpp41
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;
+}