shithub: mc

Download patch

ref: 4b5aa67999b756801a310fd0491044e1781220dc
parent: d7456331d1e9a37c00ffb481de9af15104e7d9db
author: Ori Bernstein <[email protected]>
date: Mon Aug 18 21:01:53 EDT 2014

Document the build system.

    And then make c.mk match the docs better.

--- /dev/null
+++ b/doc/buildsys.txt
@@ -1,0 +1,229 @@
+                The Myrddin Compiler Build System
+                            Aug 2012
+                          Ori Bernstein
+
+TABLE OF CONTENTS:
+
+    0. DEPENDENCIES
+    1. USAGE
+    2. CREATING MAKEFILES
+        2.1. Example
+        2.2. Targets
+        2.3. Variables
+    3. CONFIGURE SCRIPTS
+    4. INTERNALS
+        4.1: Automatic dependency generation
+        4.2: Automatic dependency generation
+    4. BUGS
+
+0. DEPENDENCIES:
+
+    c.mk depends on GNU Make, using it's builtins for a
+    number of variable expansions. On systems where the default make
+    program is not GNU Make, please run 'gmake' or similar. Otherwise,
+    you will end up with obscure failures. A method of making this
+    script portable would be very welcome.
+
+    Beyond that, all that is needed to run this is a portable POSIX
+    system.
+
+1. USAGE:
+
+    run 'make' and the default targets will be built.  The usual targets
+    are supported. That means:
+
+        all:
+            Builds all targets. This will build every target
+            specified in the makefile, recurse into subdirectories,
+            and do everything needed. If dependencies are in other
+            directories, it will 'cd' into those directories and
+            call make as needed.
+
+        target-name:
+            This builds the specified target and it's dependencies.
+
+        install:
+            This installs the software to the prefix specified in the
+            configuration, or /usr/local if there is nothing more
+            specific specified.
+
+            If DESTDIR is set, it will install the files to the prefix
+            $(DESTDIR)/$(INST_ROOT), although all paths will still be
+            relative to $(INST_ROOT). This is for packaging, and matches
+            the behavior of automake.
+
+        uninstall:
+            This uninstalls the software, removing all files installed
+            by 'make install'.
+
+        clean:
+            This removes all temporary files created by the build
+            process, allowing a fresh build to occur.
+
+    When a target is not specified, 'all' is assumed.
+
+2. CREATING MAKEFILES:
+
+    c.mk is only a set of rules to make common actions simple. There is
+    nothing preventing custom make from being added for 
+
+    2.1: Example
+
+        c.mk is designed around the convention of having
+        one primary target per directory. This primary target can be
+        either a binary or a library, for the most part, although
+        there is nothing that prevents you from defining your own
+        primary targets.
+
+        So, let's dissect an example makefile:
+
+            BIN = mybinary
+            INSTBIN = $(BIN)
+            OBJ = foo.o bar.o baz.o
+
+            include config.mk
+            include c.mk
+
+            custom-rule: custom-dep
+                    insult-your-momma
+
+    2.2: Targets
+
+        Currently, there are several targets supported by c.mk
+
+            SUB
+                This target will recurse into the subdirectories
+                listed, building everything in them.
+
+            BIN
+                This target will build a single binary, and will
+                not install it. It uses $(OBJ) as its input.
+
+            LIB
+                This target will build a single static library, and will
+                not install it. It uses $(OBJ) as its input. It
+                conflicts with $(BIN)
+
+            INSTBIN
+                Same as BIN, but installed to $(INST_ROOT)/bin
+
+            INSTLIB
+                Same as LIB, but installed to $(INST_ROOT)/lib
+
+            INSTHDR
+                Used for defining headers to install to system include
+                directories. Does not generate headers. Takes multiple
+                arguments and installs them to $(INST_ROOT)/include
+
+            INSTPKG
+                Used for defining pkgconfig files to install to
+                system pkgconfig directories. Does not generate
+                them from inputs. Takes multiple arguments and
+                installs them to $(INST_ROOT)/lib/pkgconfig.
+
+            INSTMAN
+                Used for defining manpage files to install to
+                system man directories. Does not generate
+                them from inputs. Takes multiple arguments and
+                installs them to $(INST_ROOT)/lib/pkgconfig.
+
+    2.3: Variables:
+
+        c.mk respects the usual environment variables. If you set
+        CFLAGS, it will compile with those flags. If you set LDFLAGS,
+        it will link with those flags. It also supports a number of
+        extra configuration variables:
+        
+            EXTRA
+                Dependencies that should be built when 'make all' is
+                run. These can be, for example, additional binaries,
+                rules, etc.
+
+            EXTRADEP
+                Dependencies that should be added when compiling a
+                BIN or LIB target
+            
+            GENHDR
+                Headers that are generated for consumption by C code.
+
+            CLEAN
+                Files that should be removed when runngng
+
+            INCS
+                Include paths. These are passed to the C compiler when
+                building C code.
+
+            DEPS
+                Paths to local dependencies, such as convenience
+                libraries. This is a relative path to a libfoo.a
+                file. All libraries that are depended on in this
+                manner will be automatically built before they
+                are used.
+
+                The path to them will also be added to the include
+                path if needed, and they will be linked in to binaries
+                that are built.
+
+3. CONFIGURE SCRIPTS:
+
+    This is not mandatory, although convention requests it. This is
+    simply a shell script that will probe the system, and generate
+    the 'config.mk' file, This can be generated a number of ways.
+
+    Although Myrddin doesn't currently use it, autoconf is a perfectly
+    viable method of generating a config.mk setup. Myrddin currently
+    uses a simple script that mocks autotools, instead.
+
+4. INTERNALS:
+
+    c.mk is a relatively simple set of commands. It defines make targets
+    for the various default rules, and uses the variables described
+    above to substitute into them, with fairly traditional structure.
+
+    It begins by setting the default goal (ie, the target that is built
+    when 'make' is run with no arguments) to 'all', and proceeds to
+    define a few internal variables.
+
+    4.1: Automatic dependency generation
+
+        _DEPSDIR and _DEPS are defined early on. _DEPSDIR is simply
+        a directory named '.deps', which is created before any
+        compilation occurs, and contains the dependency makefile
+        fragments that GCC generates.
+
+        _DEPS is the list of dependency filename fragments, generated
+        by substituting '.deps/$FILEBASE.d' for every .o file define
+        in $(OBJS)
+
+        CFLAGS also unconditionally has the required flags for
+        dependency generation added to the compiler command, and
+        later on, the dependencies are included into the makefile
+        if they exist.
+
+    4.2:
+
+        The general target rules are defined. There are many for
+        loops and bits of shell scripting to support them, but the
+        pattern is fairly basic.
+
+            well-known-target: prerequisites
+                    do-commands
+    
+        Some of the commands are fairly long. For example, the install
+        and uninstall targets will loop through a list of files for each
+        of the main target types.
+
+    is simply '.deps', and is the location where GCC's generated
+    dependency information goes. _DEPS
+    
+4. BUGS:
+
+    - Currently, 'make uninstall' does not remove empty directories that
+      it created.
+
+    - You can define BIN/INSTBIN, LIB/INSTLIB in a way that does not
+      match. We do not error on this.
+
+    - Well known targets are defined relatively inflexibly. It should
+      be easier to include modules and have them add on to the base
+      rule set.
--- a/mk/c.mk
+++ b/mk/c.mk
@@ -6,8 +6,7 @@
 _LIBINCPATHS=$(addprefix -I, $(dir $(DEPS)))
 _LIBPATHS=$(addprefix -l, $(patsubst lib%.a,%,$(notdir $(DEPS))))
 
-CFLAGS += -Wall -Werror -Wextra -Wno-unused-parameter -Wno-missing-field-initializers
-CFLAGS += -g
+CFLAGS ?= -Wall -Werror -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -g
 CFLAGS += -MMD -MP -MF ${_DEPSDIR}/$(subst /,-,$*).d
 
 LIB ?= $(INSTLIB)
@@ -110,11 +109,6 @@
 		echo rm -f $$i $(abspath $(DESTDIR)/$(INST_ROOT)/share/man/man$${sect}/$$i); \
 		rm -f $(abspath $(DESTDIR)/$(INST_ROOT)/share/man/man$${sect}/$$i); \
 	done
-
-
-clean-backups:
-	find ./ -name .*.sw* -exec rm -f {} \;
-	find ./ -name *.bak -exec rm -f {} \;
 
 %.o: %.c $(GENHDR) .deps
 	$(CC) -c $(CFLAGS) $(_LIBINCPATHS) $<