1
0
mirror of https://github.com/anope/anope.git synced 2026-07-09 15:43:13 +02:00

Merge pull request #121 from SaberUK/2.0+cmake-improvements

Various improvements to the build system.
This commit is contained in:
Adam
2015-07-01 20:00:59 -04:00
3 changed files with 3 additions and 276 deletions
+3 -18
View File
@@ -10,11 +10,6 @@ if(COMMAND cmake_policy)
endif(POLICY CMP0007)
endif(COMMAND cmake_policy)
# If the Source dir and the Binary dir are the same, we are building in-source, which we will disallow due to Autotools being there (but only on non-Windows)
if(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR} AND NOT WIN32)
message(FATAL_ERROR "You can not use CMake to build Anope from the root of it's source tree! Remove the CMakeCache.txt file from this directory, then create a separate directory (either below this directory or elsewhere), and then re-run CMake from there.")
endif(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR} AND NOT WIN32)
# Set the project as C++ primarily, but have C enabled for the checks required later
project(Anope CXX)
enable_language(C)
@@ -86,7 +81,7 @@ set(DEFAULT_LIBRARY_DIRS)
set(DEFAULT_INCLUDE_DIRS)
# If we are using a GNU compiler (have to use CXX because it seems to fail on C), we will be able to determine it's default paths for libraries and includes
if(CMAKE_COMPILER_IS_GNUCXX OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
if(CMAKE_COMPILER_IS_GNUCXX OR ${CMAKE_CXX_COMPILER_ID} MATCHES "Clang$")
# First look for the compiler's default library directories
execute_process(COMMAND ${CMAKE_C_COMPILER} -print-search-dirs OUTPUT_VARIABLE LINES OUTPUT_STRIP_TRAILING_WHITESPACE)
# Find only the part after "libraries: "
@@ -152,7 +147,7 @@ if(CMAKE_COMPILER_IS_GNUCXX OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
if(DEFAULT_INCLUDE_DIRS)
remove_list_duplicates(DEFAULT_INCLUDE_DIRS)
endif(DEFAULT_INCLUDE_DIRS)
endif(CMAKE_COMPILER_IS_GNUCXX OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
endif(CMAKE_COMPILER_IS_GNUCXX OR ${CMAKE_CXX_COMPILER_ID} MATCHES "Clang$")
# If we are using Visual Studio, locate the path of the Windows Server 2008 SDK or Windows Server 2003 Platform SDK, depending on which is installed
if(MSVC)
@@ -228,8 +223,6 @@ endif(EXTRA_LIBS)
# Find gettext
find_package(Gettext)
# Add an optional variable for using run-cc.pl for building, Perl will be checked later regardless of this setting
option(USE_RUN_CC_PL "Use run-cc.pl for building" OFF)
option(USE_PCH "Use precompiled headers" OFF)
# Use the following directories as includes
@@ -370,19 +363,11 @@ find_program(GREP grep)
find_program(SH sh)
find_program(CHGRP chgrp)
find_program(CHMOD chmod)
find_program(PERL perl)
# If perl is included on the system and the user wants to use run-cc.pl, change the commands for compiling and linking
if(PERL AND USE_RUN_CC_PL)
set(CMAKE_CXX_COMPILE_OBJECT "${PERL} ${Anope_SOURCE_DIR}/run-cc.pl -q ${CMAKE_CXX_COMPILE_OBJECT}")
set(CMAKE_CXX_LINK_EXECUTABLE "${PERL} ${Anope_SOURCE_DIR}/run-cc.pl -q ${CMAKE_CXX_LINK_EXECUTABLE}")
set(CMAKE_CXX_CREATE_SHARED_MODULE "${PERL} ${Anope_SOURCE_DIR}/run-cc.pl -q ${CMAKE_CXX_CREATE_SHARED_MODULE}")
endif(PERL AND USE_RUN_CC_PL)
# If a INSTDIR was passed in to CMake, use it as the install prefix, otherwise set the default install prefix to the services directory under the user's home directory
if(INSTDIR)
set(CMAKE_INSTALL_PREFIX "${INSTDIR}")
else(INSTDIR)
elseif(NOT CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/services")
endif(INSTDIR)
-32
View File
@@ -62,12 +62,6 @@ Run_Build_System () {
BUILD_TYPE="-DCMAKE_BUILD_TYPE:STRING=RELEASE"
fi
if [ "$USE_RUN_CC_PL" = "yes" ] ; then
RUN_CC_PL="-DUSE_RUN_CC_PL:BOOLEAN=ON"
else
RUN_CC_PL="-DUSE_RUN_CC_PL:BOOLEAN=OFF"
fi
if [ "$USE_PCH" = "yes" ] ; then
PCH="-DUSE_PCH:BOOLEAN=ON"
else
@@ -131,7 +125,6 @@ INSTDIR=$HOME/services
RUNGROUP=
UMASK=
DEBUG="no"
USE_RUN_CC_PL="no"
USE_PCH="no"
EXTRA_INCLUDE_DIRS=
EXTRA_LIB_DIRS=
@@ -321,30 +314,6 @@ echo ""
####
TEMP_YN="n"
if [ "$USE_RUN_CC_PL" = "yes" ] ; then
TEMP_YN="y"
fi
echo "You can optionally have the build run through run-cc.pl, which will"
echo "cause warnings and errors (if any) to be colored yellow and red,"
echo "respectively. This relies on Perl being installed, so if you say yes"
echo "to this without Perl, the option will be ignored."
echo "NOTE: If you are using MinGW, it is NOT recommended to say yes to"
echo "this, it may fail."
echo "Would you like to utilize run-cc.pl?"
echo2 "[$TEMP_YN] "
read YN
if [ "$YN" ] ; then
if [ "$YN" = "y" ] ; then
USE_RUN_CC_PL="yes"
else
USE_RUN_CC_PL="no"
fi
fi
echo ""
####
TEMP_YN="n"
if [ "$USE_PCH" = "yes" ] ; then
TEMP_YN="y"
@@ -426,7 +395,6 @@ INSTDIR="$INSTDIR"
RUNGROUP="$RUNGROUP"
UMASK=$UMASK
DEBUG="$DEBUG"
USE_RUN_CC_PL="$USE_RUN_CC_PL"
USE_PCH="$USE_PCH"
EXTRA_INCLUDE_DIRS="$EXTRA_INCLUDE_DIRS"
EXTRA_LIB_DIRS="$EXTRA_LIB_DIRS"
-226
View File
@@ -1,226 +0,0 @@
#!/usr/bin/env perl
### THIS IS DESIGNED TO BE RUN BY MAKE! DO NOT RUN FROM THE SHELL (because it MIGHT sigterm the shell)! ###
use strict;
use warnings FATAL => qw(all);
use POSIX ();
# Runs the compiler, passing it the given arguments.
# Filters select output from the compiler's standard error channel and
# can take different actions as a result.
# NOTE: this is *NOT* a hash (sadly: a hash would stringize all the regexes and thus render them useless, plus you can't index a hash based on regexes anyway)
# even though we use the => in it.
# The subs are passed the message, and anything the regex captured.
my $flag = shift(@ARGV);
my $quiet = 0;
my $cc;
if ($flag eq "-q") {
$quiet = 1;
$cc = shift(@ARGV);
}
else {
$cc = $flag;
}
my $showncmdline = 0;
# GCC's "location of error stuff", which accumulates the "In file included from" include stack
my $location = "";
my @msgfilters = (
[ qr/^(.*) warning: cannot pass objects of non-POD type `(.*)' through `\.\.\.'; call will abort at runtime/ => sub {
my ($msg, $where, $type) = @_;
my $errstr = $location . "$where error: cannot pass objects of non-POD type `$type' through `...'\n";
$location = "";
if ($type =~ m/::(basic_)?string/) {
$errstr .= "$where (Did you forget to call c_str()?)\n";
}
die $errstr;
} ],
# Start of an include stack.
[ qr/^In file included from .*[,:]$/ => sub {
my ($msg) = @_;
$location = "$msg\n";
return undef;
} ],
# Continuation of an include stack.
[ qr/^ from .*[,:]$/ => sub {
my ($msg) = @_;
$location .= "$msg\n";
return undef;
} ],
# A function, method, constructor, or destructor is the site of a problem
[ qr/In ((con|de)structor|(member )?function)/ => sub {
my ($msg) = @_;
# If a complete location string is waiting then probably we dropped an error, so drop the location for a new one.
if ($location =~ m/In ((con|de)structor|(member )?function)/) {
$location = "$msg\n";
} else {
$location .= "$msg\n";
}
return undef;
} ],
[ qr/^.* warning: / => sub {
my ($msg) = @_;
my $str = $location . "\e[33;1m$msg\e[0m\n";
$showncmdline = 1;
$location = "";
return $str;
} ],
[ qr/^.* error: / => sub {
my ($msg) = @_;
my $str = "";
$str = "An error occured when executing:\e[37;1m $cc " . join(' ', @ARGV) . "\n" unless $showncmdline;
$showncmdline = 1;
$str .= $location . "\e[31;1m$msg\e[0m\n";
$location = "";
return $str;
} ],
[ qr/./ => sub {
my ($msg) = @_;
$msg = $location . $msg;
$location = "";
$msg =~ s/std::basic_string\<char\, std\:\:char_traits\<char\>, std::allocator\<char\> \>(\s+|)/std::string/g;
$msg =~ s/std::basic_string\<char\, .*?irc_char_traits, std::allocator\<char\> \>(\s+|)/irc::string/g;
$msg =~ s/std::basic_string\<char\, .*?ci_char_traits, std::allocator\<char\> \>(\s+|)/ci::string/g;
for my $stl (qw(deque vector list)) {
$msg =~ s/std::$stl\<(\S+), std::allocator\<\1\> \>/std::$stl\<$1\>/g;
$msg =~ s/std::$stl\<(std::pair\<\S+, \S+\>), std::allocator\<\1 \> \>/std::$stl<$1 >/g;
}
$msg =~ s/std::map\<(\S+), (\S+), std::less\<\1\>, std::allocator\<std::pair\<const \1, \2\> \> \>/std::map<$1, $2>/g;
# Warning: These filters are GNU C++ specific!
$msg =~ s/__gnu_cxx::__normal_iterator\<(\S+)\*, std::vector\<\1\> \>/std::vector<$1>::iterator/g;
$msg =~ s/__gnu_cxx::__normal_iterator\<(std::pair\<\S+, \S+\>)\*, std::vector\<\1 \> \>/std::vector<$1 >::iterator/g;
$msg =~ s/__gnu_cxx::__normal_iterator\<char\*, std::string\>/std::string::iterator/g;
$msg =~ s/__gnu_cxx::__normal_iterator\<char\*, irc::string\>/irc::string::iterator/g;
$msg =~ s/__gnu_cxx::__normal_iterator\<char\*, ci::string\>/ci::string::iterator/g;
return $msg;
} ],
);
my $pid;
my ($r_stderr, $w_stderr);
my $name = "";
my $action = "";
if ($cc eq "ar") {
$name = $ARGV[1];
$action = "ARCHIVE";
} else {
foreach my $n (@ARGV)
{
if ($n =~ /\.cpp|\.c$/)
{
if ($action eq "BUILD")
{
$name .= " " . $n;
}
else
{
$action = "BUILD";
$name = $n;
}
}
elsif ($action eq "BUILD") # .cpp has priority.
{
next;
}
elsif ($n eq "-o")
{
$action = $name = $n;
}
elsif ($name eq "-o")
{
$action = "LINK";
$name = $n;
}
}
}
if (!defined($cc) || $cc eq "") {
die "Compiler not specified!\n";
}
pipe($r_stderr, $w_stderr) or die "pipe stderr: $!\n";
$pid = fork;
die "Cannot fork to start $cc! $!\n" unless defined($pid);
if ($pid) {
if ($quiet == 0) {
printf "\t\e[1;32m%-20s\e[0m%s\n", $action . ":", $name unless $name eq "";
}
my $fail = 0;
# Parent - Close child-side pipes.
close $w_stderr;
# Close STDIN to ensure no conflicts with child.
close STDIN;
# Now read each line of stderr
LINE: while (defined(my $line = <$r_stderr>)) {
chomp $line;
for my $filter (@msgfilters) {
my @caps;
if (@caps = ($line =~ $filter->[0])) {
$@ = "";
$line = eval {
$filter->[1]->($line, @caps);
};
if ($@) {
# Note that $line is undef now.
$fail = 1;
print STDERR $@;
}
next LINE unless defined($line);
}
}
# Chomp off newlines again, in case the filters put some back in.
chomp $line;
print STDERR "$line\n";
}
waitpid $pid, 0;
close $r_stderr;
my $exit = $?;
# Simulate the same exit, so make gets the right termination info.
if (POSIX::WIFSIGNALED($exit)) {
# Make won't get the right termination info (it gets ours, not the compiler's), so we must tell the user what really happened ourselves!
print STDERR "$cc killed by signal " . POSIX::WTERMSIGN($exit) . "\n";
kill "TERM", getppid(); # Needed for bsd make.
kill "TERM", $$;
}
else {
if (POSIX::WEXITSTATUS($exit) == 0) {
if ($fail) {
kill "TERM", getppid(); # Needed for bsd make.
kill "TERM", $$;
}
exit 0;
} else {
exit POSIX::WEXITSTATUS($exit);
}
}
} else {
# Child - Close parent-side pipes.
close $r_stderr;
# Divert stderr
open STDERR, ">&", $w_stderr or die "Cannot divert STDERR: $!\n";
# Run the compiler!
exec { $cc } $cc, @ARGV;
die "exec $cc: $!\n";
}