SConscript
author Florian Westphal <fw@strlen.de>
Fri, 10 Apr 2009 21:20:25 +0200
changeset 5 41d4fc0fdd98
parent 2 d1f6d8b6f81c
child 6 b4128f070989
permissions -rw-r--r--
fix sysctl support

# vim:filetype=python

#  Network Simulation Cradle
#  Copyright (C) 2003-2005 Sam Jansen
#
#  This program 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; either version 2 of the License, or (at your option)
#  any later version.
#
#  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, write to the Free Software Foundation, Inc., 59
#  Temple Place, Suite 330, Boston, MA 02111-1307 USA

# The following compilers have been shown to not be able to compile this code:
#  - gcc version 4.0.3 (Ubuntu 4.0.3-1ubuntu5) -- compiler bug

import os, glob

Import('default_env')

stackname = "linux-2.6.29"
arch_i386 = default_env['NSC_TARGET_ARCHITECTURE'] != 'amd64'
curdir = Dir('.').path + '/'

net = {}
net['core'] = Split("""
datagram.c   ethtool.c        iovec.c                    sock.c
dev.c        filter.c         link_watch.c               stream.c
dev_mcast.c  flow.c           neighbour.c   rtnetlink.c  sysctl_net_core.c
dst.c        gen_estimator.c  net-sysfs.c   scm.c        utils.c
             gen_stats.c      skbuff.c      netevent.c	net_namespace.c
request_sock.c""")
net['ethernet'] = Split("""
eth.c""")
net['ipv4'] = Split("""
af_inet.c        icmp.c                     syncookies.c       udp.c	udplite.c
ah4.c            igmp.c         ipconfig.c  sysctl_net_ipv4.c  
arp.c            inetpeer.c                 tcp.c                            
datagram.c       ip_forward.c   inet_diag.c                       
devinet.c        ip_fragment.c              tcp_input.c                     
esp4.c           tcp_ipv4.c
fib_frontend.c   ip_input.c     tcp_minisocks.c
fib_hash.c       ip_options.c   protocol.c  tcp_output.c
                 ip_output.c    raw.c       
fib_semantics.c  ip_sockglue.c  route.c     tcp_timer.c
inet_connection_sock.c
inet_fragment.c
tcp_cong.c	tcp_cubic.c	tcp_highspeed.c
tcp_htcp.c	tcp_vegas.c	tcp_veno.c	tcp_westwood.c
inet_hashtables.c		tcp_diag.c	tcp_scalable.c
inet_timewait_sock.c 		tcp_hybla.c	tcp_illinois.c
tcp_lp.c	tcp_bic.c	tcp_yeah.c""")
net['ipv6'] = Split("""
addrconf.c     addrlabel.c              protocol.c	syncookies.c
udp.c	udplite.c
af_inet6.c  icmp.c           ipv6_sockglue.c  raw.c
ip6_fib.c  	reassembly.c
anycast.c   ip6_flowlabel.c  mcast.c          route.c
datagram.c  ip6_input.c      ndisc.c
ip6_output.c                      sysctl_net_ipv6.c
addrconf_core.c
exthdrs.c                    tcp_ipv6.c
inet6_hashtables.c	     inet6_connection_sock.c""")
net['sctp'] = Split("""
auth.c associola.c  endpointola.c  outqueue.c       sm_statefuns.c   tsnmap.c
bind_addr.c  input.c        primitive.c      sm_statetable.c  ulpevent.c
chunk.c      inqueue.c                socket.c         ulpqueue.c
command.c    ipv6.c         protocol.c       ssnmap.c
sm_make_chunk.c  sysctl.c
debug.c      output.c       sm_sideeffect.c  transport.c""")

# NOTE: DCCP does not work completely yet; there is an infinite loop when
# a dccp connection is being shut down.
# Its built by default, but there is no external API until that loop is resolved.
net['dccp'] = Split("""
feat.c   ipv4.c  minisocks.c  proto.c ccid.c options.c sysctl.c
ackvec.c  input.c  output.c     timer.c
ccids/ccid2.c""")
net['dccp/ccids'] = Split("""
loss_interval.c packet_history.c tfrc.c tfrc_equation.c""")

