aboutsummaryrefslogtreecommitdiff
path: root/doc/Build-System.rest
diff options
context:
space:
mode:
Diffstat (limited to 'doc/Build-System.rest')
-rw-r--r--doc/Build-System.rest218
1 files changed, 218 insertions, 0 deletions
diff --git a/doc/Build-System.rest b/doc/Build-System.rest
new file mode 100644
index 000000000..e078fa7f7
--- /dev/null
+++ b/doc/Build-System.rest
@@ -0,0 +1,218 @@
+Short introduction into LTP build system
+========================================
+
+******************************************************************************
+The following document briefly describes the steps and methodologies used for
+the new and improved Makefile system.
+
+Changelog:
+
+ * Initial version: Ngie Cooper <yaneurabeya@gmail.com>
+ * Reformated for asciidoc: Cyril Hrubis <chrubis@suse.cz>
+******************************************************************************
+
+The Problem
+-----------
+
+The problem with the old Makefile system is that it was very difficult to
+maintain and it lacked any sense of formal structure, thus developing for LTP
+and including new targets was more difficult than it should have been
+(maintenance). Furthermore, proper option-based cross-compilation was
+impossible due to the fact that the Makefiles didn't support a prefixing
+system, and the appropriate implicit / static rules hadn't been configured to
+compile into multiple object directories for out-of-tree build support (ease of
+use / functionality). Finally, there wasn't a means to setup dependencies
+between components, such that if a component required libltp.a in order to
+compile, it would go off and compile libltp.a first (ease of use).
+
+These items needed to be fixed to reduce maintenance nightmares for the
+development community contributing to LTP, and the project maintainers.
+
+Design
+------
+
+The system was designed such that including a single GNU Makefile compatible
+set in each new directory component is all that's essentially required to
+build the system.
+
+Say you had a directory like the following (with .c files in them which
+directly tie into applications, e.g. baz.c -> baz):
+
+-------------------------------------------------------------------------------
+.../foo/
+ |--> Makefile
+ |
+ --> bar/
+ |
+ --> Makefile
+ |
+ --> baz.c
+-------------------------------------------------------------------------------
+
+Here's an example of how one would accomplish that:
+
+-------------------------------------------------------------------------------
+.../foo/Makefile:
+#
+# Copyright disclaimer goes here -- please use GPLv2.
+#
+
+top_srcdir ?= ..
+
+include $(top_srcdir)/include/mk/env_pre.mk
+include $(top_srcdir)/include/mk/generic_trunk_target.mk
+
+.../foo/bar/Makefile:
+#
+# Copyright disclaimer goes here -- please use GPLv2.
+#
+
+top_srcdir ?= ..
+
+include $(top_srcdir)/include/mk/env_pre.mk
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
+-------------------------------------------------------------------------------
+
+Kernel Modules
+--------------
+
+Some of the tests need to build kernel modules, happily LTP has
+infrastructure for this.
+
+-------------------------------------------------------------------------------
+ifneq ($(KERNELRELEASE),)
+
+obj-m := module01.o
+
+else
+
+top_srcdir ?= ../../../..
+include $(top_srcdir)/include/mk/testcases.mk
+
+REQ_VERSION_MAJOR := 2
+REQ_VERSION_PATCH := 6
+MAKE_TARGETS := test01 test02 module01.ko
+
+include $(top_srcdir)/include/mk/module.mk
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
+
+endif
+-------------------------------------------------------------------------------
+
+This is example Makefile that allows you build kernel modules inside of LTP.
+The prerequisites for the build are detected by the 'configure' script.
+
+The 'REQ_VERSION_MAJOR' and 'REQ_VERSION_PATCH' describe minimal kernel
+version for which the build system tries to build the module.
+
+The buildsystem is also forward compatible with changes in Linux kernel
+internal API so that if module fails to build the failure is ignored both on
+build and installation. If the userspace counterpart of the test fails to load
+the module because the file does not exists, the test is skipped.
+
+Note the 'ifneq($(KERNELRELEASE),)', the reason it's there is that the
+Makefile is executed twice, once by LTP build system and once by kernel
+kbuild, see 'Documentation/kbuild/modules.txt' in the Linux kernel tree for
+details on external module build.
+
+Make Rules and Make Variables
+-----------------------------
+
+When using make rules, avoid writing ad hoc rules like:
+
+-------------------------------------------------------------------------------
+[prog]: [dependencies]
+ cc -I../../include $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(LDLIBS) \
+ -o [prog] [dependencies]
+-------------------------------------------------------------------------------
+
+etc. This makes cross-compilation and determinism difficult, if not impossible.
+Besides, implicit rules are your friends and as long as you use `MAKEOPTS=;' in
+the top-level caller (or do $(subst r,$(MAKEOPTS)) to remove -r), the compile
+will complete successfully, assuming all other prerequisites have been
+fulfilled (libraries, headers, etc).
+
+-------------------------------------------------------------------------------
+$(AR) : The library archiver.
+
+$(CC) : The system C compiler.
+
+$(CPP) : The system C preprocessor.
+
+$(CFLAGS) : C compiler flags.
+
+$(CPPFLAGS) : Preprocessor flags, e.g. -I arguments.
+
+$(DEBUG_CFLAGS) : Debug flags to pass to $(CC), -g, etc.
+
+$(KVM_LD) : Special linker for wrapping KVM payload binaries
+ into linkable object files. Defaults to $(LD).
+ Change this variable if the KVM Makefile fails
+ to build files named *-payload.o.
+
+$(LD) : The system linker (typically $(CC), but not
+ necessarily).
+
+$(LDFLAGS) : What to pass in to the linker, including -L arguments
+ and other ld arguments, apart from -l library
+ includes (see $(LDLIBS)).
+
+ This should be done in the $(CC) args passing style
+ when LD := $(CC), e.g. `-Wl,-foo', as opposed to
+ `-foo'.
+
+$(LDLIBS) : Libraries to pass to the linker (e.g. -lltp, etc).
+
+$(LTPLDLIBS) : LTP internal libraries i.e. these in libs/ directory.
+
+$(OPT_CFLAGS) : Optimization flags to pass into the C compiler, -O2,
+ etc. If you specify -O2 or higher, you should also
+ specify -fno-strict-aliasing, because of gcc
+ fstrict-aliasing optimization bugs in the tree
+ optimizer. Search for `fstrict-aliasing optimization
+ bug' with your favorite search engine.
+
+ Examples of more recent bugs:
+ 1. tree-optimization/17510
+ 2. tree-optimization/39100
+
+ Various bugs have occurred in the past due to buggy
+ logic in the tree-optimization portion of the gcc
+ compiler, from 3.3.x to 4.4.
+
+$(RANLIB) : What to run after archiving a library.
+
+$(WCFLAGS) : Warning flags to pass to $(CC), e.g. -Werror,
+ -Wall, etc.
+-------------------------------------------------------------------------------
+
+Make System Variables
+---------------------
+
+A series of variables are used within the make system that direct what actions
+need to be taken. Rather than me listing the variables here, please with their
+intended uses, please refer to the comments contained in
++.../include/mk/env_pre.mk+.
+
+Guidelines and Recommendations
+------------------------------
+
+Of course, the GNU Make manual is key to understanding the Make system, but
+here are the following sections and chapters I suggest reviewing:
+
+link:http://www.gnu.org/software/make/manual/make.html#Implicit-Rules[Implicit Rules]
+link:http://www.gnu.org/software/make/manual/make.html#Using-Variables[Variables and Expansion]
+link:http://www.gnu.org/software/make/manual/make.html#Origin-Function[Origin Use]
+link:http://www.gnu.org/software/make/manual/make.html#Directory-Search[VPath Use]
+
+Before Committing
+-----------------
+
+One should rebuild from scratch before committing. Please see INSTALL for more
+details.
+
+Other Errata
+------------
+
+Please see TODO for any issues related to the Makefile infrastructure, and
+build structure / source tree in general.