156 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
lw-build-system Instructions
 | 
						|
========================================================================
 | 
						|
 | 
						|
Introduction
 | 
						|
------------
 | 
						|
 | 
						|
The build system is a set of shell scripts used to build various types
 | 
						|
of object file. Each project consists of one or more modules. Source
 | 
						|
files (committed to the repository) live in "src", with one subdirectory
 | 
						|
per module. Object files (or other volatile output) lives in "obj".
 | 
						|
Cleaning is simply a case of deleting the "obj" directory.
 | 
						|
 | 
						|
Only a minimal part of the build system is committed to the repository
 | 
						|
for each project; enough to build the project if it is checked out or
 | 
						|
downloaded as a tarball. The rest of the build system (needed for
 | 
						|
actual development) is installed as symlinks, so that changes to the
 | 
						|
build system do not necessarily require changes to the repository.
 | 
						|
 | 
						|
Creating a New Project
 | 
						|
----------------------
 | 
						|
 | 
						|
Instantiating a new project is done with `lw-build-system/create.sh'.
 | 
						|
Simply pass the project name as the first argument. (It can be called
 | 
						|
with no arguments to display usage).
 | 
						|
 | 
						|
The `~/.lwbuildrc' file, created on the first call of the project
 | 
						|
creation script, contains some variables which are used when 
 | 
						|
instantiating the empty project and module templates.
 | 
						|
 | 
						|
The `config' file in the root of the project directory is where 
 | 
						|
user-editable variables live. Variables are generally only set here if
 | 
						|
they are not exported in the environment; this allows variables to be
 | 
						|
overridden in a wrapper script, with the defaults specified.
 | 
						|
 | 
						|
This might be a good point to run `git init-db', if you intend to use
 | 
						|
the git SCM system.
 | 
						|
 | 
						|
Instantiating Modules
 | 
						|
---------------------
 | 
						|
 | 
						|
(This can only be done if the development symlinks are installed).
 | 
						|
 | 
						|
The `scripts/module-create.sh' script will allow the instantiation of
 | 
						|
new modules. Running it with no arguments will display usage; generally,
 | 
						|
it will take the module type, language, and name. The name is used
 | 
						|
directly as `src/${name}', and will also be the name of the output
 | 
						|
binary.
 | 
						|
 | 
						|
As modules are instantiated, they add any required arguments (e.g.
 | 
						|
${CFLAGS} or ${BINDIR}) into the `config' file.
 | 
						|
 | 
						|
The `src/${name}/build.*' files may be edited to alter build behaviour.
 | 
						|
This includes adding arguments to the C compiler. Variables set in 
 | 
						|
`config' are available when these scripts are run.
 | 
						|
 | 
						|
There are a few conventions of note.
 | 
						|
 | 
						|
Anything that wishes to link against external libraries will usually use
 | 
						|
two variables in `config' (libname_CFLAGS and libname_LIBS). If these
 | 
						|
are produced by running $(libname-config --cflags) and $(libname-config
 | 
						|
--libs), then lines suitable for `config' can be produced by running
 | 
						|
`scripts/config-printflags.sh libname'.
 | 
						|
 | 
						|
An application module has an EXTRAS variable in its build.app into which
 | 
						|
the libname flags are placed (in addition to any others). A library
 | 
						|
module will need to export dependency information; this is done by
 | 
						|
changing the module_DEP_CFLAGS and module_DEP_LIBS flags in `build.lib'.
 | 
						|
The dependency information will be placed into the lib-config executable
 | 
						|
installed along with the library.
 | 
						|
 | 
						|
Sometimes, it is useful to have compile-time options. Conventionally,
 | 
						|
these will be placed into the `config' file, and will often have a name
 | 
						|
such as CONFIG_DISABLE_FOO.
 | 
						|
 | 
						|
Building
 | 
						|
--------
 | 
						|
 | 
						|
