summaryrefslogtreecommitdiffstats
path: root/Documentation/kbuild
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-10-05 01:18:40 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-10-05 01:18:40 +0000
commit012bb3e61e5eced6c610f9e036372bf0c8def2d1 (patch)
tree87efc733f9b164e8c85c0336f92c8fb7eff6d183 /Documentation/kbuild
parent625a1589d3d6464b5d90b8a0918789e3afffd220 (diff)
Merge with Linux 2.4.0-test9. Please check DECstation, I had a number
of rejects to fixup while integrating Linus patches. I also found that this kernel will only boot SMP on Origin; the UP kernel freeze soon after bootup with SCSI timeout messages. I commit this anyway since I found that the last CVS versions had the same problem.
Diffstat (limited to 'Documentation/kbuild')
-rw-r--r--Documentation/kbuild/00-INDEX2
-rw-r--r--Documentation/kbuild/makefiles.txt1226
2 files changed, 1228 insertions, 0 deletions
diff --git a/Documentation/kbuild/00-INDEX b/Documentation/kbuild/00-INDEX
index b72963abb..398393455 100644
--- a/Documentation/kbuild/00-INDEX
+++ b/Documentation/kbuild/00-INDEX
@@ -6,3 +6,5 @@ commands.txt
- overview of kbuild commands
config-language.txt
- specification of Config Language, the language in Config.in files
+makefiles.txt
+ - developer information for linux kernel makefiles
diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt
new file mode 100644
index 000000000..206272a47
--- /dev/null
+++ b/Documentation/kbuild/makefiles.txt
@@ -0,0 +1,1226 @@
+Linux Kernel Makefiles
+2000-September-14
+Michael Elizabeth Chastain, <mec@shout.net>
+
+
+
+=== Table of Contents
+
+This document describes the Linux kernel Makefiles.
+
+ 1 Overview
+ 2 Who does what
+ 3 Makefile language
+ 4 Variables passed down from the top
+ 5 The structure of an arch Makefile
+ 5.1 Architecture-specific variables
+ 5.2 Vmlinux build variables
+ 5.3 Post-vmlinux goals
+ 5.4 Mandatory arch-specific goals
+ 6 The structure of a subdirectory Makefile
+ 6.1 Comments
+ 6.2 Goal definitions
+ 6.3 Adapter section
+ 6.4 Rules.make section
+ 6.5 Special rules
+ 7 Rules.make variables
+ 7.1 Subdirectories
+ 7.2 Object file goals
+ 7.3 Library file goals
+ 7.4 Loadable module goals
+ 7.5 Multi-part modules
+ 7.6 Compilation flags
+ 7.7 Miscellaneous variables
+ 8 New-style variables
+ 9 Compatibility with Linux Kernel 2.2
+ 10 Credits
+
+
+=== 1 Overview
+
+The Makefiles have five parts:
+
+ Makefile: the top Makefile.
+ .config: the kernel configuration file.
+ arch/*/Makefile: the arch Makefiles.
+ Subdirectory Makefiles: there are about 300 of these.
+ Rules.make: the common rules for all subdirectory Makefiles.
+
+The top Makefile reads the .config file, which comes from the
+kernel configuration process.
+
+The top Makefile is responsible for building two major products: vmlinux
+(the resident kernel image) and modules (any module files). It builds
+these goals by recursively descending into the subdirectories of the
+kernel source tree. The list of subdirectories which are visited depends
+upon the kernel configuration.
+
+The top Makefile textually includes an arch Makefile with the name
+arch/$(ARCH)/Makefile. The arch Makefile supplies architecture-specific
+information to the top Makefile.
+
+Each subdirectory has a Makefile which carries out the commands passed
+down from above. The subdirectory Makefile uses information from the
+.config file to construct various file lists, and then it textually
+includes the common rules in Rules.make.
+
+Rules.make defines rules which are common to all the subdirectory
+Makefiles. It has a public interface in the form of certain variable
+lists. It then declares rules based on those lists.
+
+
+
+=== 2 Who does what
+
+People have four different relationships with the kernel Makefiles.
+
+*Users* are people who build kernels. These people type commands such as
+"make menuconfig" or "make bzImage". They usually do not read or edit
+any kernel Makefiles (or any other source files).
+
+*Normal developers* are people who work on features such as device
+drivers, file systems, and network protocols. These people need to
+maintain the subdirectory Makefiles for the subsystem that they are
+working on. In order to do this effectively, they need some overall
+knowledge about the kernel Makefiles, plus detailed knowledge about the
+public interface for Rules.make.
+
+*Arch developers* are people who work on an entire architecture, such
+as sparc or ia64. Arch developers need to know about the arch Makefiles
+as well as subdirectory Makefiles.
+
+*Kbuild developers* are people who work on the kernel build system itself.
+These people need to know about all aspects of the kernel Makefiles.
+
+This document is aimed towards normal developers and arch developers.
+
+
+
+=== 3 Makefile language
+
+The kernel Makefiles are designed to run with Gnu Make. The Makefiles
+use only the documented features of Gnu Make, but they do use many
+Gnu extensions.
+
+Gnu Make supports elementary list-processing functions. The kernel
+Makefiles use a novel style of list building and manipulation with few
+"if" statements.
+
+Gnu Make has two assignment operators, ":=" and "=". ":=" performs
+immediate evaluation of the right-hand side and stores an actual string
+into the left-hand side. "=" is like a formula definition; it stores the
+right-hand side in an unevaluated form and then evaluates this form each
+time the left-hand side is used.
+
+There are some cases where "=" is appropriate. Usually, though, ":="
+is the right choice.
+
+All of the examples in this document were drawn from actual kernel
+sources. The examples have been reformatted (white space changed, lines
+split), but are otherwise exactly the same.
+
+
+
+=== 4 Variables passed down from the top
+
+The top Makefile exports the following variables:
+
+ VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION
+
+ These variables define the current kernel version. A few arch
+ Makefiles actually use these values directly; they should use
+ $(KERNELRELEASE) instead.
+
+ $(VERSION), $(PATCHLEVEL), and $(SUBLEVEL) define the basic
+ three-part version number, such as "2", "4", and "0". These three
+ values are always numeric.
+
+ $(EXTRAVERSION) defines an even tinier sublevel for pre-patches
+ or additional patches. It is usually some non-numeric string
+ such as "-pre4", and is often blank.
+
+ KERNELRELEASE
+
+ $(KERNELRELEASE) is a single string such as "2.4.0-pre4", suitable
+ for constructing installation directory names or showing in
+ version strings. Some arch Makefiles use it for this purpose.
+
+ ARCH
+
+ This variable defines the target architecture, such as "i386",
+ "arm", or "sparc". Many subdirectory Makefiles test $(ARCH)
+ to determine which files to compile.
+
+ By default, the top Makefile sets $(ARCH) to be the same as the
+ host system system architecture. For a cross build, a user may
+ override the value of $(ARCH) on the command line:
+
+ make ARCH=m68k ...
+
+ TOPDIR, HPATH
+
+ $(TOPDIR) is the path to the top of the kernel source tree.
+ Subdirectory Makefiles need this so that they can include
+ $(TOPDIR)/Rules.make.
+
+ $(HPATH) is equal to $(TOPDIR)/include. A few arch Makefiles
+ need to use this to do special things using include files.
+
+ SUBDIRS
+
+ $(SUBDIRS) is a list of directories which the top Makefile
+ enters in order to build either vmlinux or modules. The actual
+ directories in $(SUBDIRS) depend on the kernel configuration.
+ The top Makefile defines this variable, and the arch Makefile
+ extends it.
+
+ HEAD, CORE_FILES, NETWORKS, DRIVERS, LIBS
+ LINKFLAGS
+
+ $(HEAD), $(CORE_FILES), $(NETWORKS), $(DRIVERS), and $(LIBS)
+ specify lists of object files and libraries to be linked into
+ vmlinux.
+
+ The files in $(HEAD) are linked first in vmlinux.
+
+ $(LINKFLAGS) specifies the flags to build vmlinux.
+
+ The top Makefile and the arch Makefile jointly define these
+ variables. The top Makefile defines $(CORE_FILES), $(NETWORKS),
+ $(DRIVERS), and $(LIBS). The arch Makefile defines $(HEAD)
+ and $(LINKFLAGS), and extends $(CORE_FILES) and $(LIBS).
+
+ Note: there are more names here than necessary. $(NETWORKS),
+ $(DRIVERS), and even $(LIBS) could be subsumed into $(CORE_FILES).
+
+ CPP, CC, AS, LD, AR, NM, STRIP, OBJCOPY, OBJDUMP
+ CPPFLAGS, CFLAGS, CFLAGS_KERNEL, MODFLAGS, AFLAGS, LDFLAGS
+ PERL
+ GENKSYMS
+
+ These variables specify the commands and flags that Rules.make
+ uses to build goal files from source files.
+
+ $(CFLAGS_KERNEL) contains extra C compiler flags used to compile
+ resident kernel code.
+
+ $(MODFLAGS) contains extra C compiler flags used to compile code
+ for loadable kernel modules. In the future, this flag may be
+ renamed to the more regular name $(CFLAGS_MODULE).
+
+ $(AFLAGS) contains assembler flags.
+
+ $(GENKSYMS) contains the command used to generate kernel symbol
+ signatures when CONFIG_MODVERSIONS is enabled. The genksyms
+ command comes from the modutils package.
+
+ CROSS_COMPILE
+
+ This variable is a prefix path for other variables such as $(CC),
+ $(AS), and $(LD). The arch Makefiles sometimes use and set this
+ variable explicitly. Subdirectory Makefiles don't need to worry
+ about it.
+
+ The user may override $(CROSS_COMPILE) on the command line if
+ desired.
+
+ HOSTCC, HOSTCFLAGS
+
+ These variables define the C compiler and C compiler flags to
+ be used for compiling host side programs. These are separate
+ variables because the target architecture can be different from
+ the host architecture.
+
+ If your Makefile compiles and runs a program that is executed
+ during the course of building the kernel, then it should use
+ $(HOSTCC) and $(HOSTCFLAGS).
+
+ For example, the subdirectory drivers/pci has a helper program
+ named gen-devlist.c. This program reads a list of PCI ID's and
+ generates C code in the output files classlist.h and devlist.h.
+
+ Suppose that a user has an i386 computer and wants to build a
+ kernel for an ia64 machine. Then the user would use an ia64
+ cross-compiler for most of the compilation, but would use a
+ native i386 host compiler to compile drivers/pci/gen-devlist.c.
+
+ For another example, kbuild helper programs such as
+ scripts/mkdep.c and scripts/lxdialog/*.c are compiled with
+ $(HOSTCC) rather than $(CC).
+
+ ROOT_DEV, SVGA_MODE, RAMDISK
+
+ End users edit these variables to specify certain information
+ about the configuration of their kernel. These variables
+ are ancient! They are also specific to the i386 architecture.
+ They really should be replaced with CONFIG_* options.
+
+ MAKEBOOT
+
+ This variable is defined and used only inside the main arch
+ Makefiles. The top Makefile should not export it.
+
+ INSTALL_PATH
+
+ This variable defines a place for the arch Makefiles to install
+ the resident kernel image and System.map file.
+
+ INSTALL_MOD_PATH, MODLIB
+
+ $(INSTALL_MOD_PATH) specifies a prefix to $(MODLIB) for module
+ installation. This variable is not defined in the Makefile but
+ may be passed in by the user if desired.
+
+ $(MODLIB) specifies the directory for module installation.
+ The top Makefile defines $(MODLIB) to
+ $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE). The user may
+ override this value on the command line if desired.
+
+ CONFIG_SHELL
+
+ This variable is private between Makefile and Rules.make.
+ Arch makefiles and subdirectory Makefiles should never use this.
+
+ MODVERFILE
+
+ An internal variable. This doesn't need to be exported, as it
+ is never used outside of the top Makefile.
+
+ MAKE, MAKEFILES
+
+ Some variables internal to Gnu Make.
+
+ $(MAKEFILES) in particular is used to force the arch Makefiles
+ and subdirectory Makefiles to read $(TOPDIR)/.config without
+ including it explicitly. (This was an implementation hack and
+ could be fixed).
+
+
+
+=== 5 The structure of an arch Makefile
+
+
+
+--- 5.1 Architecture-specific variables
+
+The top Makefile includes one arch Makefile file, arch/$(ARCH)/Makefile.
+This section describes the functions of the arch Makefile.
+
+An arch Makefile extends some of the top Makefile's variables with
+architecture-specific values.
+
+ SUBDIRS
+
+ The top Makefile defines $(SUBDIRS). The arch Makefile extends
+ $(SUBDIRS) with a list of architecture-specific directories.
+
+ Example:
+
+ # arch/alpha/Makefile
+
+ SUBDIRS := $(SUBDIRS) arch/alpha/kernel arch/alpha/mm \
+ arch/alpha/lib arch/alpha/math-emu
+
+ This list may depend on the configuration:
+
+ # arch/arm/Makefile
+
+ ifeq ($(CONFIG_ARCH_ACORN),y)
+ SUBDIRS += drivers/acorn
+ ...
+ endif
+
+ CPP, CC, AS, LD, AR, NM, STRIP, OBJCOPY, OBJDUMP
+ CPPFLAGS, CFLAGS, CFLAGS_KERNEL, MODFLAGS, AFLAGS, LDFLAGS
+
+ The top Makefile defines these variables, and the arch Makefile
+ extends them.
+
+ Many arch Makefiles dynamically run the target C compiler to
+ probe what options it supports:
+
+ # arch/i386/Makefile
+
+ # only work around strength reduction bug(s) on older gcc versions
+ CFLAGS += $(shell if ! $(CC) -march=i486 -S -o /dev/null \
+ -xc /dev/null >/dev/null 2>&1; \
+ then echo "-fno-strength-reduce"; fi)
+
+ # prevent gcc from keeping the stack 16 byte aligned
+ CFLAGS += $(shell if $(CC) -mpreferred-stack-boundary=2 \
+ -S -o /dev/null -xc /dev/null >/dev/null 2>&1; \
+ then echo "-mpreferred-stack-boundary=2"; fi)
+
+ And, of course, $(CFLAGS) can depend on the configuration:
+
+ # arch/i386/Makefile
+
+ ifdef CONFIG_M386
+ CFLAGS += $(shell if $(CC) -march=i386 -S -o /dev/null \
+ -xc /dev/null >/dev/null 2>&1; \
+ then echo "-march=i386"; else echo "-m386"; fi)
+ endif
+
+ ifdef CONFIG_M486
+ CFLAGS += $(shell if $(CC) -march=i486 -S -o /dev/null \
+ -xc /dev/null >/dev/null 2>&1; \
+ then echo "-march=i486"; else echo "-m486"; fi)
+ endif
+
+ ifdef CONFIG_M586
+ CFLAGS += $(shell if $(CC) -march=i586 -S -o /dev/null \
+ -xc /dev/null >/dev/null 2>&1; \
+ then echo "-march=i586"; fi)
+ endif
+
+ Some arch Makefiles redefine the compilation commands in order
+ to add architecture-specific flags:
+
+ # arch/s390/Makefile
+
+ LD=$(CROSS_COMPILE)ld -m elf_s390
+ OBJCOPY=$(CROSS_COMPILE)objcopy -O binary -R .note -R .comment -S
+
+
+
+--- 5.2 Vmlinux build variables
+
+An arch Makefile co-operates with the top Makefile to define variables
+which specify how to build the vmlinux file. Note that there is no
+corresponding arch-specific section for modules; the module-building
+machinery is all architecture-independent.
+
+ HEAD, CORE_FILES, LIBS
+ LINKFLAGS
+
+ The top Makefile defines the architecture-independent core of
+ thse variables, and the arch Makefile extends them. Note that the
+ arch Makefile defines (not just extends) $(HEAD) and $(LINKFLAGS).
+
+ Example:
+
+ # arch/m68k/Makefile
+
+ ifndef CONFIG_SUN3
+ LINKFLAGS = -T $(TOPDIR)/arch/m68k/vmlinux.lds
+ else
+ LINKFLAGS = -T $(TOPDIR)/arch/m68k/vmlinux-sun3.lds -N
+ endif
+
+ ...
+
+ ifndef CONFIG_SUN3
+ HEAD := arch/m68k/kernel/head.o
+ else
+ HEAD := arch/m68k/kernel/sun3-head.o
+ endif
+
+ SUBDIRS += arch/m68k/kernel arch/m68k/mm arch/m68k/lib
+ CORE_FILES := arch/m68k/kernel/kernel.o arch/m68k/mm/mm.o $(CORE_FILES)
+ LIBS += arch/m68k/lib/lib.a
+
+
+
+--- 5.3 Post-vmlinux goals
+
+An arch Makefile specifies goals that take the vmlinux file, compress
+it, wrap it in bootstrapping code, and copy the resulting files somewhere.
+This includes various kinds of installation commands.
+
+These post-vmlinux goals are not standardized across different
+architectures. Here is a list of these goals and the architectures
+that support each of them (as of kernel version 2.4.0-test6-pre5):
+
+ balo mips
+ bootimage alpha
+ bootpfile alpha, ia64
+ bzImage i386, m68k
+ bzdisk i386
+ bzlilo i386
+ compressed i386, m68k, mips, mips64, sh
+ dasdfmt s390
+ Image arm
+ image s390
+ install arm, i386
+ lilo m68k
+ msb alpha, ia64
+ my-special-boot alpha, ia64
+ orionboot mips
+ rawboot alpha
+ silo s390
+ srmboot alpha
+ tftpboot.img sparc, sparc64
+ vmlinux.64 mips64
+ vmlinux.aout sparc64
+ zImage arm, i386, m68k, mips, mips64, ppc, sh
+ zImage.initrd ppc
+ zdisk i386, mips, mips64, sh
+ zinstall arm
+ zlilo i386
+ znetboot.initrd ppc
+
+
+
+--- 5.4 Mandatory arch-specific goals
+
+An arch Makefile must define the following arch-specific goals.
+These goals provide arch-specific actions for the corresponding goals
+in the top Makefile:
+
+ archclean clean
+ archdep dep
+ archmrproper mrproper
+
+
+
+=== 6 The structure of a subdirectory Makefile
+
+A subdirectory Makefile has five sections.
+
+
+
+--- 6.1 Comments
+
+The first section is a comment header. Just write what you would
+write if you were editing a C source file, but use "# ..." instead of
+"/* ... */". Historically, many anonymous people have edited kernel
+Makefiles without leaving any change histories in the header; comments
+from them would have been valuable.
+
+
+
+--- 6.2 Goal definitions
+
+The second section is a bunch of definitions that are the heart of the
+subdirectory Makefile. These lines define the files to be built, any
+special compilation options, and any subdirectories to be recursively
+entered. The declarations in these lines depend heavily on the kernel
+configuration variables (CONFIG_* symbols).
+
+In some Makefiles ("old-style Makefiles"), the second section looks
+like this:
+
+ # drivers/parport/Makefile
+ ifeq ($(CONFIG_PARPORT_PC),y)
+ LX_OBJS += parport_pc.o
+ else
+ ifeq ($(CONFIG_PARPORT_PC),m)
+ MX_OBJS += parport_pc.o
+ endif
+ endif
+
+In most Makefiles ("new-style Makefiles"), the second section looks
+like this:
+
+ # drivers/block/Makefile
+ obj-$(CONFIG_MAC_FLOPPY) += swim3.o
+ obj-$(CONFIG_BLK_DEV_FD) += floppy.o
+ obj-$(CONFIG_AMIGA_FLOPPY) += amiflop.o
+ obj-$(CONFIG_ATARI_FLOPPY) += ataflop.o
+
+The new-style Makefiles are more compact and easier to get correct
+for certain features (such as CONFIG_* options that enable more than
+one file). If you have a choice, please write a new-style Makefile.
+
+
+
+--- 6.3 Adapter section
+
+The third section is an adapter section. In old-style Makefiles, this
+third section is not present. In new-style Makefiles, the third section
+contains boilerplate code which converts from new-style variables to
+old-style variables. This is because Rules.make processes only the
+old-style variables.
+
+
+
+--- 6.4 Rules.make section
+
+The fourth section is the single line:
+
+ include $(TOPDIR)/Rules.make
+
+
+
+--- 6.5 Special rules
+
+The fifth section contains any special Makefile rules needed that are
+not available through the common rules in Rules.make.
+
+
+
+=== 7 Rules.make variables
+
+The public interface of Rules.make consists of the following variables:
+
+
+
+--- 7.1 Subdirectories
+
+ ALL_SUB_DIRS, SUB_DIRS, MOD_IN_SUB_DIRS, MOD_SUB_DIRS
+
+ $(ALL_SUB_DIRS) is an unconditional list of *all* the
+ subdirectories in a given directory. This list should not depend
+ on the kernel configuration.
+
+ $(SUB_DIRS) is a list of subdirectories which may contribute code
+ to vmlinux. This list may depend on the kernel configuration.
+
+ $(MOD_SUB_DIRS) and $(MOD_IN_SUB_DIRS) are lists of subdirectories
+ which may build kernel modules. Both names have exactly the
+ same meaning. (In version 2.2 and earlier kernels, these
+ variables had different meanings -- hence the different names).
+
+ For new code, $(MOD_SUB_DIRS) is recommended and $(MOD_IN_SUB_DIRS)
+ is deprecated.
+
+ Example:
+
+ # fs/Makefile
+ ALL_SUB_DIRS = coda minix ext2 fat msdos vfat proc isofs nfs \
+ umsdos ntfs hpfs sysv smbfs ncpfs ufs efs affs \
+ romfs autofs hfs lockd nfsd nls devpts devfs \
+ adfs partitions qnx4 udf bfs cramfs openpromfs \
+ autofs4 ramfs jffs
+ SUB_DIRS :=
+
+ ...
+
+ ifeq ($(CONFIG_EXT2_FS),y)
+ SUB_DIRS += ext2
+ else
+ ifeq ($(CONFIG_EXT2_FS),m)
+ MOD_SUB_DIRS += ext2
+ endif
+ endif
+
+ ifeq ($(CONFIG_CRAMFS),y)
+ SUB_DIRS += cramfs
+ else
+ ifeq ($(CONFIG_CRAMFS),m)
+ MOD_SUB_DIRS += cramfs
+ endif
+ endif
+
+ Example:
+
+ # drivers/net/Makefile
+ SUB_DIRS :=
+ MOD_SUB_DIRS :=
+ MOD_IN_SUB_DIRS :=
+ ALL_SUB_DIRS := $(SUB_DIRS) fc hamradio irda pcmcia tokenring \
+ wan sk98lin arcnet skfp tulip appletalk
+
+ ...
+
+ ifeq ($(CONFIG_IRDA),y)
+ SUB_DIRS += irda
+ MOD_IN_SUB_DIRS += irda
+ else
+ ifeq ($(CONFIG_IRDA),m)
+ MOD_IN_SUB_DIRS += irda
+ endif
+ endif
+
+ ifeq ($(CONFIG_TR),y)
+ SUB_DIRS += tokenring
+ MOD_IN_SUB_DIRS += tokenring
+ else
+ ifeq ($(CONFIG_TR),m)
+ MOD_IN_SUB_DIRS += tokenring
+ endif
+ endif
+
+
+
+--- 7.2 Object file goals
+
+ O_TARGET, O_OBJS, OX_OBJS
+
+ The subdirectory Makefile specifies object files for vmlinux in
+ the lists $(O_OBJS) and $(OX_OBJS). These lists depend on the
+ kernel configuration.
+
+ The "X" in "OX_OBJS" stands for "eXport". Files in $(OX_OBJS)
+ may use the EXPORT_SYMBOL macro to define public symbols which
+ loadable kernel modules can see. Files in $(O_OBJS) may not use
+ EXPORT_SYMBOL (and you will get a funky error message if you try).
+
+ [Yes, it's kludgy to do this by hand. Yes, you can define all
+ your objects as $(OX_OBJS) whether they define symbols or not;
+ but then you will notice a lot of extra compiles when you edit
+ any source file. Blame CONFIG_MODVERSIONS for this.]
+
+ Rules.make compiles all the $(O_OBJS) and $(OX_OBJS) files.
+ It then calls "$(LD) -r" to merge these files into one .o file
+ with the name $(O_TARGET). This $(O_TARGET) name also appears
+ in the top Makefile.
+
+ The order of files in $(O_OBJS) and $(OX_OBJS) is significant.
+ All $(OX_OBJS) files come first, in the order listed, followed by
+ all $(O_OBJS) files, in the order listed. Duplicates in the lists
+ are allowed: the first instance will be linked into $(O_TARGET)
+ and succeeding instances will be ignored. (Note: Rules.make may
+ emit warning messages for duplicates, but this is harmless).
+
+ Example:
+
+ # arch/alpha/kernel/Makefile
+ O_TARGET := kernel.o
+ O_OBJS := entry.o traps.o process.o osf_sys.o irq.o \
+ irq_alpha.o signal.o setup.o ptrace.o time.o \
+ semaphore.o
+ OX_OBJS := alpha_ksyms.o
+
+ ifdef CONFIG_SMP
+ O_OBJS += smp.o irq_smp.o
+ endif
+
+ ifdef CONFIG_PCI
+ O_OBJS += pci.o pci_iommu.o
+ endif
+
+ Even if a subdirectory Makefile has an $(O_TARGET), the .config
+ options still control whether or not its $(O_TARGET) goes into
+ vmlinux. See the $(M_OBJS) example below.
+
+
+
+--- 7.3 Library file goals
+
+ L_TARGET, L_OBJS, LX_OBJS
+
+ These names are similar to the O_* names. Once again, $(L_OBJS)
+ and $(LX_OBJS) specify object files for the resident kernel;
+ once again, the lists depend on the current configuration; and
+ once again, the files that call EXPORT_SYMBOL go on the "X" list.
+
+ The difference is that "L" stands for "Library". After making
+ $(L_OBJS) and $(LX_OBJS), Rules.make uses the "$(AR) rcs" command
+ to put these files into an archive file (a library) with the
+ name $(L_TARGET). This name also appears in the top Makefile.
+
+ Example:
+
+ # arch/i386/lib/Makefile
+ L_TARGET = lib.a
+ L_OBJS = checksum.o old-checksum.o delay.o \
+ usercopy.o getuser.o putuser.o iodebug.o
+
+ ifdef CONFIG_X86_USE_3DNOW
+ L_OBJS += mmx.o
+ endif
+
+ ifdef CONFIG_HAVE_DEC_LOCK
+ L_OBJS += dec_and_lock.o
+ endif
+
+ The order of files in $(L_OBJS) and $(LX_OBJS) is not significant.
+ Duplicates in the lists are allowed. (Note: Rules.make may emit
+ warning messages for duplicates, but this is harmless).
+
+ A subdirectory Makefile can specify either an $(O_TARGET),
+ an $(L_TARGET), or both. Here is a discussion of the differences.
+
+ All of the files in an $(O_TARGET) are guaranteed to appear in
+ the resident vmlinux image. In an $(L_TARGET), only the files
+ that satisfy undefined symbol references from other files will
+ appear in vmlinux.
+
+ In a conventional link process, the linker processes some
+ object files and creates a list of unresolved external symbols.
+ The linker then looks in a set of libraries to resolve these
+ symbols. Indeed, the Linux kernel used to be linked this way,
+ with the bulk of the code stored in libraries.
+
+ But vmlinux contains two types of object files that cannot be
+ fetched out of libraries this way:
+
+ (1) object files that are purely EXPORT_SYMBOL definitions
+ (2) object files that use module_init or __initcall initializers
+ (instead of an initialization routine called externally)
+
+ These files contain autonomous initializer sections which provide
+ code and data without being explicitly called. If these files
+ were stored in $(L_TARGET) libraries, the linker would fail
+ to include them in vmlinux. Thus, most subdirectory Makefiles
+ specify an $(O_TARGET) and do not use $(L_TARGET).
+
+ Other considerations: $(O_TARGET) leads to faster re-link times
+ during development activity, but $(L_TARGET) gives better error
+ messages for unresolved symbols.
+
+
+
+--- 7.4 Loadable module goals
+
+ M_OBJS, MX_OBJS
+
+ $(M_OBJS) and $(MX_OBJS) specify object files which are built
+ as loadable kernel modules. As usual, the "X" in $(MX_OBJS)
+ stands for "eXport"; source files that use EXPORT_SYMBOL must
+ appear on an $(MX_OBJS) list.
+
+ A module may be built from one source file or several source
+ files. In the case of one source file, the subdirectory
+ Makefile simply adds the file to either $(M_OBJS) or $(MX_OBJS),
+ as appropriate.
+
+ Example:
+
+ # drivers/net/irda/Makefile
+ ifeq ($(CONFIG_IRTTY_SIR),y)
+ L_OBJS += irtty.o
+ else
+ ifeq ($(CONFIG_IRTTY_SIR),m)
+ M_OBJS += irtty.o
+ endif
+ endif
+
+ ifeq ($(CONFIG_IRPORT_SIR),y)
+ LX_OBJS += irport.o
+ else
+ ifeq ($(CONFIG_IRPORT_SIR),m)
+ MX_OBJS += irport.o
+ endif
+ endif
+
+ If a kernel module is built from several source files, there
+ are two ways to specify the set of source files. One way is to
+ build a single module for the entire subdirectory. This way is
+ popular in the file system and network protocol stacks.
+
+ Example:
+
+ # fs/ext2/Makefile
+ O_TARGET := ext2.o
+ O_OBJS := acl.o balloc.o bitmap.o dir.o file.o fsync.o \
+ ialloc.o inode.o ioctl.o namei.o super.o symlink.o \
+ truncate.o
+ M_OBJS := $(O_TARGET)
+
+ In this example, the module name will be ext2.o. Because this
+ file has the same name has $(O_TARGET), Rules.make will use
+ the $(O_TARGET) rule to build ext2.o: it will run "$(LD) -r"
+ on the list of $(O_OBJS) files.
+
+ Note that this subdirectory Makefile defines both an $(O_TARGET)
+ and an $(M_OBJS). The control code, up in fs/Makefile, will
+ select between these two. If CONFIG_EXT2_FS=y, then fs/Makefile
+ will build $(O_TARGET); and if CONFIG_EXT_FS=m, then fs/Makefile
+ will build $(M_OBJS) instead. (Yes, this is a little delicate
+ and a little confusing).
+
+
+
+--- 7.5 Multi-part modules
+
+ MI_OBJS, MIX_OBJS
+
+ Some kernel modules are composed of several object files
+ linked together, but do not include every object file in their
+ subdirectory. $(MI_OBJS) and $(MIX_OBJS) are for this case.
+
+ "M" stands for Module.
+ "I" stands for Intermediate.
+ "X", as usual, stands for "eXport symbol".
+
+ Example:
+
+ # drivers/sound/Makefile
+ gus-objs := gus_card.o gus_midi.o gus_vol.o gus_wave.o ics2101.o
+ pas2-objs := pas2_card.o pas2_midi.o pas2_mixer.o pas2_pcm.o
+ sb-objs := sb_card.o
+
+ gus.o: $(gus-objs)
+ $(LD) -r -o $@ $(gus-objs)
+
+ pas2.o: $(pas2-objs)
+ $(LD) -r -o $@ $(pas2-objs)
+
+ sb.o: $(sb-objs)
+ $(LD) -r -o $@ $(sb-objs)
+
+ The kernel modules gus.o, pas2.o, and sb.o are the *composite
+ files*. The object files gus_card.o, gus_midi.o, gus_vol.o,
+ gus_wave.o, ics2101.o, pas2_card.o, pas2_midi.o, pas2_mixer.o,
+ pas2_pcm.o, and sb_card.o are *component files*. The component
+ files are also called *intermediate files*.
+
+ In another part of drivers/sound/Makefile (not shown), all of
+ the component files are split out. For the resident drivers:
+ the component object files go onto $(O_OBJS) and $(OX_OBJS)
+ lists, depending on whether they export symbols or not; and the
+ composite files are never built. For the kernel modules: the
+ component object files go onto $(MI_OBJS) and $(MIX_OBJS);
+ the composite files go onto $(M_OBJS).
+
+ The subdirectory Makefile must also specify the linking rule
+ for a multi-object-file module:
+
+ # drivers/sound/Makefile
+
+ gus.o: $(gus-objs)
+ $(LD) -r -o $@ $(gus-objs)
+
+ pas2.o: $(pas2-objs)
+ $(LD) -r -o $@ $(pas2-objs)
+
+ sb.o: $(sb-objs)
+ $(LD) -r -o $@ $(sb-objs)
+
+
+
+--- 7.6 Compilation flags
+
+ EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS
+
+ $(EXTRA_CFLAGS) specifies options for compiling C files with
+ $(CC). The options in this variable apply to all $(CC) commands
+ for files in the current directory.
+
+ Example:
+
+ # drivers/sound/emu10k1/Makefile
+ EXTRA_CFLAGS += -I.
+ ifdef DEBUG
+ EXTRA_CFLAGS += -DEMU10K1_DEBUG
+ endif
+
+ $(EXTRA_CFLAGS) does not apply to subdirectories of the current
+ directory. Also, it does not apply to files compiled with
+ $(HOSTCC).
+
+ This variable is necessary because the top Makefile owns the
+ variable $(CFLAGS) and uses it for compilation flags for the
+ entire tree.
+
+ $(EXTRA_AFLAGS) is a similar string for per-directory options
+ when compiling assembly language source.
+
+ Example: at the time of writing, there were no examples of
+ $(EXTRA_AFLAGS) in the kernel corpus.
+
+ $(EXTRA_LDFLAGS) and $(EXTRA_ARFLAGS) are similar strings for
+ per-directory options to $(LD) and $(AR).
+
+ Example: at the time of writing, there were no examples of
+ $(EXTRA_LDFLAGS) or $(EXTRA_ARFLAGS) in the kernel corpus.
+
+ CFLAGS_$@, AFLAGS_$@
+
+ $(CFLAGS_$@) specifies per-file options for $(CC). The $@
+ part has a literal value which specifies the file that it's for.
+
+ Example:
+
+ # drivers/scsi/Makefile
+ CFLAGS_aha152x.o = -DAHA152X_STAT -DAUTOCONF
+ CFLAGS_gdth.o = # -DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ \
+ -DGDTH_STATISTICS
+ CFLAGS_seagate.o = -DARBITRATE -DPARITY -DSEAGATE_USE_ASM
+
+ These three lines specify compilation flags for aha152x.o,
+ gdth.o, and seagate.o
+
+ $(AFLAGS_$@) is a similar feature for source files in assembly
+ languages.
+
+ Example:
+
+ # arch/arm/kernel/Makefile
+ AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -traditional
+ AFLAGS_head-armo.o := -DTEXTADDR=$(TEXTADDR) -traditional
+
+ Rules.make has a feature where an object file depends on the
+ value of $(CFLAGS_$@) that was used to compile it. (It also
+ depends on the values of $(CFLAGS) and $(EXTRA_CFLAGS)). Thus,
+ if you change the value of $(CFLAGS_$@) for a file, either by
+ editing the Makefile or overriding the value some other way,
+ Rules.make will do the right thing and re-compile your source
+ file with the new options.
+
+ Note: because of a deficiency in Rules.make, assembly language
+ files do not have flag dependencies. If you edit $(AFLAGS_$@)
+ for such a file, you will have to remove the object file in order
+ to re-build from source.
+
+ LD_RFLAG
+
+ This variable is used, but never defined. It appears to be a
+ vestige of some abandoned experiment.
+
+
+
+--- 7.7 Miscellaneous variables
+
+ IGNORE_FLAGS_OBJS
+
+ $(IGNORE_FLAGS_OBJS) is a list of object files which will not have
+ their flag dependencies automatically tracked. This is a hackish
+ feature, used to kludge around a problem in the implementation
+ of flag dependencies. (The problem is that flag dependencies
+ assume that a %.o file is built from a matching %.S or %.c file.
+ This is sometimes not true).
+
+ USE_STANDARD_AS_RULE
+
+ This is a transition variable. If $(USE_STANDARD_AS_RULE)
+ is defined, then Rules.make will provide standard rules for
+ assembling %.S files into %.o files or %.s files (%.s files
+ are useful only to developers).
+
+ If $(USE_STANDARD_AS_RULE) is not defined, then Rules.make
+ will not provide these standard rules. In this case, the
+ subdirectory Makefile must provide its own private rules for
+ assembling %.S files.
+
+ In the past, all Makefiles provided private %.S rules. Newer
+ Makefiles should define USE_STANDARD_AS_RULE and use the standard
+ Rules.make rules. As soon as all the Makefiles across all
+ architectures have been converted to USE_STANDARD_AS_RULE, then
+ Rules.make can drop the conditional test on USE_STANDARD_AS_RULE.
+ After that, all the other Makefiles can drop the definition of
+ USE_STANDARD_AS_RULE.
+
+
+
+=== 8 New-style variables
+
+The "new-style variables" are simpler and more powerful than the
+"old-style variables". As a result, many subdirectory Makefiles shrank
+more than 60%. This author hopes that, in time, all arch Makefiles and
+subdirectory Makefiles will convert to the new style.
+
+Rules.make does not understand new-style variables. Thus, each new-style
+Makefile has a section of boilerplate code that converts the new-style
+variables into old-style variables. There is also some mixing, where
+people define most variables using "new style" but then fall back to
+"old style" for a few lines.
+
+ obj-y obj-m obj-n obj-
+
+ These variables replace $(O_OBJS), $(OX_OBJS), $(M_OBJS),
+ and $(MX_OBJS).
+
+ Example:
+
+ # drivers/block/Makefile
+ obj-$(CONFIG_MAC_FLOPPY) += swim3.o
+ obj-$(CONFIG_BLK_DEV_FD) += floppy.o
+ obj-$(CONFIG_AMIGA_FLOPPY) += amiflop.o
+ obj-$(CONFIG_ATARI_FLOPPY) += ataflop.o
+
+ Notice the use of $(CONFIG_...) substitutions on the left hand
+ side of an assignment operator. This gives Gnu Make the power
+ of associative indexing! Each of these assignments replaces
+ eight lines of code in an old-style Makefile.
+
+ After executing all of the assignments, the subdirectory
+ Makefile has built up four lists: $(obj-y), $(obj-m), $(obj-n),
+ and $(obj-).
+
+ $(obj-y) is a list of files to include in vmlinux.
+ $(obj-m) is a list of files to build as single-file modules.
+ $(obj-n) and $(obj-) are ignored.
+
+ Each list may contain duplicates items; duplicates are
+ automatically removed later. Also, if a file appears in both
+ $(obj-y) and $(obj-m), it will automatically be removed from
+ the $(obj-m) list.
+
+ Example:
+
+ # drivers/net/Makefile
+
+ ...
+ obj-$(CONFIG_OAKNET) += oaknet.o 8390.o
+ ...
+ obj-$(CONFIG_NE2K_PCI) += ne2k-pci.o 8390.o
+ ...
+ obj-$(CONFIG_STNIC) += stnic.o 8390.o
+ ...
+ obj-$(CONFIG_MAC8390) += daynaport.o 8390.o
+ ...
+
+ In this example, four different drivers require the code in
+ 8390.o. If one or more of these four drivers are built into
+ vmlinux, then 8390.o will also be built into vmlinux, and will
+ *not* be built as a module -- even if another driver which needs
+ 8390.o is built as a module. (The modular driver is able to
+ use services of the 8390.o code in the resident vmlinux image).
+
+ export-objs
+
+ $(export-objs) is a list of all the files in the subdirectory
+ which potentially export symbols. The canonical way to construct
+ this list is:
+
+ grep -l EXPORT_SYMBOL *.c
+
+ (but watch out for sneaky files that call EXPORT_SYMBOL from an
+ included header file!)
+
+ This is a potential list, independent of the kernel configuration.
+ All files that export symbols go into $(export-objs). The
+ boilerplate code then uses the $(export-objs) list to separate
+ the real file lists into $(*_OBJS) and $(*X_OBJS).
+
+ Experience has shown that maintaining the proper X's in an
+ old-style Makefile is difficult and error-prone. Maintaining the
+ $(export-objs) list in a new-style Makefile is simpler and easier
+ to audit.
+
+ list-multi
+ $(foo)-objs
+
+ Some kernel modules are composed of multiple object files linked
+ together. $(list-multi) is a list of such kernel modules.
+ This is a static list; it does not depend on the configuration.
+
+ For each kernel module in $(list-multi) there is another list
+ of all the object files which make up that module. For a kernel
+ module named foo.o, its object file list is foo-objs.
+
+ Example:
+
+ # drivers/scsi/Makefile
+ list-multi := scsi_mod.o sr_mod.o initio.o a100u2w.o
+
+ ...
+
+ scsi_mod-objs := hosts.o scsi.o scsi_ioctl.o constants.o \
+ scsicam.o scsi_proc.o scsi_error.o \
+ scsi_obsolete.o scsi_queue.o scsi_lib.o \
+ scsi_merge.o scsi_dma.o scsi_scan.o \
+ scsi_syms.o
+ sr_mod-objs := sr.o sr_ioctl.o sr_vendor.o
+ initio-objs := ini9100u.o i91uscsi.o
+ a100u2w-objs := inia100.o i60uscsi.o
+
+ The subdirectory Makefile puts the modules onto obj-* lists in
+ the usual configuration-dependent way:
+
+ obj-$(CONFIG_SCSI) += scsi_mod.o
+ obj-$(CONFIG_BLK_DEV_SR) += sr_mod.o
+ obj-$(CONFIG_SCSI_INITIO) += initio.o
+ obj-$(CONFIG_SCSI_INIA100) += a100u2w.o
+
+ Suppose that CONFIG_SCSI=y. Then vmlinux needs to link in all
+ 14 components of scsi_mod.o, so these components will go onto
+ $(O_OBJS) and $(OX_OBJS). The composite file scsi_mod.o will
+ never be created. The boilerplate conversion code produces this
+ result with a few lines of list processing commands.
+
+ Suppose that CONFIG_BLK_DEV_SR=m. Then the 3 components
+ of sr_mod.o will linked together with "$(LD) -r" to make the
+ kernel module sr_mod.o, so these 3 components need to go onto
+ the $(MI_OBJS) and $(MIX_OBJS) lists; the composite file sr_mod.o
+ goes onto $(M_OBJS). The boilerplate conversion code takes care
+ of this, too.
+
+ And suppose CONFIG_SCSI_INITIO=n. Then initio.o goes onto the
+ $(obj-n) list and that's the end of it. Its component files
+ are not compiled, and the composite file is not created.
+
+ Finally, the subdirectory Makefile needs to define rules to
+ build each multi-object kernel module from its component list.
+ Example:
+
+ # drivers/scsi/Makefile
+
+ scsi_mod.o: $(scsi_mod-objs)
+ $(LD) -r -o $@ $(scsi_mod-objs)
+
+ sr_mod.o: $(sr_mod-objs)
+ $(LD) -r -o $@ $(sr_mod-objs)
+
+ initio.o: $(initio-objs)
+ $(LD) -r -o $@ $(initio-objs)
+
+ a100u2w.o: $(a100u2w-objs)
+ $(LD) -r -o $@ $(a100u2w-objs)
+
+ These rules are very regular; it would be nice for the boilerplate
+ code or Rules.make to synthesize these rules automatically.
+ But until that happens, the subdirectory Makefile needs to define
+ these rules explicitly.
+
+ subdir-y subdir-m subdir-n subdir-
+
+ These variables replace $(ALL_SUB_DIRS), $(SUB_DIRS) and
+ $(MOD_SUB_DIRS).
+
+ Example:
+
+ # drivers/Makefile
+ subdir-$(CONFIG_PCI) += pci
+ subdir-$(CONFIG_PCMCIA) += pcmcia
+ subdir-$(CONFIG_MTD) += mtd
+ subdir-$(CONFIG_SBUS) += sbus
+
+ These variables work similar to obj-*, but are used for
+ subdirectories instead of object files.
+
+ After executing all of the assignments, the subdirectory
+ Makefile has built up four lists: $(subdir-y), $(subdir-m),
+ $(subdir-n), and $(subdir-).
+
+ $(subdir-y) is a list of directories that should be entered
+ for making vmlinux.
+ $(subdir-m) is a list of directories that should be entered
+ for making modules.
+ $(subdir-n) and $(subdir-) are only used for collecting a list
+ of all subdirectories of this directory.
+
+ Each list besides subdir-y may contain duplicates items; duplicates
+ are automatically removed later.
+
+ mod-subdirs
+
+ $(mod-subdirs) is a list of all the the subdirectories that should
+ be added to $(subdir-m), too if they appear in $(subdir-y)
+
+ Example:
+
+ # fs/Makefile
+ mod-subdirs := nls
+
+ This means nls should be added to (subdir-y) and $(subdir-m) if
+ CONFIG_NFS = y.
+
+
+=== 9 Compatibility with Linux Kernel 2.2
+
+Most of the information in this document also applies to 2.2, although
+there is no indication of which things have changed when. Here are some
+hints for writing subdirectory Makefiles that are compatible with Linux
+kernel 2.2.
+
+You can write either an old-style Makefile or a new-style Makefile
+with a boilerplate adapter section. See the 2.2 version of
+drivers/sound/Makefile for a copy of the boilerplate code.
+
+In 2.2, Rules.make makes a distinction between $(MOD_SUB_DIRS)
+and $(MOD_IN_SUB_DIRS). If you have a single directory with no
+subdirectories, this will not matter to you. If you have a whole
+tree, then you need to know the difference between $(MOD_SUB_DIRS)
+and $(MOD_IN_SUB_DIRS). For example code: $(MOD_SUB_DIRS) is used
+extensively in fs/Makefile; $(MOD_IN_SUB_DIRS) is used extensively in
+drivers/net/Makefile.
+
+If you are already using MOD_LIST_NAME, go ahead and keep using it.
+If you don't already have a MOD_LIST_NAME, go ahead and keep not using
+one; your module will be a 'misc' module in 2.2.
+
+Assembly language rules were a mess in 2.2. If you have assembly language
+files, this author recommends that you write your own explicit rules
+for each file by name.
+
+
+
+=== 10 Credits
+
+Thanks to the members of the linux-kbuild mailing list for reviewing
+drafts of this document, with particular thanks to Peter Samuelson
+and Thomas Molina.