makerules.4
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:22k
- . " @(#)makerules.4 1.2 97/02/14 Copyr 1996 J. Schilling
- . " System Manual page for makefile system
- . "
- .if t .ds a v'-0.55m'h'0.00n'z.h'0.40n'z.v'0.55m'h'-0.40n'a
- .if t .ds o v'-0.55m'h'0.00n'z.h'0.45n'z.v'0.55m'h'-0.45n'o
- .if t .ds u v'-0.55m'h'0.00n'z.h'0.40n'z.v'0.55m'h'-0.40n'u
- .if t .ds A v'-0.77m'h'0.25n'z.h'0.45n'z.v'0.77m'h'-0.70n'A
- .if t .ds O v'-0.77m'h'0.25n'z.h'0.45n'z.v'0.77m'h'-0.70n'O
- .if t .ds U v'-0.77m'h'0.30n'z.h'0.45n'z.v'0.77m'h'-.75n'U
- .if t .ds s (*b
- .if t .ds S SS
- .if n .ds a ae
- .if n .ds o oe
- .if n .ds u ue
- .if n .ds s sz
- .TH makefiles 4L "14. February 1997" "J*org Schilling" "Schily's FILE FORMATS"
- .".TH makerules 4L "14. February 1997" "J*org Schilling" "GMD FOKUS FILE FORMATS"
- .SH NAME
- makerules - system programmers guide for compiling projects on different platforms
- .SH SYNOPSIS
- .B "SRCROOT= .|.
- .br
- .B "RULESDIR= RULES
- .br
- .B "include $(SRCROOT)/$(RULESDIR)/rules.top
- .br
- .I "local defines are here
- .br
- .B "include $(SRCROOT)/$(RULESDIR)/rules.*
- .PP
- See chapter CURRENTLY SUPPORTED TARGET TYPES for possible values of
- .BR "rules.*" .
- .SH DESCRIPTION
- Makerules is a set of rules that allows compiling of structured
- projects with small and uniformly structured makefiles.
- All rules are located in a central directory.
- Compiling the projects on different platforms can be done without
- the need to modify any of the makefiles that are located
- in the projects directories.
- .PP
- Three make programs are currently supported:
- .IR "Sunpro make" ,
- .I "GNU make"
- and
- .IR smake .
- If you want to add support for other make programs, read the
- sections about the minimum requirements for a make program
- and about the structure of the
- .B "make rule
- system.
- .PP
- This manual will help programmers who need to make modifications
- on the make rule system itself. If you want to know something
- on how to use the
- .B "makefile system
- have a look at
- .BR makefiles (4).
- .PP
- The main design goal was to have no definition on more than place
- in the make rules. This implies that system programmers who
- want to add or modify rules must follow this goal in order not to
- destroy functionality in other places.
- .PP
- The visible result for the user is a set of small and easy to read
- makefiles, each located in the project's leaf directory and therefore
- called
- .IR leaf -makefile.
- .PP
- Each of these
- .IR leaf -makefiles,
- in fact contains no rule at all. It simply defines some macros
- for the
- .IR make -program
- and includes two files from a central make rule depository.
- These included files define the rules that are needed to compile
- the project.
- .PP
- Each
- .IR leaf -makefile
- is formed in a really simple way:
- .TP
- (bu
- It first defines two macros that define the relative location
- of the project's root directory and the name of the directory
- that contains the complete set of of rules and then includes
- the rule file
- .I rules.top
- from the directory that forms the central rule depository.
- You only have to edit the macro
- .I SRCROOT
- to reflect the relative location of the project's root directory.
- .TP
- (bu
- The next part of a
- .IR leaf -makefile
- defines macros that describe the target and the source.
- You can only have one target per
- .IR leaf -makefile.
- Of course, there may be many source files, that are needed to create
- that target.
- If you want to make more than one target in a specific directory,
- you have to put more than one makefile into that directory.
- This is the part of a makefile that describes a unique target.
- Edit this part to contain all source files, all local include files
- and all non global compile time flags that are needed for your target.
- For a typical target this is as simple as filling in a form.
- .TP
- (bu
- Each
- .IR leaf -makefile
- finally includes a file from the rules directory that contains
- rules for the appropriate type of target that is to be made
- from this
- .IR leaf -makefile.
- .PP
- The makefile in each directory has to be called
- .IR Makefile .
- If you want to have more than one makefile in a specific directory,
- you have to choose different names for the other makefiles.
- .SH "Currently Supported Target Types
- .PP
- There are rules for the following type of targets:
- .TP 20
- commands
- The make rules for user level commands like
- .IR cat ", " ls
- etc. are located in the file
- .I rules.cmd
- .TP
- drivers
- The make rules for device drivers
- are located in the file
- .I rules.drv
- .TP
- libraries
- The make rules for non shared libraries
- are located in the file
- .I rules.lib
- .TP
- shared libraries
- The make rules for shared libraries
- are located in the file
- .I rules.shl
- .TP
- localized files
- The make rules for localized files
- are located in the file
- .I rules.loc
- .TP
- nonlocalized files
- The make rules for non localized files
- are located in the file
- .I rules.aux
- .TP
- shell scripts
- The make rules for shell scripts (a variant of localized files)
- are located in the file
- .I rules.scr
- .TP
- manual pages
- The make rules for manual pages (a variant of localized files)
- are located in the file
- .I rules.man
- .TP
- diverted makefiles
- The make rules for projects that need to have more than
- one makefile in a specific directory
- are located in the file
- .I rules.mks
- It contains a rule that diverts to the listed sub makefiles.
- Each sub makefile may be of any type.
- .TP
- directories
- The make rules for sub directories
- are located in the file
- .I rules.dir
- .SH "Minimum Requirements For A Make Program
- The make rules currently have support for
- .IR "Sunpro make" ,
- .I "GNU make"
- and
- .IR smake .
- If you like to add support for other make programs,
- they need to have some minimal features that go
- beyond the capabilities of the standard
- .SM "UNIX
- .B make
- program.
- .I BSDmake
- could be supported if it supports pattern matching rules correctly.
- .TP 20
- include
- The make program must be able to recursively include other files
- from within a
- .I makefile.
- The name if the file to include must be allowed to be a macro.
- The make program must be able to do this in a way that
- if the file that should be included may be a result of make rule.
- e.g if the file to be included does not exist or is outdated,
- it should be built before an attempt is made to actually include it.
- .TP
- appending to a macro
- A macro reference of the form:
- .sp
- .B "macro += addval
- .sp
- should append
- .B addval
- to the string that is currently in
- .BR macro .
- .TP
- suffix macro replacement
- A macro reference of the form:
- .sp
- .B "out= $(macro|:|string1|=|string2)
- .sp
- should replace a suffix
- .I string1
- to
- .I string2
- in all words that are in
- .BR macro ,
- where string1 is either a suffix, or a word to be replaced
- in the macro definition, and string2 is the replacement
- suffix or word.
- .I String1
- and
- .I string2
- must be replaced correctly even if they are macros themselves.
- Words in a macro value are separated by SPACE,
- TAB, and escaped NEWLINE characters.
- .TP
- pattern macro replacement
- A macro reference of the form:
- .sp
- .B "out= $(macro|:|op%os|=|np%ns)
- .sp
- should replace a central pattern in
- .BR macro ,
- where
- .B op
- is the existing (old) prefix and
- .B os
- is the existing
- (old) suffix,
- .B np
- and
- .B ns
- are the new prefix and new suffix,
- respectively, and the pattern matched by % (a string of zero
- or more characters), is carried forward from the value being
- replaced.
- For example:
- .sp
- .B "PROGRAM=fabricate
- .br
- .B "DEBUG= $(PROGRAM:%=tmp/%-g)
- .sp
- sets the value of DEBUG to tmp/fabricate-g.
- .IR Op ", " os ", "
- .IR np " and " ns
- must be replaced correctly even if they are macros themselves.
- .SH "Understanding Basic Algorithms
- One of the basic algorithms used in the make rule system
- is needed to set an undefined macro to a guaranteed default value.
- Because not all make programs have support for
- .I "if then else
- structures, a different method has to be used.
- .PP
- The method used in
- .B "make rules
- is implemented by using
- .B "suffix macro replacement
- and
- .BR "pattern macro replacement" .
- .PP
- .ne 5
- First, a macro that contains a unique suffix is defined:
- .sp
- .B " # Define magic unique cookie
- .br
- .B " _UNIQ= .XxZzy-
- .sp
- This macro is used for all places where it is necessary to have
- a macro with a guaranteed default value.
- The following example shows the basic algorithm that is used to
- implement the phrase:
- .B If
- .I $(MAKE_NAME)
- contains a value,
- .B then
- .I $(XMAKEPROG)
- will be set to
- .I $(MAKE_NAME)
- .B else
- .I $(XMAKEPROG)
- will be set to
- .IR $(MAKEPROG) .
- .sp
- .B " _MAKEPROG= $(_UNIQ)$(MAKE_NAME)
- .br
- .B " __MAKEPROG= $(_MAKEPROG:$(_UNIQ)=$(MAKEPROG))
- .br
- .B " XMAKEPROG= $(__MAKEPROG:$(_UNIQ)%=%)
- .sp
- The first line in this example, sets the macro
- .I _MAKEPROG
- to the concatenation of the value of
- .I MAKE_NAME
- and
- .BR .XxZzy- .
- If the macro
- .I MAKE_NAME
- is empty at this time,
- .I _MAKEPROG
- will contain only
- .BR .XxZzy- .
- .PP
- In the second line,
- .I __MAKEPROG
- is set to the value of
- .IR _MAKEPROG .
- If
- .I _MAKEPROG
- contains only
- .B .XxZzy-
- this implies, that
- .B .XxZzy-
- is the suffix. This suffix is then replaced
- by the value of
- .IR MAKEPROG ,
- in this case
- .I __MAKEPROG
- will contain the unmodified value of
- .IR MAKEPROG .
- If
- .I _MAKEPROG
- contains a concatenation of
- .B .XxZzy-
- and something else,
- .B .XxZzy-
- will not be a suffix, but a prefix of
- .I _MAKEPROG
- and for this reason
- .I __MAKEPROG
- will contain the unmodified value of
- .IR _MAKEPROG ,
- which is a concatenation of
- .B .XxZzy-
- and the value of
- .IR MAKE_NAME .
- .PP
- In the third line,
- .I XMAKEPROG
- is set to the value of
- .IR __MAKEPROG .
- If
- .I __MAKEPROG
- has the prefix
- .B .XxZzy-
- at this time,
- .B .XxZzy-
- is stripped of.
- .SH "The Structure in Make Macro names
- .PP
- The names used for
- .B "make macros
- are structured in a way that allows to use
- .BR grep (1)
- to look for the names in the
- .B make rules.
- To allow this, no name must be a substring of another name.
- .PP
- If a command needs options that have to be specified
- in macros, there is a
- .B "make macro
- that is named
- .I XXXFLAGS.
- This is compliant to usual make file rules.
- The are internal
- .B "make macros
- called
- .I XXXOPTS
- and
- .I XXXOPTX
- that will be combined for
- .IR XXXFLAGS :
- .sp
- .B "LDFLAGS= $(LDOPTS) $(LDOPTX)
- .sp
- Where
- .I XXXOPTS
- is the name of the macro that is used internally
- and
- .I XXXOPTX
- is the name of the macro that may be used from the
- command line of the make program.
- .I XXXOPTX
- therefore is used to append to the content of
- .I XXXFLAGS
- If the value of
- .I XXXFLAGS
- need to be overwritten,
- .I XXXOPTS
- may be used within the command line flags of the make program.
- .SH "The Structure Of The Make Rule System
- .SH "The Structure Of The Basic Rules in rules.top
- The file
- .B RULES/rules.top
- first includes a rule file that depends on the
- make program that is used.
- The name of this file is
- .BI RULES/mk- makeprog .id
- where
- .I makeprog
- has to be replaced by the real name of
- the makeprogram e.g.
- .BR make ", " gmake ", " smake .
- The purpose of this file is to set up a list of macros
- that identify the system where the project is currently built.
- These macros have values that contain only lower case letters and define:
- .TP 28
- the processor architecture
- If two systems run the same operating system, this
- is a unique value if a simple user level program will
- not need to be recompiled in order to run on the other system.
- Possible values are
- .BR sparc ", " mc68020 ", " pentium .
- This is the output of
- .BR "uname -p" .
- The value is stored in
- .BR P_ARCH .
- .TP
- the kernel architecture
- If two systems may use the same value for
- .B P_ARCH
- but a heavily system dependent user level program
- need to be recompiled in order to run on the other
- system, These two systems have different
- kernel architectures.
- This is the output of
- .BR "uname -m" .
- Possible values are
- .BR sun3 ", " sun4c ", " sun4m .
- The value is stored in
- .BR K_ARCH .
- .TP
- the machine architecture
- An outdated macro that is useful only on sun systems.
- Do not use this, use
- .B P_ARCH
- instead.
- This is the output of
- .BR arch .
- Possible values are
- .BR sun3 ", " sun4 .
- The value is stored in
- .BR M_ARCH .
- .TP
- the hostname
- The name of the machine where the compilation takes place.
- This is the output of
- .BR "uname -n" .
- The value is stored in
- .BR HOSTNAME .
- .TP
- the name of the operating system
- This is the output of
- .BR "uname -s" .
- Possible values are
- .BR sunos ", " dgux ", " hp-ux ", " irix .
- The value is stored in
- .BR OSNAME .
- .TP
- the release of the operating system
- This is the output of
- .BR "uname -r" .
- Possible values are
- .BR 5.5 ", " 4.1.4 .
- The value is stored in
- .BR OSREL .
- .PP
- The next file to be included from
- .B RULES/rules.top
- is
- .BI RULES/os- "operating system" .id .
- It defines the macros
- .B O_ARCH
- and
- .B -O_ARCH
- and may modify one of the macros that are defined
- in
- .BI RULES/mk- makeprog .id .
- The macros
- .B O_ARCH
- and
- .B -O_ARCH
- are used to distinguish between different operating systems.
- The names of the compiler configuration files have
- .B -O_ARCH
- as a central part.
- On some operating systems e.g.
- .B SunOS
- and
- .B DG-UX
- it is necessary to distinguish between
- .B "SunOS 4.x
- and
- .B "SunOS 5.x
- or
- .B "DG-UX 3.x
- and
- .B "DG-UX 4.x.
- .PP
- The next file to be included from
- .B RULES/rules.top
- is
- .BR Defaults .
- It defines the macros
- .B DEFCCOM
- ,
- .B DEFINCDIRS
- ,
- .B LDPATH
- ,
- .B RUNPATH
- ,
- .B INS_BASE
- and
- .BR INS_KBASE .
- If the definitions have to be different on
- different systems, this file may contain a line int the form:
- .sp
- .BI include " $(SRCROOT)" /Defaults. $(O_ARCH)
- .sp
- The actual definitions then have to be moved into
- these files.
- .PP
- Next, after setting up some internal defaults,
- .B RULES/rules.top
- includes the compiler configuration file with
- the name:
- .sp
- .I $(SRCROOT)/$(RULESDIR)/$(XARCH).rul
- .sp
- This file contains all necessary
- .B system dependent
- stuff that is needed to configure the C-compiler
- on the appropriate system.
- It is a bad idea to create a new one from scratch.
- Have a look at the other compiler configuration
- files and modify a similar file for your needs.
- Note that there are basically two criterias to
- that are important in a compiler configuration file.
- One is whether the system uses the
- .I ELF
- header format or not.
- The other is whether the system uses
- .I shared libraries
- or not.
- .SH "The Structure Of The Application Specific Rules
- .PP
- The application specific rule files are designed in
- such a way that they include all necessary stuff that
- is needed for that specific task. The application specific
- rule files are:
- .TP 25
- $(RULES)/rules.aux
- Rules for installing non localized auxiliary files.
- .TP
- $(RULES)/rules.cmd
- Rules for commands like
- .I sh.
- .TP
- $(RULES)/rules.dir
- Rules for sub directories.
- .TP
- $(RULES)/rules.drv
- Rules for lodable drivers.
- .TP
- $(RULES)/rules.lib
- Rules for static libraries.
- .TP
- $(RULES)/rules.loc
- Rules for installing localized auxiliary files.
- .TP
- $(RULES)/rules.man
- Rules for installing localized manual pages.
- .TP
- $(RULES)/rules.mks
- Rules for sub makefiles.
- .TP
- $(RULES)/rules.mod
- Rules for lodable stream modules.
- .TP
- $(RULES)/rules.scr
- Rules for installing localized shell scripts.
- .TP
- $(RULES)/rules.shl
- Rules for shared libraries.
- .SH "Understanding The Structure Of The Make Rule System
- .PP
- To understand the structure of the
- .B "make rule
- system while doing changes, try to use the
- .B -xM
- flag
- in the
- .B smake
- program.
- This flag will print out the include dependency list
- (i.e. a list that tell you which make rules is included
- from which other rule).
- .PP
- Note that some of the rules are make program dependent.
- If you want to make changes to these rules you may need to
- place the definitions into separate rule files
- each for the appropriate make program.
- Have a look into the
- .B RULES
- directory
- for some examples.
- .SH FILES
- &.|.|./RULES/*
- .br
- &.|.|./DEFAULTS/*
- .br
- &.|.|./TARGETS/*
- .br
- &.|.|./TEMPLATES/*
- .SH "SEE ALSO"
- .BR makefiles (4),
- .BR make (1),
- .BR gmake (1),
- .BR smake (1).
- .SH DIAGNOSTICS
- Diagnostic messages depend on the make program.
- Have a look at the appropriate man page.
- .SH NOTES
- .PP
- The make rules
- can be used with
- .IR "Sunpro make" ", " "Gnu make"
- and
- .IR smake .
- Although Gnu make runs on many platforms, it has no useful debug
- output.
- .PP
- Use
- .IR "Sunpro make" " or " "smake"
- if you have problems with a makefile.
- .IR "Sunpro make" " and " "smake" ,
- both have a -D flag, that allows you to watch the makefiles
- after the first expansion. Use this option, if you are in doubt
- if your makefile gets expanded the right way and if the right
- rules are included.
- There is also a -d option that gives debugging output while
- make is running. If you want more output, use -dd, -ddd and so on.
- .PP
- .I Smake
- has an option -xM that shows you the include dependency for
- make rules.
- .SH BUGS
- .SH "Source Tree Hierarchy
- .LP
- The following outline gives a quick tour through a typical
- source hierarchy:
- .LP
- .na
- .nh
- .PD 0
- .TP
- .B .../
- root directory of the source tree
- .
- .RS
- .TP
- .B Makefile
- the top Makefile
- .TP
- .B Defaults
- default definitions for that source tree. System dependent
- definitions are in
- .B .../DEFAULTS/
- .TP
- .B Targetdirs
- a file containing a list of directories that are needed
- for that project.
- If the system needs different target lists depending
- on the target system architecture , use target specific files in
- .B .../TARGETS/
- .TP
- &.|.|.
- .RE
- .
- .TP
- .B .../RULES/
- the location of makefiles (included rules)
- .
- .RS
- .TP
- .B rules.top
- the mandatory include rules (needed to setup basic rules)
- .TP
- .B rules.aux
- rules needed to install a non localized auxiliary file
- .TP
- .B rules.cmd
- rules needed to make an ordinary command (like /bin/sh)
- .TP
- .B rules.drv
- rules needed to make a device driver
- .TP
- .B rules.lib
- rules needed to make a standard (nonshared) library
- .TP
- .B rules.loc
- rules needed to install a localized auxiliary file
- .TP
- .B rules.man
- rules needed to install a localized manual page
- .TP
- .B rules.scr
- rules needed to install a localized shell script
- .TP
- .B rules.shl
- rules needed to make a shared library
- .TP
- .B rules.mks
- rules needed to make more than one target in a specific directory
- .TP
- .B rules.dir
- rules needed to make targets that are located in sub directories
- to the current directory
- .TP
- &.|.|.
- .RE
- .
- .TP
- .B .../DEFAULTS/
- default definitions for various target architectures are
- located in this directory. Templates for some architectures can
- be found in the
- .I .../TEMPLATES/
- directory.
- .TP
- .B .../TARGETS/
- target list definitions for various target architectures are
- located in this directory.
- .TP
- .B .../TEMPLATES/
- templates that should be used inside the project
- (rename to Makefile, if it is the only makefile on that directory,
- rename to
- .I target.mk,
- if there is more than one target in that directory)
- .
- .RS
- .TP
- .B Defaults
- Defaults file for the source root directory
- .TP
- .B Defaults.linux
- Defaults file for
- .IR linux .
- This sould be installed in the
- .B .../DEFAULTS/
- directory.
- .TP
- .B Makefile.root
- Makefile for the source root directory
- .TP
- .B Makefile.aux
- Makefile for a non localized auxiliary file
- .TP
- .B Makefile.cmd
- Makefile for an ordinary command (like /bin/sh)
- .TP
- .B Makefile.lib
- Makefile for a standard (nonshared) library
- .TP
- .B Makefile.loc
- Makefile for a localized auxiliary file
- .TP
- .B Makefile.man
- Makefile for a localized manual page
- .TP
- .B Makefile_de.man
- Makefile for a localized manual page in the german locale
- .TP
- .B Makefile.scr
- Makefile for a localized shell script
- .TP
- .B Makefile.shl
- Makefile for a shared library
- .TP
- .B Makefile.drv
- Makefile for a device driver
- .TP
- .B Makefile.mks
- Makefile for more than one target in a specific directory
- .TP
- .B Makefile.dir
- Makefile for targets that are located in sub directories
- to the current directory
- .TP
- &.|.|.
- .RE
- .
- .TP
- .B .../cmd/
- source tree for normal commands
- .
- .RS
- .TP
- .B Makefile
- the makefile for the
- .I cmd
- sub directory
- .TP
- .B Targetdirs.sun4m
- a file containing a list of directories like
- .I myprog
- (see below) that are needed
- for that specific architecture.
- .TP
- .B myprog/
- directory where the sources for a specific command are located
- .
- .RS
- .TP
- Makefile
- makefile for
- .I myprog
- .TP
- Makefile.man
- makefile for the manual page of
- .I myprog
- .TP
- mprog.c
- source for myprog
- .TP
- mprog.tr
- troff source for the manual page of myprog
- .TP
- .B OBJ/
- directory where system specific sub directories are located
- .
- .RS
- .TP
- .B sparc-sunos5-cc/
- directory for binaries that belong to a specific system
- .TP
- &.|.|.
- .RE
- .TP
- &.|.|.
- .RE
- .br
- .TP
- &.|.|.
- .RE
- .br
- .ne 5
- .TP
- .B .../lib/
- directory where the sources for a libraries are located
- .
- .RS
- .TP
- .B Makefile
- the makefile for the
- .I lib
- sub directory
- .TP
- .B Targetdirs.sun4m
- a file containing a list of directories like
- .I libfoo
- (see below) that are needed
- for that specific architecture.
- .TP
- .B libfoo/
- directory where all source files for libfoo are located
- .TP
- &.|.|.
- .RE
- .
- .TP
- .B .../kernel
- directory for kernel modules
- .
- .RS
- .TP
- .B Makefile
- the makefile for the
- .I kernel
- sub directory
- .TP
- .B Targetdirs.sun4m
- a file containing a list of directories like
- .I drv
- (see below) that are needed
- for that specific architecture.
- .TP
- .B drv/
- directory where drivers are located
- .
- .RS
- .TP
- .B Makefile
- the makefile for the
- .I drv
- sub directory
- .TP
- .B Targetdirs.sun4m
- a file containing a list of directories like
- .I mydrv
- (see below) that are needed
- for that specific architecture.
- .TP
- .B mydrv/
- source for a specific driver
- .TP
- &.|.|.
- .RE
- .
- .TP
- &.|.|.
- .RE
- .
- .TP
- .B .../include
- directory for global include files that are used in that project
- .
- .TP
- .B .../bins
- directory for binary programs that are created/needed while compiling
- the project
- .RS
- .TP
- .B sparc-sunos5-cc/
- directory for binaries that belong to a specific system
- .TP
- &.|.|.
- .RE
- .
- .TP
- .B .../libs
- directory for libraries that are created/needed while compiling
- the project
- .RS
- .TP
- .B sparc-sunos5-cc/
- directory for libraries that belong to a specific system
- .TP
- &.|.|.
- .RE
- .
- .TP
- .B .../incs
- directory for include files that are created/needed while compiling
- the project
- .RS
- .TP
- .B sparc-sunos5-cc/
- directory for include files that belong to a specific system
- .TP
- &.|.|.
- .RE
- .TP
- &.|.|.
- .RE
- .
- .ad
- .PD
- .SH AUTHOR
- .nf
- J*org Schilling
- Seestr. 110
- D-13353 Berlin
- Germany
- .fi
- .PP
- Mail bugs and suggestions to:
- .PP
- .B
- joerg@schily.isdn.cs.tu-berlin.de
- or
- .B
- js@cs.tu-berlin.de
- or
- .B
- jes@fokus.gmd.de