Individual modules can be built with `./make.sh ${name}'. They can also
 | 
						|
be built by category; see `src/${name}/build.*'. The part of the
 | 
						|
filename after `build.' can also be passed to `./make.sh'. This allows,
 | 
						|
for example, all applications to be built (`./make.sh app'); or only
 | 
						|
libraries to be installed (`./make.sh install-lib').
 | 
						|
 | 
						|
Setting the environment variable VERBOSE to 1 before running make.sh
 | 
						|
will display some additional tracing output.
 | 
						|
 | 
						|
Versioning and Tagging
 | 
						|
----------------------
 | 
						|
 | 
						|
The `version' file in the top level of the project directory contains
 | 
						|
the overall package version. This information is exported to C
 | 
						|
applications and libraries via the preprocessor as VERSION and
 | 
						|
VERSION_{MAJOR,MINOR,MICRO}.
 | 
						|
 | 
						|
Library modules have a `soversion' file, entirely independent of the
 | 
						|
top-level version, which is used to create symlinks as well as set the
 | 
						|
soname of the library. The soname depends only on the major and minor
 | 
						|
version, meaning that the micro version number can be bumped without
 | 
						|
changing the soname.
 | 
						|
 | 
						|
`scripts/version.sh' can be run to bump version numbers automatically.
 | 
						|
If the project is a git repository, it can also be used to create tags
 | 
						|
and push changes to a central repository.
 | 
						|
 | 
						|
The version script takes a number of commands, and executes them in 
 | 
						|
order. The following commands may be used:
 | 
						|
 | 
						|
  major, minor, micro
 | 
						|
    Bump the version number in the top-level `version'. Bumping the
 | 
						|
    minor version will clear the micro version; bumping the major
 | 
						|
    version will clear minor and micro.
 | 
						|
 | 
						|
  libmajor, libminor, libmicro		(1 argument)
 | 
						|
    Bump the soversion number in a library's `soversion', with the same
 | 
						|
    semantics as major/minor/micro. The argument is the library module's
 | 
						|
    name.
 | 
						|
 | 
						|
  tag					(git only)
 | 
						|
    If this is a git repository, creates a tag based on the contents of
 | 
						|
    `version'.
 | 
						|
 | 
						|
  push					(git only)
 | 
						|
    If this is a git repository, does a `git push' as well as a
 | 
						|
    `git push --tags'. This is a good way to ensure that any tags you
 | 
						|
    create are pushed to a central repository (this normally needs to be
 | 
						|
    done separately).
 | 
						|
 | 
						|
Creating tarballs
 | 
						|
-----------------
 | 
						|
 | 
						|
(This only works for git repositories).
 | 
						|
 | 
						|
`scripts/release.sh' can be run to create a tarball of the project. It
 | 
						|
takes two arguments: the first is the version number (or git tag) of the
 | 
						|
version to release, and the second the output directory. This will
 | 
						|
create a source tarball, a documentation tarball if a doxygen module is
 | 
						|
detected, and will also attempt to sign the tarballs with gpg (although
 | 
						|
it is not a fatal error if this step fails).
 | 
						|
 | 
						|
Upgrading build system
 | 
						|
----------------------
 | 
						|
 | 
						|
Sometimes, the nonvolatile parts of the build system (the static parts
 | 
						|
that are committed to the repository) need to be upgraded as well. There
 | 
						|
is a script to do this in the lw-build-system repository.
 | 
						|
 | 
						|
From the project base directory, run the script 
 | 
						|
`/path/to/lw-build-system/update.sh'. This only works if symlinks are
 | 
						|
installed. It will create a patch file, which you should edit before
 | 
						|
applying.
 | 
						|
 | 
						|
Unfortunately, the upgrade process is not perfect and will not detect
 | 
						|
legitimate changes you have made to files such as `config' and modules'
 | 
						|
`build.*' files. You will need to manually edit the patch to revert
 | 
						|
false positives.
 |