diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-10-05 01:18:40 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-10-05 01:18:40 +0000 |
commit | 012bb3e61e5eced6c610f9e036372bf0c8def2d1 (patch) | |
tree | 87efc733f9b164e8c85c0336f92c8fb7eff6d183 /Documentation/kbuild | |
parent | 625a1589d3d6464b5d90b8a0918789e3afffd220 (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-INDEX | 2 | ||||
-rw-r--r-- | Documentation/kbuild/makefiles.txt | 1226 |
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. |