123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493 |
- #
- # OS/161 build environment base definitions
- #
- # Proper usage:
- # TOP=../.. # or however many levels needed
- # .include "$(TOP)/mk/os161.config.mk"
- #
- # This file takes care of including $(TOP)/defs.mk and sets defaults
- # for things that can be defined there.
- #
- # It and defs.mk collaboratively set various make variables that
- # control the build environment.
- #
- ############################################################
- #
- # These build variables are meant to be user-settable:
- #
- # (Locations.)
- #
- # OSTREE The root directory you run OS/161 in.
- # Default is ~/os161/root.
- #
- # WORKDIR Top of a tree to use for compiling.
- # Default is $(TOP)/build.
- #
- # BUILDSYMLINKS If set to "yes", symlinks in each directory
- # will be made to point into $(BUILDTOP).
- # Default is "yes".
- #
- # By default the system will be built within the source tree and
- # installed to ~/os161/root. It is expected this will be sufficient
- # for most uses. If your root directory is somewhere else, set OSTREE
- # in defs.mk. If you're running on a large computing cluster with
- # networked home directories, setting WORKDIR to point somewhere on a
- # local disk will probably make your builds quite a bit faster, at the
- # cost of having to recompile if you switch to a different machine.
- # If you want the source tree to be completely read-only, which is
- # occasionally useful for tracking down build glitches, you can set
- # WORKDIR and also set BUILDSYMLINKS to no.
- #
- # (Platform.)
- #
- # PLATFORM The type of system we're building for.
- # Should always be set by defs.mk.
- #
- # MACHINE The processor type we're building for.
- # Should always be set by defs.mk.
- #
- # The target machine type is set when you configure the source tree.
- # If you change it, be sure to make distclean and recompile everything.
- # Not all possible combinations of PLATFORM and MACHINE are allowed.
- # See the logic at the bottom of this file for a list of supported
- # combinations. If you are trying to port OS/161 to a new machine, the
- # first step is to update that list.
- #
- # (Compilation.)
- #
- # DEBUG Compiler option for debug vs. optimize.
- # Default: -O2
- #
- # WARNINGS Compiler options for warnings.
- # Default: -Wall -Wextra -Wwrite-strings
- # -Wmissing-prototypes
- #
- # WERROR Compiler option to make warnings fatal.
- # Default: -Werror
- #
- # Since debugging of user-level programs is not supported in OS/161
- # (and not really supportable without a lot of work on your part)
- # there's usually not much reason to change DEBUG. If you want to,
- # however, the easiest way is to usually set it on the make command
- # line:
- # make clean
- # make DEBUG=-g all
- # recompiles the current directory with debug info.
- #
- # Similarly, if you have a lot of warnings and you want to temporarily
- # ignore them while you fix more serious problems, you can turn off
- # the error-on-warning behavior on the fly by setting WERROR to empty:
- # make WERROR=
- #
- # This convenience is why these variables are separately defined
- # rather than just being rolled into CFLAGS.
- #
- ############################################################
- #
- # These build variables can be set explicitly for further control if
- # desired, but should in general not need attention.
- #
- # (Locations.)
- #
- # BUILDTOP Top of tree where .o files go.
- # Default is $(WORKDIR).
- #
- # TOOLDIR Place for compiled programs used in
- # the build. Default is $(WORKDIR)/tooldir.
- #
- # INSTALLTOP Staging directory for installation.
- # Default is $(WORKDIR)/install
- #
- # Probably the only reason to change these would be if you're short on
- # diskspace in $(WORKDIR).
- #
- # (Platform.)
- #
- # GNUTARGET The GNU gcc/binutils name for the
- # target we're building for.
- # Defaults to $(MACHINE)-harvard-os161.
- #
- # This should not need to be changed.
- #
- # (Programs.)
- #
- # CC (Cross-)compiler.
- # Default is $(GNUTARGET)-gcc.
- #
- # LDCC (Cross-)compiler when invoked for linking.
- # Default is $(CC).
- #
- # AS (Cross-)assembler.
- # Default is $(GNUTARGET)-as.
- #
- # LD (Cross-)linker.
- # Default is $(GNUTARGET)-ld.
- #
- # AR Archiver (librarian).
- # Default is $(GNUTARGET)-ar.
- #
- # RANLIB Library postprocessor/indexer.
- # Default is $(GNUTARGET)-ranlib.
- #
- # NM Tool to print symbol tables.
- # Default is $(GNUTARGET)-nm.
- #
- # SIZE Tool to print sizes of binaries.
- # Default is $(GNUTARGET)-size.
- #
- # STRIP Tool to remove debugging information.
- # Default is $(GNUTARGET)-strip.
- #
- # The above are the compilation tools for OS/161. They create programs
- # that run on OS/161. Since OS/161 is not meant to be self-hosting,
- # programs that we need to run during the build, or run manually
- # outside of the machine simulator, need to be compiled with a
- # different compiler that creates programs that run for the "host" OS,
- # whatever that is (Linux, NetBSD, FreeBSD, MacOS X, Solaris, etc.)
- # The host compilation tools are prefixed with HOST_ as follows:
- #
- #
- # HOST_CC Host compiler.
- # Default is gcc.
- #
- # HOST_LDCC Host compiler when invoked for linking.
- # Default is $(HOST_CC).
- #
- # HOST_AS Host assembler.
- # Default is as.
- #
- # HOST_LD Host linker.
- # Default is ld.
- #
- # HOST_AR Host archiver (librarian).
- # Default is ar.
- #
- # HOST_RANLIB Host library postprocessor/indexer.
- # Default is ranlib.
- #
- # HOST_NM Host tool to print symbol tables.
- # Default is nm.
- #
- # HOST_SIZE Host tool to print sizes of binaries.
- # Default is size.
- #
- # HOST_STRIP Host tool to remove debugging information.
- # Default is strip.
- #
- # In general there should be no need to change the cross-compiler
- # variables, unless you are e.g. trying to build OS/161 with something
- # other than gcc, or you want to supply an explicit location for a
- # specific copy of gcc somewhere rather than use the one on your
- # $PATH.
- #
- # However, on some systems it might conceivably be necessary to change
- # the host tool variables. For example, there are some (now extremely
- # old) systems where "ranlib" is not only not needed but also corrupts
- # libraries, in which case you might set HOST_RANLIB=true. If your
- # host machine doesn't have "gcc" you may be able to set HOST_CC=cc
- # and fiddle with HOST_WARNINGS and HOST_CFLAGS (below) and have
- # things still more or less work.
- #
- # (Compilation.)
- #
- # HOST_DEBUG Like DEBUG, but for programs to be
- # built to run on the host OS.
- # Default is $(DEBUG).
- #
- # HOST_WARNINGS Like WARNINGS, but for programs to be
- # built to run on the host OS.
- # Default is $(WARNINGS).
- #
- # HOST_WERROR Like WERROR, but for programs to be
- # built to run on the host OS.
- # Default is $(WERROR).
- #
- ############################################################
- #
- # These build variables should probably not be tinkered with in
- # defs.mk and serve as baseline values to be added to by individual
- # program makefiles and used by other os161.*.mk files.
- #
- # (Compilation.)
- #
- # CFLAGS Full baseline compile flags.
- # Default is $(DEBUG) $(WARNINGS) $(WERROR),
- # plus what's needed for -nostdinc.
- #
- # KCFLAGS Like CFLAGS, but for the kernel, which
- # configures debug/optimize separately.
- # Default is $(KDEBUG) $(WARNINGS) $(WERROR).
- # (KDEBUG is set by the kernel config script.)
- #
- # HOST_CFLAGS Like CFLAGS, but for programs to be
- # built to run on the host OS. Default is
- # $(HOST_DEBUG) $(HOST_WARNINGS) $(HOST_WERROR).
- #
- # LDFLAGS Baseline link-time flags.
- # Default is empty plus what's needed for
- # -nostdlib.
- #
- # KLDFLAGS Baseline link-time flags for kernel.
- # Default is empty.
- #
- # HOST_LDFLAGS Like LDFLAGS, but for programs to be
- # built to run on the host OS.
- # Default is empty.
- #
- # LIBS Baseline list of libraries to link to.
- # Default is empty plus what's needed for
- # -nostdlib.
- #
- # HOST_LIBS Like LIBS, but for programs to be
- # built to run on the host OS.
- # Default is empty.
- #
- ############################################################
- #
- # These variables should not be changed directly, or by individual
- # program makefiles either, and are for use by other os161.*.mk files.
- #
- # (Locations.)
- #
- # MYDIR Name of current source directory, relative
- # to $(TOP); e.g. bin/sh.
- #
- # MYBUILDDIR Build directory for current source directory.
- #
- # MKDIRS Directories to create, mostly for installing.
- #
- # ABSTOP_PATTERN, ABSTOP Private, used to compute other locations.
- #
- # (Compilation.)
- #
- # MORECFLAGS Same as CFLAGS but comes later on the
- # compile command line. In general individual
- # makefiles shouldn't touch this.
- # Default is empty plus what's needed for
- # -nostdinc.
- #
- # MORELIBS Same as LIBS but comes after on the link
- # line. In general individual makefiles
- # shouldn't touch this.
- # Default is empty plus what's needed for
- # -nostdlib.
- #
- ############################################################
- # Some further vars that currently exist but should be moved
- # around elsewhere:
- #
- # COMPAT_CFLAGS
- # COMPAT_TARGETS
- ############################################################
- # Establish defaults.
- # (Variables are set in the order documented above.)
- #
- # These definitions are set firmly here (that is, not with ?=) because
- # some of them, like CC, are predefined by make. Because defs.mk is
- # included afterwards it can override any of these settings.
- #
- #
- # User-settable configuration
- #
- # Locations of things.
- OSTREE=$(HOME)/os161/root # Root directory to install into.
- WORKDIR=$(TOP)/build # Top of tree to build into.
- BUILDSYMLINKS=yes # yes => link build -> $(BUILDTOP)/$(HERE).
- # Platform we're building for.
- PLATFORM=sys161
- MACHINE=mips
- # Compilation
- DEBUG=-O2
- WARNINGS=-Wall -W -Wwrite-strings -Wmissing-prototypes
- WERROR=-Werror
- #
- # Less-likely-to-need-setting
- #
- # Locations of things.
- BUILDTOP=$(WORKDIR) # Top of directory for compiler output.
- TOOLDIR=$(WORKDIR)/tooldir # Place for host progs used in the build.
- INSTALLTOP=$(WORKDIR)/install # Staging area for installation.
- # Platform.
- GNUTARGET=$(MACHINE)-harvard-os161
- # Programs and tools.
- CC=$(GNUTARGET)-gcc # Compiler.
- LDCC=$(CC) # Compiler when used for linking.
- AS=$(GNUTARGET)-as # Assembler.
- LD=$(GNUTARGET)-ld # Linker.
- AR=$(GNUTARGET)-ar # Archiver.
- RANLIB=$(GNUTARGET)-ranlib # Library indexer.
- NM=$(GNUTARGET)-nm # Symbol dumper.
- SIZE=$(GNUTARGET)-size # Size tool.
- STRIP=$(GNUTARGET)-strip # Debug strip tool.
- HOST_CC=gcc # Host compiler.
- HOST_LDCC=$(HOST_CC) # Host compiler when used for linking.
- HOST_AS=as # Host assembler.
- HOST_LD=ld # Host linker.
- HOST_AR=ar # Host archiver.
- HOST_RANLIB=ranlib # Host library indexer.
- HOST_NM=nm # Host symbol dumper.
- HOST_SIZE=size # Host size tool.
- HOST_STRIP=strip # Host debug strip tool.
- # Compilation.
- HOST_DEBUG=$(DEBUG)
- HOST_WARNINGS=$(WARNINGS)
- HOST_WERROR=$(WERROR)
- #
- # Probably-shouldn't-be-touched
- #
- CFLAGS=$(DEBUG) $(WARNINGS) $(WERROR) -std=gnu99
- KCFLAGS=$(KDEBUG) $(WARNINGS) $(WERROR) -std=gnu99
- HOST_CFLAGS=$(HOST_DEBUG) $(HOST_WARNINGS) $(HOST_WERROR) \
- -I$(INSTALLTOP)/hostinclude
- LDFLAGS=
- KLDFLAGS=
- HOST_LDFLAGS=
- LIBS=
- HOST_LIBS=
- #
- # Don't touch.
- #
- MORECFLAGS=
- MORELIBS=
- # lib/hostcompat.
- COMPAT_CFLAGS=
- COMPAT_TARGETS=
- ############################################################
- # Get defs.mk to get the real configuration for this tree.
- # If it doesn't exist, we'll go with the defaults.
- .-include "$(TOP)/defs.mk"
- # UW Mod
- # This needs to come after the above include.
- .if defined(TOOLPREFIX)
- CC=$(TOOLPREFIX)gcc # Compiler.
- LDCC=$(CC) # Compiler when used for linking.
- AS=$(TOOLPREFIX)as # Assembler.
- LD=$(TOOLPREFIX)ld # Linker.
- AR=$(TOOLPREFIX)ar # Archiver.
- RANLIB=$(TOOLPREFIX)ranlib # Library indexer.
- NM=$(TOOLPREFIX)nm # Symbol dumper.
- SIZE=$(TOOLPREFIX)size # Size tool.
- STRIP=$(TOOLPREFIX)strip # Debug strip tool.
- .endif
- ############################################################
- # Make sure we have a supported PLATFORM and MACHINE.
- # We support mips on system/161.
- SUPPORTED_TARGETS=sys161 mips
- _OK_=0
- .for _P_ _M_ in $(SUPPORTED_TARGETS)
- .if "$(PLATFORM)" == "$(_P_)" && "$(MACHINE)" == "$(_M_)"
- _OK_=1
- .endif
- .endfor
- .if "$(_OK_)" != "1"
- .init:
- @echo "Platform $(PLATFORM) and machine $(MACHINE) not supported"
- @false
- .endif
- ############################################################
- # Get any machine-dependent flags or makefile definitions
- .-include "$(TOP)/mk/os161.config-$(MACHINE).mk"
- ############################################################
- # Establish some derived locations.
- #
- # Absolute location of the top of the source tree. This should only be
- # used to un-absolutize other paths; the tree ought to be independent
- # of where it happens to live.
- #
- # This works by turning $(TOP) into a regexp and substituting it into
- # the current directory. Note that it doesn't escape all regexp
- # metacharacters -- if you make a directory named "foo*bar" or
- # something you deserve the consequences.
- #
- # .CURDIR is a make builtin.
- #
- ABSTOP_PATTERN=$(TOP:S/./\\./g:S/\\.\\./[^\/]*/g)
- ABSTOP=$(.CURDIR:C/$(ABSTOP_PATTERN)\$//)
- # Find the name of the current directory relative to TOP.
- # This works by removing ABSTOP from the front of .CURDIR.
- MYDIR=$(.CURDIR:S/^$(ABSTOP)//)
- # Find the build directory corresponding to the current source dir.
- .if "$(MYDIR)" == ""
- # avoid stray slash
- MYBUILDDIR=$(BUILDTOP)
- .else
- MYBUILDDIR=$(BUILDTOP)/$(MYDIR)
- .endif
- ############################################################
- # Ensure we compile a consistent tree.
- #
- # Traditionally in Unix the first step of recompiling the system is to
- # install new header files. Furthermore, the second step is to compile
- # and install new libraries, before continuing on to the rest of the
- # OS, which can then be compiled with those new headers and new
- # libraries.
- #
- # Combining the compile and install phases like this is simpler and
- # uses less disk space on extra copies of things (which mattered, back
- # in the day) but has a number of problems. Chief among these is that
- # if the build bombs out halfway through you end up with a partly
- # updated and maybe broken system. It also means that once you start
- # recompiling the system you can't easily back out. And the behavior
- # violates the principle of least surprise.
- #
- # OS/161 1.x had, intentionally, a very traditional build environment.
- # In OS/161 2.x, however, we use a staging area to avoid mixing build
- # and install. This means that we must compile only against the
- # staging area, $(INSTALLTOP), and never use the headers or libraries
- # installed in $(OSTREE) until install time.
- #
- # This means that regardless of whether we have a gcc configured so it
- # includes from our $(OSTREE) by default or not, we must use -nostdinc
- # and -nostdlib and explicitly link with materials from $(INSTALLTOP).
- #
- # Use MORECFLAGS and MORELIBS, which are supported by os161.compile.mk
- # for this purpose, so the include paths and library list come out in
- # the right order.
- #
- CFLAGS+=-nostdinc
- MORECFLAGS+=-I$(INSTALLTOP)/include
- LDFLAGS+=-nostdlib -L$(INSTALLTOP)/lib $(INSTALLTOP)/lib/crt0.o
- MORELIBS+=-lc
- LIBDEPS+=$(INSTALLTOP)/lib/crt0.o $(INSTALLTOP)/lib/libc.a
- ############################################################
- # end.
|