net['netlink'] = Split("""
attr.c
af_netlink.c""")
net['packet'] = ['af_packet.c']
net['sched'] = Split("""
              cls_api.c        cls_u32.c    sch_atm.c             sch_hfsc.c
              cls_basic.c                   sch_blackhole.c       sch_htb.c
              cls_fw.c                      sch_cbq.c             sch_ingress.c
                                            sch_dsmark.c          sch_netem.c
                                            sch_fifo.c            sch_prio.c
              cls_rsvp.c                    sch_generic.c         sch_red.c
                                                                  sch_sfq.c
              cls_rsvp6.c      sch_tbf.c
              cls_tcindex.c    sch_api.c    sch_gred.c            sch_teql.c
""")  
net['.'] = ['socket.c', 'sysctl_net.c']

# This array specifies the order. This order is used when linking; we need
# to make sure things are linked in the correct order so the initialisation
# functions -- initcall functions -- are called in the correct order.
# There was a problem earlier where sctp_init was being called before
# inet_init, which caused problems. The array below fixes that.
dir_order = ['.', 'core', 'packet', 'sched', 'netlink', 'ethernet', 'ipv4', 
    'ipv6', 'sctp' ] # 'dccp'
src_to_globalise = reduce(lambda x,y:x+y,
    [['net/' + d + '/' + f for f in net[d]] for d in dir_order])

src_to_globalise.extend([ 
    'nsc/unimplemented.c', 'nsc/implemented.c', 'nsc/support.c',
    'nsc/sysctl.c', 'nsc/tc.c', 'nsc/stub.c',
    'kernel/softirq.c', 'kernel/timer.c', 'kernel/itimer.c', 'kernel/sysctl.c',
    'kernel/rwsem.c', 'drivers/net/loopback.c', 'drivers/char/random.c',
    'lib/find_next_bit.c', 'lib/idr.c', 'lib/int_sqrt.c',
    'lib/rbtree.c', 'lib/hexdump.c'])

sim_sources = ['nsc/sim_support.cpp']
asm_sources = []

if arch_i386:
    linker_script = 'arch/x86/kernel/linker-script-32.ld'
    asm_sources.extend(['arch/x86/lib/checksum_32.S'])
else:
    linker_script = 'arch/x86/kernel/linker-script-64.ld'
    src_to_globalise.extend(['arch/x86/lib/csum-partial_64.c',
        'arch/x86/lib/csum-wrappers_64.c'])
    asm_sources.extend(['arch/x86/lib/csum-copy_64.S'])

# -----------------------------------------------------------------------------
cflags = ('-O -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -nostdinc '
    '-fno-inline -iwithprefix include -DKBUILD_BASENAME=\\"clnt\\" '
    '-DKBUILD_MODNAME=\\"nsc\\" -DMODVERSIONS -DEXPORT_SYMTAB '
    '-include linux/config.h -g')

# You really need to undefine whatever symbol is defined for the operating
# system you are compiling on and make sure the various linux symbols are
# defined. __linux__ is the only important one I've found; though compilers
# tend to define __linux and __Linux__ and so on and so forth.
cflags += ' -U__FreeBSD__ -D__linux__=1 -Dlinux=1 -D__linux=1 '

glb_cflags = '-include nsc_override.h '

include_path = ['include', 'arch/x86/include', 'arch/x86/include/asm/mach-default', '../sim', 'nsc',
    'override']

# We need a special linker script to set up some variables for
# initialisation in Linux
link_flags = '-Wl,-O1 -shared -Wl,-O1 -Wl,-T' + curdir + linker_script
ext_cflags = ''
as_flags = '-D__ASSEMBLY__'

if arch_i386:
    cflags += '-DCONFIG_X86_32=1 '
else:
    ext_cflags += '-fPIC '
    as_flags += '-fPIC '
    cflags += '-DCONFIG_X86_64=1 -DCONFIG_64BIT '

cflags += ext_cflags

# -----------------------------------------------------------------------------
env = default_env.Clone(CCFLAGS=cflags, CPPPATH=include_path,
                        GLB_CCFLAGS=glb_cflags,
                        GLB_LIST=curdir + '/global_list.txt')
sim_env = default_env.Clone(CCFLAGS='-g -Wall -O2 ' + ext_cflags,
                            CPPPATH=['../sim', 'nsc'])

objects = env.Globaliser(src_to_globalise)
objects.extend([sim_env.SharedObject(s) for s in sim_sources])
objects.extend(asm_sources)

# Using Program and -shared is a hacky way to make a shared library in SCons
# without requiring -fPIC.
env['LINKFLAGS'] += link_flags
env['ASFLAGS'] += as_flags
output = env.Program(source=objects, target='lib%s.so' % stackname)

Install(dir = "..", source = output)