# (c) 1998 Martin Mares <mj@ucw.cz>
TOPDIR=$(shell pwd)
+OBJDIR=obj
+
CPPFLAGS=-I$(TOPDIR)/sysdep/linux -I$(TOPDIR)
OPT=-O2
DEBUG=-g#gdb
CFLAGS=$(OPT) $(DEBUG) -Wall -W -Wstrict-prototypes -Wno-unused -Wno-parentheses
PROTOCOLS=
-DIRS=nest $(PROTOCOLS) lib sysdep/linux sysdep/unix
-ARCHS=$(join $(addsuffix /,$(DIRS)),$(subst /,_,$(addsuffix .a,$(DIRS))))
+LIBDIRS=sysdep/linux sysdep/unix lib
+STDDIRS=nest $(PROTOCOLS)
+DIRS=$(STDDIRS) $(OBJDIR)/lib
+PARTOBJS=$(join $(addsuffix /,$(STDDIRS)),$(subst /,_,$(addsuffix .o,$(STDDIRS))))
+LIBS=$(OBJDIR)/lib/birdlib.a
export
all: .dep all-dirs bird
all-dirs:
- set -e ; for a in $(DIRS) ; do $(MAKE) -C $$a ; done
+ set -e ; for a in $(DIRS) ; do $(MAKE) -C $$a all ; done
-bird: $(ARCHS)
+bird: $(PARTOBJS) $(LIBS)
$(CC) $(LDFLAGS) -o $@ $^
.dep:
$(MAKE) dep
- touch .dep
dep:
+ mkdir -p $(OBJDIR)
+ tools/mergedirs $(OBJDIR) $(LIBDIRS)
+# for a in $(STDDIRS) ; do mkdir -p $(OBJDIR)/$$a ; done
set -e ; for a in $(DIRS) ; do $(MAKE) -C $$a dep ; done
+ touch .dep
clean:
+ rm -rf obj
rm -f `find . -name "*~" -or -name "*.[oa]" -or -name "\#*\#" -or -name TAGS -or -name core -or -name .depend -or -name .#*`
rm -f bird .dep
THISDIR=$(shell pwd)
RELDIR=$(subst $(TOPDIR)/,,$(THISDIR))
-ANAME=$(subst /,_,$(RELDIR)).a
+ONAME=$(subst /,_,$(RELDIR)).o
+
+ifndef SRCS
SRCS=$(subst .o,.c,$(OBJS))
+endif
+
+ifdef OBJS
-all: $(ANAME)
+ifdef LIB
-$(ANAME): $(OBJS)
- rm -f $(ANAME)
- ar rcs $(ANAME) $(OBJS)
+all: $(LIB)
-ifdef OBJS
+$(LIB): $(OBJS)
+ rm -f $(LIB)
+ ar rcs $(LIB) $(OBJS)
+ ranlib $(LIB)
+
+else
+
+all: $(ONAME)
+
+$(ONAME): $(OBJS)
+ $(LD) -r -o $(ONAME) $(OBJS)
+
+endif
dep: $(SRCS)
rm -f .depend
+++ /dev/null
-OBJS=lists.o bitops.o resource.o xmalloc.o mempool.o slab.o md5.o
-
-ifdef IPV6
-OBJS += ipv6.o
-else
-OBJS += ipv4.o
-endif
-
-include $(TOPDIR)/Rules
--- /dev/null
+birdlib.h
+bitops.c
+bitops.h
+ip.h
+ipv4.c
+ipv4.h
+ipv6.c
+ipv6.h
+lists.c
+lists.h
+md5.c
+md5.h
+mempool.c
+resource.c
+resource.h
+slab.c
+socket.h
+unaligned.h
+xmalloc.c
/* Logging and dying */
-void log(char *msg, ...);
-void die(char *msg, ...) NORET;
+void log(char *msg, ...) __attribute__((format(printf,1,2)));
+void die(char *msg, ...) __attribute__((format(printf,1,2))) NORET;
#define L_DEBUG "\001" /* Debugging messages */
#define L_INFO "\002" /* Informational messages */
#define SCOPE_SITE 2
#define SCOPE_UNIVERSE 3
+/*
+ * Is it a valid network prefix?
+ */
+
+#define ip_is_prefix(a,l) (!ipa_nonzero(ipa_and(a, ipa_not(ipa_mkmask(l)))))
+
#endif
* Can be freely distributed and used under the terms of the GNU GPL.
*/
+#ifndef IPV6
+
#include "nest/bird.h"
#include "lib/ip.h"
return IADDR_BROADCAST | SCOPE_LINK;
return IADDR_INVALID;
}
+
+#endif
} ip_addr;
#define _I(x) (x).addr
-#define _MI(x) ((struct ip_addr) { x })
+#define _MI(x) ((struct ipv4_addr) { x })
#else
#endif
+#define BITS_PER_IP_ADDRESS 32
+
#define IPA_NONE (_MI(0))
#define ipa_equal(x,y) (_I(x) == _I(y))
#define ipa_ntoh(x) x = _MI(ntohl(_I(x)))
#define ipa_classify(x) ipv4_classify(_I(x))
-unsigned ipv4_mklen(u32);
-u32 ipv4_mkmask(unsigned);
int ipv4_classify(u32);
/* FIXME: Is this hash function uniformly distributed over standard routing tables? */
* Can be freely distributed and used under the terms of the GNU GPL.
*/
+#ifdef IPV6
+
#include "nest/bird.h"
#include "lib/ip.h"
#error "Ought to implement these."
+
+#endif
#define _I2(a) ((a).addr[2])
#define _I3(a) ((a).addr[3])
+#define BITS_PER_IP_ADDRESS 128
+
#define IPA_NONE _MI(0,0,0,0)
#define ipa_equal(x,y) (!memcmp(&(x),&(y),sizeof(ip_addr)))
#undef CONFIG_TOS
#undef CONFIG_MULTIPATH
#undef CONFIG_NETLINK
+
+/*
+Link: sysdep/linux
+ */
#define CONFIG_TOS
#define CONFIG_MULTIPATH
#define CONFIG_NETLINK
+
+/*
+Link: sysdep/linux
+ */
#define CONFIG_TOS
#define CONFIG_MULTIPATH
#define CONFIG_NETLINK
+
+/*
+Link: sysdep/linux
+ */
+++ /dev/null
-include $(TOPDIR)/Rules
+++ /dev/null
-OBJS=log.o
-
-include $(TOPDIR)/Rules
--- /dev/null
+log.c
+main.c
+timer.h
--- /dev/null
+/*
+ * BIRD Internet Routing Daemon -- Unix Entry Point
+ *
+ * (c) 1998 Martin Mares <mj@ucw.cz>
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#include <stdio.h>
+
+#include "nest/bird.h"
+#include "lib/lists.h"
+#include "lib/resource.h"
+#include "nest/route.h"
+
+int
+main(void)
+{
+ log(L_INFO "Launching BIRD -1.-1-pre-omega...");
+
+ log_init_debug(NULL);
+ resource_init();
+
+ return 0;
+}
--- /dev/null
+#!/bin/sh
+
+if [ -z "$2" ] ; then
+ echo "Usage: mergedirs <obj-dir> <list-of-dirs>"
+ exit 1
+ fi
+TOPDIR=`pwd`
+OBJDIR=$1
+LIBDIR=$OBJDIR/lib
+shift
+echo "Merging system-dependent modules"
+MODULES=`for a in $@ ; do
+ sed <$a/Modules "s@\\(.*\\)@\\1 $a/\\1@"
+ done |
+ sort +0 -1 -u |
+ cut -d ' ' -f 2`
+rm -rf $LIBDIR
+mkdir -p $LIBDIR
+for a in $MODULES ; do
+ echo $a
+ b=`basename $a`
+ ln -s $TOPDIR/$a $LIBDIR/$b
+ OBJ=`echo $b | sed '/\.c$/!d;s/\.c$/\.o/'`
+ if [ -n "$OBJ" ] ; then
+ OBJS="$OBJS $OBJ"
+ SRCS="$SRCS \\
+ \$(TOPDIR)/$a"
+ fi
+ done
+cat >$LIBDIR/Makefile <<EOF
+OBJS=$OBJS
+SRCS=$SRCS
+LIB=birdlib.a
+
+include \$(TOPDIR)/Rules
+EOF