summaryrefslogtreecommitdiff
path: root/Makeconf
diff options
context:
space:
mode:
Diffstat (limited to 'Makeconf')
-rw-r--r--Makeconf305
1 files changed, 234 insertions, 71 deletions
diff --git a/Makeconf b/Makeconf
index 5df37f3b..6c53a945 100644
--- a/Makeconf
+++ b/Makeconf
@@ -1,7 +1,40 @@
# Generic configuration for Hurd compilation
+# Directory makefiles should set the variable makemode to either
+# `server' if they compile and install a single program for /hurd
+# `utility' if they compile and install a single program for /bin
+# `servers' if they compile and install multiple programs for /hurd
+# `utilities' if they compile and install multiple programs for /bin
+# `library' if they compile and install a library
+# `misc' if they do none of those
+
+# Every makefile should define
+# SRCS (all actual source code)
+# LCLHDRS (all source headers in this directory [NOT MiG created])
+# REMHDRS (all Hurd headers in other directories [NOT .defs files])
+
+# Types `server', `utility', and `library' should define
+# OBJS (all .o files used to produce the target).
+
+# Types `server', `utility', `servers', and `utilities' should define
+# HURDLIBS (all Hurd libraries used, omitting the dirname and the .a.)
+
+# Types `server' and `utility' should define
+# OTHERLIBS (all other libraries used)
+# target (the name of the program built)
+
+# Types `servers' and `utilities' should define
+# targets (the names of all the programs built)
+
+# Type `library' should define
+# libname (the name of the library, without .a.)
+# installhdrs (header files that should be installed in /include)
+
+
+# Put this first so it's the default
all:
+
# This is the directory into which Hurd cross-building tools are placed
hurdinst := /home/gd3/hurdinst
@@ -18,43 +51,116 @@ hurdrootdev := /dev/hd0f
hurdsource := /home/gd3/gnu/hurd
# Where to find various things for compilation:
+
includedir := $(hurdinst)/include
+
startup := $(hurdinst)/lib/crt0.o
libc := $(patsubst %,$(hurdinst)/lib/lib%.a,c machuser hurduser c hurduser)
-libthreads := $(hurdinst)/lib/libthreads.a
-libports := $(hurdinst)/lib/libports.a
-libioserver := $(hurdinst)/lib/libioserver.a
-libpager := $(hurdinst)/lib/libpager.a
-libfshelp := $(hurdinst)/lib/libfshelp.a
-libdiskfs := $(hurdinst)/lib/libdiskfs.a
-libtrivfs := $(hurdinst)/lib/libtrivfs.a
+
+# END CONFIGURATION AREA
+
+
+# Decode makemode:
+
+
+ifeq ($(makemode),server)
+ doinst := one
+ installationdir := $(hurdinst)/hurd
+ clean := yes
+ cleantarg := $(target)
+endif
+
+ifeq ($(makemode),utility)
+ doinst := one
+ installationdir := $(hurdinst)/bin
+ clean := yes
+ cleantarg := $(target)
+endif
+
+ifeq ($(makemode),servers)
+ doinst := many
+ installationdir := $(hurdinst)/hurd
+ clean := yes
+ cleantarg := $(targets)
+endif
+
+ifeq ($(makemode),utilities)
+ doinst := many
+ installationdir := $(hurdinst)/bin
+ clean := yes
+ cleantarg := $(targets)
+endif
+
+ifeq ($(makemode),library)
+ clean := yes
+ cleantarg := $(libname).a
+endif
+
+
+
+# Hurd libraries
+libthreads := $(hurdsource)/libthreads/libthreads.a
+libports := $(hurdsource)/libports/libports.a
+libioserver := $(hurdsource)/libioserver/libioserver.a
+libpager := $(hurdsource)/libpager/libpager.a
+libfshelp := $(hurdsource)/libfshelp/libfshelp.a
+libdiskfs := $(hurdsource)/libdiskfs/libdiskfs.a
+libtrivfs := $(hurdsource)/libtrivfs/libtrivfs.a
# Finding binaries
include $(hurdsource)/Maketools
-# Flags for compilation. It is important to have -I. first for things that
-# use their own headers which are later installed; they might do `#include
-# <foo.h>' and that ignores the current directory.
-CPPFLAGS := -I.
+# Flags for compilation.
+# It is important to have this inclusion first; that picks up our
+# library header files locally rather than from installed copies.
+CPPFLAGS := -I$(hurdsource)
CFLAGS := -Wall -Wno-parentheses -g
-# Mounting $(hurdroot)
-ifeq ($(hurdroot),)
-$(hurdroot): force
- @echo Cannot do install on this machine.
- false
-else
-$(hurdroot): $(hurdroot)/mounted
-$(hurdroot)/mounted:
- fsck -p $(hurdrootdev)
- mount $(hurdrootdev)
+
+# Standard targets
+
+# Installation
+ifeq ($(doinst),one)
+all: $(target)
+install: $(target)
+ $(INSTALL_BIN) $(target) $(installationdir)/$(target)
+endif
+
+ifeq ($(doinst),many)
+all: $(targets)
+install: $(targets)
+ for i in $(targets); do; $(INSTALL_BIN) $$i $(installationdir)/$$i; done
endif
+ifeq ($(makemode),library)
+all: $(libname).a
+install: $(libname).a $(installhdrs)
+ cp $(installhdrs) $(includedir)/hurd/
+ cp $(libname).a $(hurdinst)/lib/$(libname).a
+ ranlib $(hurdinst)/lib/$(libname).a
+endif
-# Making a snapshot
+# Provide default.
+install:
+
+
+# Building the target
+# Yippee! A use for computed variable references!
+ifeq ($(doinst),one)
+$(target): $(OBJS) $($(HURDLIBS)) $(OTHERLIBS)
+# $(CC) $(CFLAGS) -o $(target) $^
+endif
+
+ifeq ($(makemode),library)
+$(libname).a: $(OBJS)
+ rm -f $(libname).a
+ $(AR) r $@ $^
+endif
-lndist: $(DIST_FILES) $(hurdsource)/hurd-snap/$(dir) FORCE
- ln $(DIST_FILES) $(hurdsource)/hurd-snap/$(dir)
+# Making a snapshot
+distfiles := Makefile ChangeLog $(SRCS) $(LCLHDRS) DIST_FILES
+lndist: $(distfiles) $(hurdsource)/hurd-snap/$(dir) FORCE
+ ln $(distfiles) $(hurdsource)/hurd-snap/$(dir)
ifeq ($(dir),.)
$(hurdsource)/hurd-snap/$(dir):
@@ -63,66 +169,123 @@ $(hurdsource)/hurd-snap/$(dir):
mkdir $(hurdsource)/hurd-snap/$(dir)
endif
-
# TAGS files
-
ifneq ($(dir),.)
-TAGS: $(SRCS) $(TAGSHDRS)
- etags -o $@ $(addprefix -i ,$(addsuffix /TAGS,$(addprefix ../,$(TAGSLIBS)))) $(SRCS) $(TAGSHDRS)
+TAGS: $(SRCS) $(LCLHDRS) $(REMHDRS)
+ etags -o $@ $(addprefix -i ,$(addsuffix /TAGS,$(addprefix ../,$(HURDLIBS)))) $(SRCS) $(LCLHDRS) $(REMHDRS)
endif
-# Dependencies for building libraries
-ifneq ($(strip $(dir)),libports)
-$(libports): FORCE
- $(MAKE) -C $(hurdsource)/libports $(libports)
-$(includedir)/hurd/ports.h: FORCE
- $(MAKE) -C $(hurdsource)/libports $(includedir)/hurd/ports.h
+# Cleaning
+ifeq ($(clean),yes)
+clean:
+ rm -f *.o *Server.c *User.c *_S.h *_U.h $(cleantarg)
+ifneq ($(makemode),library)
+relink:
+ rm -f $(cleantarg)
endif
-
-ifneq ($(strip $(dir)),libioserver)
-$(libioserver): FORCE
- $(MAKE) -C $(hurdsource)/libioserver $(libioserver)
-$(includedir)/hurd/ioserver.h: FORCE
- $(MAKE) -C $(hurdsource)/libioserver $(includedir)/hurd/ioserver.h
endif
+clean:
+relink:
-ifneq ($(strip $(dir)),libpager)
-$(libpager): FORCE
- $(MAKE) -C $(hurdsource)/libpager $(libpager)
-$(includedir)/hurd/pager.h: FORCE
- $(MAKE) -C $(hurdsource)/libpager $(includedir)/hurd/pager.h
-endif
-ifneq ($(strip $(dir)),libdiskfs)
-$(libdiskfs): FORCE
- $(MAKE) -C $(hurdsource)/libdiskfs $(libdiskfs)
-$(includedir)/hurd/diskfs.h: FORCE
- $(MAKE) -C $(hurdsource)/libdiskfs $(includedir)/hurd/diskfs.h
-endif
+
+# Subdependencies
-ifneq ($(strip $(dir)),libfshelp)
-$(libfshelp): FORCE
- $(MAKE) -C $(hurdsource)/libfshelp $(libfshelp)
-$(includedir)/hurd/fshelp.h: FORCE
- $(MAKE) -C $(hurdsource)/libfshelp $(includedir)/hurd/fshelp.h
+# Mounting $(hurdroot)
+ifeq ($(hurdroot),)
+$(hurdroot): force
+ @echo Cannot do install on this machine.
+ false
+else
+$(hurdroot): $(hurdroot)/mounted
+$(hurdroot)/mounted:
+ fsck -p $(hurdrootdev)
+ mount $(hurdrootdev)
endif
-ifneq ($(strip $(dir)),libtrivfs)
-$(libtrivfs): FORCE
- $(MAKE) -C $(hurdsource)/libtrivfs $(libtrivfs)
-$(includedir)/hurd/trivfs.h: FORCE
- $(MAKE) -C $(hurdsource)/libtrivfs $(includedir)/hurd/trivfs.h
-endif
+# Building Hurd libraries
+$(hurdsource)/lib%/lib%.a: FORCE
+ $(MAKE) -C $(dir $@) $(notdir $@)
+
+
+# How to build RPC stubs
+
+# Server stubs from Hurd interfaces
+hurddefs := $(notdir $(basename $(wildcard $(hurdsource)/hurd/*.defs)))
+ht := $(hurdsource)/hurd/hurd_types.defs
+
+$(addsuffix _S.h,$(hurddefs)): %_S.h: $(hurdsource)/hurd/%.defs $(ht)
+ $(CPP) $(CPPFLAGS) $(MIGSFLAGS) -DSERVERPREFIX=S_ $(hurdsource)/hurd/$*.defs \
+ | $(MIGCOM) -sheader $*_S.h -user /dev/null -server /dev/null -header /dev/null
+
+$(addsuffix Server.c,$(hurddefs)): %Server.c: $(hurdsource)/hurd/%.defs $(ht)
+ $(CPP) $(CPPFLAGS) $(MIGSFLAGS) -DSERVERPREFIX=S_ $(hurdsource)/hurd/$*.defs \
+ | $(MIGCOM) -user /dev/null -header /dev/null -server $*Server.c
+
+# User stubs from Hurd interfaces
+
+# Build a .c file to avoid confusion (due to the need to build
+# a header file in the following rule).
+$(addsuffix _U.h,$(hurddefs)): %_U.h: $(hurdsource)/hurd/%.defs $(ht)
+ $(CPP) $(CPPFLAGS) $(hurdsource)/hurd/$*.defs \
+ | $(MIGCOM) -user $*User.c -server /dev/null -header $*_U.h
+
+# We have to build a header file because otherwise MiG ignores the imports
+$(addsuffix User.c,$(hurddefs)): %User.c: $(hurdsource)/hurd/%.defs $(ht)
+ $(CPP) $(CPPFLAGS) $(hurdsource)/hurd/$*.defs \
+ | $(MIGCOM) -user $*User.c -server /dev/null -header $*_U.h
+
+# Server stubs from Mach interfaces
+machdefs := notify
+
+$(addsuffix _S.h,$(machdefs)): %_S.h: $(includedir)/mach/%.defs
+ $(CPP) $(CPPFLAGS) $(MIGSFLAGS) $(includedir)/mach/$*.defs \
+ | $(MIGCOM) -sheader $*_S.h -user /dev/null -server /dev/null -header /dev/null
+
+$(addsuffix Server.c,$(machdefs)): %Server.c: $(includedir)/mach/%.defs
+ $(CPP) $(CPPFLAGS) $(MIGSFLAGS) $(includedir)/mach/$*.defs \
+ | $(MIGCOM) -user /dev/null -header /dev/null -server $*Server.c
+
+# User stubs from Mach interfaces
+
+# Build a .c file to avoid confusion (due to the need to build
+# a header file in the following rule).
+$(addsuffix _U.h,$(machdefs)): %_U.h: $(includedir)/mach/%.defs $(ht)
+ $(CPP) $(CPPFLAGS) $(includedir)/mach/$*.defs \
+ | $(MIGCOM) -user $*User.c -server /dev/null -header $*_U.h
+
+# We have to build a header file because otherwise MiG ignores the imports
+$(addsuffix User.c,$(machdefs)): %User.c: $(includedir)/mach/%.defs $(ht)
+ $(CPP) $(CPPFLAGS) $(includedir)/mach/$*.defs \
+ | $(MIGCOM) -user $*User.c -server /dev/null -header $*_U.h
+
+# Server stubs from Mach device interfaces
+devicedefs := device_reply device
+
+$(addsuffix _S.h,$(devicedefs)): %_S.h: $(includedir)/device/%.defs
+ $(CPP) $(CPPFLAGS) $(MIGSFLAGS) $(includedir)/device/$*.defs \
+ | $(MIGCOM) -sheader $*_S.h -user /dev/null -server /dev/null -header /dev/null
+
+$(addsuffix Server.c,$(devicedefs)): %Server.c: $(includedir)/device/%.defs
+ $(CPP) $(CPPFLAGS) $(MIGSFLAGS) $(includedir)/device/$*.defs \
+ | $(MIGCOM) -user /dev/null -header /dev/null -server $*Server.c
+
+
+# User stubs from Mach device interfaces
+
+# Build a .c file to avoid confusion (due to the need to build
+# a header file in the following rule).
+$(addsuffix _U.h,$(devicedefs)): %_U.h: $(includedir)/device/%.defs $(ht)
+ $(CPP) $(CPPFLAGS) $(includedir)/device/$*.defs \
+ | $(MIGCOM) -user $*User.c -server /dev/null -header $*_U.h
+
+# We have to build a header file because otherwise MiG ignores the imports
+$(addsuffix User.c,$(devicedefs)): %User.c: $(includedir)/device/%.defs $(ht)
+ $(CPP) $(CPPFLAGS) $(includedir)/device/$*.defs \
+ | $(MIGCOM) -user $*User.c -server /dev/null -header $*_U.h
+
-ifneq ($(strip $(dir)),libthreads)
-$(libthreads): FORCE
- $(MAKE) -C $(hurdsource)/libthreads $(libthreads)
-$(includedir)/cthreads.h: FORCE
- $(MAKE) -C $(hurdsource)/libthreads $(includedir)/cthreads.h
-$(includedir)/machine/cthreads.h: FORCE
- $(MAKE) -C $(hurdsource)/libthreads $(includedir)/machine/cthreads.h
-endif
FORCE: