]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Move dependency tracking from ./configure to Makefile
authordanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Tue, 1 Sep 2009 15:04:40 +0000 (15:04 +0000)
committerdanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Tue, 1 Sep 2009 15:04:40 +0000 (15:04 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11556 e03df62e-2008-0410-955e-edbf42e46eb7

.Makefile.inc
configure
make/bsd-dep.mk [new file with mode: 0644]
make/bsd-real.mk [new file with mode: 0644]
make/calcdep.pl [new file with mode: 0755]
make/gnu-dep.mk [new file with mode: 0644]
make/gnu-real.mk [new file with mode: 0644]
make/unit-cc.pl [new file with mode: 0755]

index 76c9b01f9b96d99542c671f0a880a2fc32b992d4..2e9b3e635b12787c296772cd0d9dc060df3c9cb5 100644 (file)
@@ -6,7 +6,9 @@
 #   Please do not edit unless you know what you're doing.
 #
 
-@GNU_ONLY COMPILE_ROOT = $(shell pwd)
+@GNU_ONLY MAKESTYLE = gnu
+@GNU_ONLY COMPILE_ROOT ?= $(shell pwd)
+@BSD_ONLY MAKESTYLE = bsd
 @BSD_ONLY COMPILE_ROOT != pwd
 
 @IFDEF D
@@ -21,6 +23,7 @@ NICEFLAGS += -I$(COMPILE_ROOT)/include
 
 CC = @CC@
 FLAGS = $(NICEFLAGS) -pedantic
+PICLDFLAGS = -fPIC -DPIC -shared -export-dynamic
 LDLIBS = @LDLIBS@
 BASE = "@BASE_DIR@"
 CONPATH = "@CONFIG_DIR@"
@@ -28,19 +31,20 @@ MODPATH = "@MODULE_DIR@"
 BINPATH = "@BINARY_DIR@"
 LAUNCHDPATH = "/System/Library/LaunchDaemons"
 LIBPATH = "@LIBRARY_DIR@"
-MODULES = @MODULES@
 INSTMODE = 0755
+SOCKETENGINE = @SOCKETENGINE@
 @GNU_ONLY MAKEFLAGS += --no-print-directory
 
 @IFDEF V
     RUNCC = $(CC)
+    VERBOSE = -v
 @ELSE
     @GNU_ONLY MAKEFLAGS += --silent
+    @BSD_ONLY MAKE += -s
     RUNCC = $(COMPILE_ROOT)/make/run-cc.pl $(CC)
 @ENDIF
 
-@GNU_ONLY export COMPILE_ROOT RUNCC FLAGS NICEFLAGS CC LDLIBS MODULES MODPATH LIBPATH INSTMODE
-@BSD_ONLY MAKEARGS = -s 'RUNCC=${RUNCC}' 'FLAGS=${FLAGS}' 'NICEFLAGS=${NICEFLAGS}' 'CC=${CC}' 'LDLIBS=${LDLIBS}' 'MODULES=${MODULES}' 'MODPATH=${MODPATH}' 'LIBPATH=${LIBPATH}' 'INSTMODE=${INSTMODE}'
+@DO_EXPORT RUNCC FLAGS NICEFLAGS CC LDLIBS PICLDFLAGS VERBOSE SOCKETENGINE
 
 # Default target
 
@@ -48,7 +52,15 @@ INSTMODE = 0755
    _all: module
 @ENDIF
 
-all: ircd mods finishmessage
+all: finishmessage
+
+alldep: $(HEADER)
+       @echo -n "Generating module dependencies..."
+       @$(MAKEENV) $(MAKE) -C src -f ../make/$(MAKESTYLE)-dep.mk all
+       @echo 'done'
+
+allreal: alldep
+       @$(MAKEENV) $(MAKE) -C src -f ../make/$(MAKESTYLE)-real.mk all
 
 debug:
        @${MAKE} D=1 all
@@ -77,14 +89,7 @@ std-header:
        @echo "*  while you wait for make to run?  *"
        @echo "*************************************"
 
-ircd: $(HEADER)
-       @${MAKE} -C src $(MAKEARGS) inspircd commands
-
-mods: $(HEADER)
-       @${MAKE} -C src/modules $(MAKEARGS)
-
-# Make this depend on 'ircd' and 'mods', so its always output last even with -j
-finishmessage: ircd mods
+finishmessage: allreal
        @echo ""
        @echo "*************************************"
        @echo "*        BUILD COMPLETE!            *"
@@ -93,14 +98,15 @@ finishmessage: ircd mods
        @echo "*         make install              *"
        @echo "*************************************"
 
-install: ircd mods@EXTRA_DIR@
+install: allreal@EXTRA_DIR@
        @-install -d -m $(INSTMODE) $(BASE)
        @-install -d -m $(INSTMODE) $(LIBPATH)
        @-install -d -m $(INSTMODE) $(BINPATH)
        @-install -d -m $(INSTMODE) $(CONPATH)
        @-install -d -m $(INSTMODE) $(MODPATH)
        -install -m $(INSTMODE) @STARTSCRIPT@ $(@DESTINATION@) 2>/dev/null
-@INSTALL_LIST@ @echo ""
+@INSTALL_LIST@ -install -m $(INSTMODE) src/inspircd $(BINPATH)
+       @echo ""
        @echo "*************************************"
        @echo "*        INSTALL COMPLETE!          *"
        @echo "*                                   *"
@@ -128,6 +134,7 @@ modclean:
        rm -f src/modules/*/*.o
 
 deinstall:
+       -rm $(BINPATH)/inspircd
 @UNINSTALL_LIST@
 
 squeakyclean: distclean
index edea764f1b36242489f5f01b57f14373d68e61fd..d34c1fd2d72c6cc0492966a226f5f0c338313ea3 100755 (executable)
--- a/configure
+++ b/configure
@@ -1131,7 +1131,6 @@ my ($mliflags, $mfrules, $mobjs, $mfcount) = ("", "", "", 0);
 
 sub writefiles {
        my($writeheader) = @_;
-       my $se = "";
        # First File.. inspircd_config.h
        chomp(my $incos = `uname -n -s -r`);
        chomp(my $version = `sh src/version.sh`);
@@ -1196,17 +1195,17 @@ print FILEHANDLE "#define MAXBUF " . ($config{MAXBUF}+2) . "\n";
                my $use_hiperf = 0;
                if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
                        print FILEHANDLE "#define USE_KQUEUE\n";
-                       $se = "socketengine_kqueue";
+                       $config{SOCKETENGINE} = "socketengine_kqueue";
                        $use_hiperf = 1;
                }
                if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
                        print FILEHANDLE "#define USE_EPOLL\n";
-                       $se = "socketengine_epoll";
+                       $config{SOCKETENGINE} = "socketengine_epoll";
                        $use_hiperf = 1;
                }
                if (($has_ports) && ($config{USE_PORTS} eq "y")) {
                        print FILEHANDLE "#define USE_PORTS\n";
-                       $se = "socketengine_ports";
+                       $config{SOCKETENGINE} = "socketengine_ports";
                        $use_hiperf = 1;
                }
                # user didn't choose either epoll or select for their OS.
@@ -1216,12 +1215,12 @@ print FILEHANDLE "#define MAXBUF " . ($config{MAXBUF}+2) . "\n";
                        if ($config{USE_POLL} eq "y")
                        {
                                print FILEHANDLE "#define USE_POLL\n";
-                               $se = "socketengine_poll";
+                               $config{SOCKETENGINE} = "socketengine_poll";
                        }
                        else
                        {
                                print FILEHANDLE "#define USE_SELECT\n";
-                               $se = "socketengine_select";
+                               $config{SOCKETENGINE} = "socketengine_select";
                        }
                }
                print FILEHANDLE "\n#include \"threadengines/threadengine_pthread.h\"\n\n#endif\n";
@@ -1236,7 +1235,7 @@ print FILEHANDLE "#define MAXBUF " . ($config{MAXBUF}+2) . "\n";
 #ifndef __CONFIGURATION_SOCKETENGINE__
 #define __CONFIGURATION_SOCKETENGINE__
 
-#include "socketengines/$se.h"
+#include "socketengines/$config{SOCKETENGINE}.h"
 
 #endif
 EOF
@@ -1303,11 +1302,10 @@ EOF
                        print "Writing \e[1;32m$file\e[0m ...\n";
                        for my $var (qw(
                                CC FLAGS DEVELOPER LDLIBS BASE_DIR CONFIG_DIR MODULE_DIR BINARY_DIR LIBRARY_DIR
-                               STARTSCRIPT DESTINATION EXTRA_DIR
+                               STARTSCRIPT DESTINATION EXTRA_DIR SOCKETENGINE
                        )) {
                                s/\@$var\@/$config{$var}/g;
                        }
-                       s/\@MODULES\@/$modules/ if defined $modules;
                        s/\@EXECUTABLE\@/$exe/ if defined $exe;
                        s/\@VERSION\@/$version/ if defined $version;
                        s/\@INSTALL_LIST\@/$install_list/ if defined $install_list;
@@ -1319,8 +1317,9 @@ EOF
                                s/\@IFNDEF (\S+)/ifndef $1/g;
                                s/\@ELSE/else/g;
                                s/\@ENDIF/endif/g;
-                               s/\@BSD_ONLY .*\n//g;
+                               s/ *\@BSD_ONLY .*\n//g;
                                s/\@GNU_ONLY //g;
+                               s/\@DO_EXPORT (.*)/export $1/g;
                                open MKF, '>GNUmakefile' or die "Can't write to GNUmakefile: $!";
                                print MKF $_;
                                close MKF;
@@ -1330,9 +1329,11 @@ EOF
                                s/\@ELSE/.else/g;
                                s/\@ENDIF/.endif/g;
                                s/\@BSD_ONLY //g;
-                               s/\@GNU_ONLY .*\n//g;
+                               s/ *\@GNU_ONLY .*\n//g;
+                               $mk_tmp = $_;
+                               $mk_tmp =~ s#\@DO_EXPORT (.*)#"MAKEENV += ".join ' ', map "$_='\${$_}'", split /\s/, $1#eg;
                                open MKF, '>BSDmakefile' or die "Can't write to BSDmakefile: $!";
-                               print MKF $_;
+                               print MKF $mk_tmp;
                                close MKF;
                        } else {
                                open(FILEHANDLE, ">$file") or die("Can't write to $file: $!\n");
@@ -1575,50 +1576,6 @@ sub write_dynamic_makefile
                                                        $core_files_list{$name} = 1;
                                                }
                                        }
-                                       elsif ($line =~ /\/\* \$ExtraDeps: (.*?) \*\//i)
-                                       {
-                                               $specialdeps{$name} = $1;
-                                       }
-                                       elsif ($line =~ /\/\* \$ExtraObjects: (.*?) \*\//i)
-                                       {
-                                               $extraobjects{$name} = $1;
-                                       }
-                                       elsif ($line =~ /\/\* \$ExtraBuild: (.*?) \*\//i)
-                                       {
-                                               $extrabuildlines{$name} = $1;
-                                       }
-                                       elsif ($line =~ /\/\* \$ExtraSources: (.*?) \*\//i)
-                                       {
-                                               $extrasources{$name} = $1;
-                                               }
-                                       elsif ($line =~ /\/\* \$If: (\w+) \*\//i)
-                                       {
-                                               if (defined $config{$1})
-                                               {
-                                                       if (($config{$1} !~ /y/i) and ($config{$1} ne "1"))
-                                                       {
-                                                               # Skip to 'endif'
-                                                               while (defined($line = <CPP>))
-                                                               {
-                                                                       chomp($line);
-                                                                       die ("\$If buildsystem instruction within another \$If in file $dir/$name") if ($line =~ /\/\* \$If: (\w+) \*\//i);
-                                                                       last if ($line =~ /\/\* \$EndIf \*\//i);
-                                                               }
-                                                       }
-                                               }
-                                       }
-                                       elsif ($line =~ /\/\* \$Install: (.*?) \*\//i)
-                                       {
-                                               if (!exists($existing_install_list{$1}))
-                                               {
-                                                       $existing_install_list{$1} = 1;
-                                                       my $idir = (split(' ',$1))[1];
-                                                       my $ifile = (split(' ',$1))[0];
-                                                       $install_list = $install_list . "       -install -m \$(INSTMODE) $1\n";
-                                                       $ifile =~ s/.*\///g;
-                                                       $uninstall_list = $uninstall_list . "   -rm $idir/$ifile\n";
-                                               }
-                                       }
                                        elsif ($line =~ /\/\* \$CopyInstall: (.*?) \*\//i)
                                        {
                                                if (!exists($existing_install_list{$1}))
diff --git a/make/bsd-dep.mk b/make/bsd-dep.mk
new file mode 100644 (file)
index 0000000..5fe31e8
--- /dev/null
@@ -0,0 +1,10 @@
+DFILES != perl -e 'print join " ", grep s/\.cpp/.d/, <*.cpp>, <commands/*.cpp>, <modes/*.cpp>, <modules/*.cpp>'
+DFILES += socketengines/$(SOCKETENGINE).d threadengines/threadengine_pthread.d
+
+all: $(DFILES)
+
+.SUFFIXES: .d .cpp
+
+.cpp.d:
+       @../make/calcdep.pl $<
+       @echo -n .
diff --git a/make/bsd-real.mk b/make/bsd-real.mk
new file mode 100644 (file)
index 0000000..ea3e148
--- /dev/null
@@ -0,0 +1,25 @@
+CORE_TARGS != perl -e 'print join " ", grep s/\.cpp/.o/, <*.cpp>'
+MODE_TARGS != perl -e 'print join " ", grep s/\.cpp/.o/, <modes/*.cpp>'
+CMD_TARGS != perl -e 'print join " ", grep s/\.cpp/.so/, <commands/*.cpp>'
+MOD_TARGS != perl -e 'print join " ", grep s/\.cpp/.so/, <modules/*.cpp>'
+CORE_TARGS += modeclasses.a threadengines/threadengine_pthread.o
+CORE_TARGS += socketengines/$(SOCKETENGINE).o
+
+DFILES != perl -e 'print join " ", grep s/\.cpp/.d/, <*.cpp>, <commands/*.cpp>, <modes/*.cpp>, <modules/*.cpp>'
+DFILES += socketengines/$(SOCKETENGINE).d threadengines/threadengine_pthread.d
+
+all: inspircd commands modules
+
+commands: $(CMD_TARGS)
+
+modules: $(MOD_TARGS)
+
+modeclasses.a: $(MODE_TARGS)
+       @../make/run-cc.pl ar crs modeclasses.a $(MODE_TARGS)
+
+inspircd: $(CORE_TARGS)
+       $(RUNCC) $(FLAGS) -rdynamic -L. -o inspircd $(LDLIBS) $(CORE_TARGS)
+
+.for FILE in $(DFILES)
+.include "$(FILE)"
+.endfor
diff --git a/make/calcdep.pl b/make/calcdep.pl
new file mode 100755 (executable)
index 0000000..2b6742b
--- /dev/null
@@ -0,0 +1,23 @@
+#!/usr/bin/perl
+use strict;
+BEGIN { push @INC, '..'; }
+use make::configure;
+
+my $file = shift;
+
+$file =~ /(.*)\.cpp$/ or die "Cannot process $file";
+my $base = $1;
+
+my $out = "$base.d";
+
+open IN, '<', $file or die "Could not read $file: $!";
+open OUT, '>', $out or die "Could not write $out: $!";
+
+my $cc_deps = qx($ENV{CC} $ENV{FLAGS} -MM $file);
+$cc_deps =~ s/.*?:\s*//;
+
+my $ext = $file =~ m#(modules|commands)/# ? '.so' : '.o';
+print OUT "$base$ext: $cc_deps";
+print OUT "\t@../make/unit-cc.pl \$(VERBOSE) $file $base$ext\n";
+print OUT "$base.d: $cc_deps";
+print OUT "\t../make/calcdep.pl $file\n";
diff --git a/make/gnu-dep.mk b/make/gnu-dep.mk
new file mode 100644 (file)
index 0000000..e8c70c0
--- /dev/null
@@ -0,0 +1,11 @@
+DFILES = $(patsubst %.cpp,%.d,$(wildcard *.cpp))
+DFILES += $(patsubst %.cpp,%.d,$(wildcard commands/*.cpp))
+DFILES += $(patsubst %.cpp,%.d,$(wildcard modes/*.cpp))
+DFILES += $(patsubst %.cpp,%.d,$(wildcard modules/*.cpp))
+DFILES += socketengines/$(SOCKETENGINE).d threadengines/threadengine_pthread.d
+
+all: $(DFILES)
+
+%.d: %.cpp
+       @../make/calcdep.pl $<
+       @echo -n .
diff --git a/make/gnu-real.mk b/make/gnu-real.mk
new file mode 100644 (file)
index 0000000..2634670
--- /dev/null
@@ -0,0 +1,32 @@
+CORE_TARGS = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
+MODE_TARGS = $(patsubst %.cpp,%.o,$(wildcard modes/*.cpp))
+CMD_TARGS = $(patsubst %.cpp,%.so,$(wildcard commands/*.cpp))
+MOD_TARGS = $(patsubst %.cpp,%.so,$(wildcard modules/*.cpp))
+
+CORE_TARGS += modeclasses.a threadengines/threadengine_pthread.o
+CORE_TARGS += socketengines/$(SOCKETENGINE).o
+
+DFILES = $(patsubst %.cpp,%.d,$(wildcard *.cpp))
+DFILES += $(patsubst %.cpp,%.d,$(wildcard commands/*.cpp))
+DFILES += $(patsubst %.cpp,%.d,$(wildcard modes/*.cpp))
+DFILES += $(patsubst %.cpp,%.d,$(wildcard modules/*.cpp))
+DFILES += socketengines/$(SOCKETENGINE).d threadengines/threadengine_pthread.d
+
+all: inspircd commands modules
+
+commands: $(CMD_TARGS)
+
+modules: $(MOD_TARGS)
+
+modeclasses.a: $(MODE_TARGS)
+       @../make/run-cc.pl ar crs modeclasses.a $(MODE_TARGS)
+
+inspircd: $(CORE_TARGS)
+       $(RUNCC) $(FLAGS) -rdynamic -L. -o inspircd $(LDLIBS) $(CORE_TARGS)
+
+%.d: %.cpp
+       @../make/calcdep.pl $<
+
+.PHONY: all commands modules
+
+-include $(DFILES)
diff --git a/make/unit-cc.pl b/make/unit-cc.pl
new file mode 100755 (executable)
index 0000000..5110037
--- /dev/null
@@ -0,0 +1,31 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+BEGIN { push @INC, '..'; }
+use make::configure;
+
+my $file = shift;
+my $verbose;
+
+if ($file =~ /^-/) {
+       $_ = $file;
+       $file = shift;
+       $verbose = /v/;
+}
+
+my $out = shift;
+
+my $cflags = nopedantic($file) ? $ENV{NICEFLAGS} : $ENV{FLAGS};
+$cflags .= ' ' . getcompilerflags($file);
+
+my $flags;
+if ($out =~ /\.so$/) {
+       $flags = join ' ', $cflags, $ENV{PICLDFLAGS}, getlinkerflags($file);
+} else {
+       $flags = "$cflags -c";
+}
+
+my $execstr = "$ENV{RUNCC} $flags -o $out $file";
+print "$execstr\n" if $verbose;
+exec $execstr;
+exit 1;