]> git.llucax.com Git - software/posixx.git/commitdiff
Use makeit build system
authorLeandro Lucarella <llucarella@integratech.com.ar>
Mon, 28 Sep 2009 15:49:00 +0000 (12:49 -0300)
committerLeandro Lucarella <llucarella@integratech.com.ar>
Tue, 6 Oct 2009 17:59:35 +0000 (14:59 -0300)
Makeit is a simple yet powerful and flexible build system based in GNU
Make. It doesn't generate the makefiles but greately simplify writing them,
using a single-file GNU Make library and some conventions.

17 files changed:
.gitignore [new file with mode: 0644]
Build.mak [new file with mode: 0644]
Makefile
Makeit.mak [new file with mode: 0644]
README [moved from doc/dependencies.rst with 81% similarity]
Toplevel.mak [new file with mode: 0644]
doc/.gitignore [deleted file]
doc/Makefile [deleted file]
src/.gitignore [deleted file]
src/Build.mak [new file with mode: 0644]
src/Doxyfile [moved from doc/Doxyfile with 88% similarity]
src/Makefile
src/posixx.pc.in [new file with mode: 0644]
src/posixx.pc.template [deleted file]
test/.gitignore [deleted file]
test/Build.mak [new file with mode: 0644]
test/Makefile

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..567609b
--- /dev/null
@@ -0,0 +1 @@
+build/
diff --git a/Build.mak b/Build.mak
new file mode 100644 (file)
index 0000000..9272d6b
--- /dev/null
+++ b/Build.mak
@@ -0,0 +1,4 @@
+
+# Include sub-directories makefiles
+$(call include_subdirs,src test)
+
index a4c08fefe2eb50ef31ec1d76180065103f4ff49e..f78a4f000b262aaffb9902768c5969ec4f29b9a8 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,33 +1,10 @@
 
+# Top-level directory
+T := .
 
-# prefix for installing the binaries and headers
-prefix=/usr/local
-
-
-
-default: all
-
-all:
-
-install:
-       $(MAKE) -C src install
-
-doc:
-       $(MAKE) -C doc
-
-test:
-       $(MAKE) -C test test
-
-memtest:
-       $(MAKE) -C test memtest
-
-commit-check: doc test memtest
-
-clean:
-       $(MAKE) -C src clean
-       $(MAKE) -C doc clean
-       $(MAKE) -C test clean
-
-.PHONY: default all install doc test memtest commit-check clean
+# Default goal for building this directory
+.DEFAULT_GOAL := all
 
+# Include the top-level makefile
+include $T/Toplevel.mak
 
diff --git a/Makeit.mak b/Makeit.mak
new file mode 100644 (file)
index 0000000..3cbe089
--- /dev/null
@@ -0,0 +1,510 @@
+ifndef Makeit.mak.included
+Makeit.mak.included := 1
+
+# These variables should be provided by the Makefile that include us:
+# P should be the project name, mostly used to handle include directories
+# T should be the path to the top-level directory.
+# S should be sub-directory where the current makefile is, relative to $T.
+
+# Verbosity flag (empty show nice messages, non-empty use make messages)
+# When used internal, $V expand to @ is nice messages should be printed, this
+# way it's easy to add $V in front of commands that should be silenced when
+# displaying the nice messages.
+override V := $(if $V,,@)
+# honour make -s flag
+override V := $(if $(findstring s,$(MAKEFLAGS)),,$V)
+
+# If $V is non-empty, colored output is used if $(COLOR) is non-empty too
+COLOR ?= 1
+
+# ANSI color used for the command if $(COLOR) is non-empty
+# The color is composed with 2 numbers separated by ;
+# The first is the style. 00 is normal, 01 is bold, 04 is underline, 05 blinks,
+# 07 is reversed mode
+# The second is the color: 30 dark gray/black, 31 red, 32 green, 33 yellow, 34
+# blue, 35 magenta, 36 cyan and 37 white.
+# If empty, no special color is used.
+COLOR_CMD ?= 00;33
+
+# ANSI color used for the argument if $(COLOR) is non-empty
+# See COLOR_CMD comment for details.
+COLOR_ARG ?=
+
+# Flavor (variant), should be one of "dbg", "opt" or "cov"
+F ?= opt
+
+# Use C++ linker by default
+LINKER := $(CXX)
+
+# Default mode used to install files
+IMODE ?= 0644
+
+# Default install flags
+IFLAGS ?= -D
+
+# Use pre-compiled headers if non-empty
+GCH ?=
+
+# If non-empty, use valgrind to run commands via the "valgrind" function
+VALGRIND ?=
+
+# Options to pass to valgrind; if the variable $(VALGRIND_SUPP) is non-empty
+# it will be used as a suppressions file.
+VALGRIND_CMD ?= valgrind --tool=memcheck --leak-check=yes --db-attach=no \
+               --num-callers=24 --leak-resolution=high --track-fds=yes \
+               --error-exitcode=1 \
+               $(if $V,--log-file=$<.valgrind.log) \
+               $(if $(VALGRIND_SUPP),--suppressions=$(VALGRIND_SUPP))
+
+# Command to generate Sphinx based documentation
+SPHINX ?= sphinx-build
+
+# Format to build using Sphinx (html, pickle, htmlhelp, latex, changes or
+# linkcheck; see sphinx-build docs for details)
+SPHINX_FORMAT ?= html
+
+# Paper size for Sphinx LaTeX output (a4, letter, etc.)
+SPHINX_PAPERSIZE ?= a4
+
+# Name of the build directory (to use when excluding some paths)
+BUILD_DIR_NAME ?= build
+
+# Directories to exclude from the build directory tree replication
+BUILD_DIR_EXCLUDE ?= $(BUILD_DIR_NAME) .git .hg .bzr _darcs .svn CVS
+
+
+# Directories
+##############
+
+# Base directory where to install files (can be overridden, should be absolute)
+prefix ?= /usr/local
+
+# Path to a complete alternative environment, usually a jail, or an installed
+# system mounted elsewhere than /.
+DESTDIR ?=
+
+# Use absolute paths to avoid problems with automatic dependencies when
+# building from subdirectories
+T := $(abspath $T)
+
+# Name of the current directory, relative to $T
+R := $(subst $T,,$(patsubst $T/%,%,$(CURDIR)))
+
+# Base directory where to put variants (Variants Directory)
+VD ?= $T/$(BUILD_DIR_NAME)
+
+# Generated files top directory
+G ?= $(VD)/$F
+
+# Objects (and other garbage like pre-compiled headers and dependency files)
+# directory
+O ?= $G/obj
+
+# Binaries directory
+B ?= $G/bin
+
+# Libraries directory
+L ?= $G/lib
+
+# Documentation directory
+D ?= $(VD)/doc
+
+# Installation directory
+I := $(DESTDIR)$(prefix)
+
+# Includes directory
+INCLUDE_DIR ?= $G/include
+
+# Directory of the current makefile (this might not be the same as $(CURDIR)
+# This variable is "lazy" because $S changes all the time, so it should be
+# evaluated in the context where $C is used, not here.
+C = $T/$S
+
+
+# Functions
+############
+
+# Compare two strings, if they are the same, returns the string, if not,
+# returns empty.
+eq = $(if $(subst $1,,$2),,$1)
+
+# Find sources files and get the corresponding object names.  The first
+# argument should be the sources extension ("c" or "cpp" typically).  The
+# second argument is where to search for the sources ($C if omitted).  The
+# resulting files will always have the suffix "o" and the directory rewritten
+# to match the directory structure (from $T) but in the $O directory.  For
+# example, if $T is "/usr/src", $O is "/tmp/obj", $C is "/usr/src/curr" and it
+# have 2 C sources: "/usr/src/curr/1.c" and "/usr/src/curr/dir/2.c", the call:
+# $(call find_objects,c)
+# Will yield "/tmp/obj/curr/1.o" and "/tmp/obj/curr/dir/2.o".
+find_objects = $(patsubst $T/%.$1,$O/%.o,$(shell \
+               find $(if $2,$2,$C) -name '*.$1'))
+
+# Find files and get the their file names relative to another directory.  The
+# first argument should be the files suffix (".h" or ".cpp" for example).  The
+# second argument is a directory rewrite, the matched files will be rewriten to
+# be in the directory specified in this argument (it defaults to the third
+# argument if omitted).  The third argument is where to search for the files
+# ($C if omitted).
+find_files = $(patsubst $(if $3,$3,$C)/%$1,$(if $2,$2,$(if $3,$3,$C))/%$1, \
+               $(shell find $(if $3,$3,$C) -name '*$1'))
+
+# Abbreviate a file name. Cut the leading part of a file if it match to the $T
+# directory, so it can be displayed as if it were a relative directory. Take
+# just one argument, the file name.
+abbr_helper = $(subst $T,.,$(patsubst $T/%,%,$1))
+abbr = $(if $(call eq,$(call abbr_helper,$1),$1),$1,$(addprefix \
+               $(shell echo $R | sed 's|/\?\([^/]\+\)/\?|../|g'),\
+               $(call abbr_helper,$1)))
+
+# Execute a command printing a nice message if $V is @.
+# The first argument is mandatory and it's the command to execute. The second
+# and third arguments are optional and are the target name and command name to
+# pretty print.
+vexec_pc = $(if $1,\033[$1m%s\033[00m,%s)
+vexec_p = $(if $(COLOR), \
+       '   $(call vexec_pc,$(COLOR_CMD)) $(call vexec_pc,$(COLOR_ARG))\n', \
+       '   %s %s\n')
+vexec = $(if $V,printf $(vexec_p) \
+               '$(call abbr,$(if $3,$(strip $3),$(firstword $1)))' \
+               '$(call abbr,$(if $2,$(strip $2),$@))' ; )$1
+
+# Same as vexec but it silence the echo command (prepending a @ if $V).
+exec = $V$(call vexec,$1,$2,$3)
+
+# Compile a source file to an object, generating pre-compiled headers (if
+# $(GCH) is non-empty) and dependencies. The pre-compiled headers are generated
+# only if the system includes change. This function is designed to be used as
+# a command in a rule.  The first argument is the type of file to compile
+# (typically "c" or "cpp").  What to compile and the output files are built
+# using the automatic variables from a rule.  The second argument is the base
+# output directory (typically $O).  You can add non-propagated object-specific
+# flags defining a variable with the name of the target followed with
+# ".EXTRA_FLAGS".
+#
+# XXX: The pre-compiled headers generation is not very useful if you include
+#      local files using #include <...>, because the system headers detection
+#      is a little simplistic now, it just parse the source file and all its
+#      dependencies searching for lines starting with "#include <" and
+#      extracting the included files from them.
+define compile
+$(if $(GCH),\
+$Vif test -f $2/$*.d; then \
+       tmp=`mktemp`; \
+       h=`awk -F: '!$$0 {f = 1} $$0 && f {print $$1}' $2/$*.d`; \
+       grep -h '^#include <' $< $$h | sort -u > "$$tmp"; \
+       if diff -q -w "$2/$*.$1.h" "$$tmp" > /dev/null 2>&1; \
+       then \
+               rm "$$tmp"; \
+       else \
+               mv "$$tmp" "$2/$*.$1.h"; \
+               $(call vexec,$(COMPILE.$1) $($@.EXTRA_FLAGS) \
+                       -o "$2/$*.$1.h.gch" "$2/$*.$1.h",$2/$*.$1.h.gch); \
+       fi \
+else \
+       touch "$2/$*.$1.h"; \
+fi \
+)
+$(call exec,$(COMPILE.$1) $($@.EXTRA_FLAGS) -o $@ -MMD -MP \
+               $(if $(GCH),-include $2/$*.$1.h) $<)
+endef
+
+# Link object files to build an executable. The objects files are taken from
+# the prerequisite files ($O/%.o). If in the prerequisite files are shared
+# objects ($L/lib%.so), they are included as libraries to link to (-l%). This
+# function is designed to be used as a command in a rule. The output name is
+# taken from the rule automatic variables. If an argument is provided, it's
+# included in the link command line. The variable LINKER is used to link the
+# executable; for example, if you want to link a C++ executable, you should use
+# LINKER := $(CXX).  You can add non-propagated target-specific flags defining
+# a variable with the name of the target followed with ".EXTRA_FLAGS".  You can
+# specify a non-propagated object-specific linker defining a variable with the
+# name of the target followed with ".LINKER".
+link = $(call exec,$(if $($@.LINKER),$($@.LINKER),$(LINKER)) \
+               $(LDFLAGS) $(TARGET_ARCH) $($@.EXTRA_FLAGS) -o $@ $1 \
+               $(patsubst $L/lib%.so,-l%,$(filter %.so,$^)) \
+               $(foreach obj,$(filter %.o,$^),$(obj)))
+
+# Install a file. All arguments are optional.  The first argument is the file
+# mode (defaults to 0644).  The second argument are extra flags to the install
+# command (defaults to -D).  The third argument is the source file to install
+# (defaults to $<) and the last one is the destination (defaults to $@).
+install_file = $(call exec,install -m $(if $1,$1,0644) $(if $2,$2,-D) \
+               $(if $3,$3,$<) $(if $4,$4,$@))
+
+# Concatenate variables together.  The first argument is a list of variables
+# names to concatenate.  The second argument is an optional prefix for the
+# variables and the third is the string to use as separator (" ~" if omitted).
+# For example:
+# X_A := a
+# X_B := b
+# $(call varcat,A B,X_, --)
+# Will produce something like "a -- b --"
+varcat = $(foreach v,$1,$($2$v)$(if $3,$3, ~))
+
+# Replace variables with specified values in a template file.  The first
+# argument is a list of make variables names which will be replaced in the
+# target file.  The strings @VARNAME@ in the template file will be replaced
+# with the value of the make $(VARNAME) variable and the result will be stored
+# in the target file.  The second (optional) argument is a prefix to add to the
+# make variables names, so if the prefix is PREFIX_ and @VARNAME@ is found in
+# the template file, it will be replaced by the value of the make variable
+# $(PREFIX_VARNAME).  The third and fourth arguments are the source file and
+# the destination file (both optional, $< and $@ are used if omitted). The
+# fifth (optional) argument are options to pass to the substitute sed command
+# (for example, use "g" if you want to do multiple substitutions per line).
+replace = $(call exec,sed '$(foreach v,$1,s|@$v@|$($2$v)|$5;)' $(if $3,$3,$<) \
+               > $(if $4,$4,$@))
+
+# Create a symbolic link to the project under the $(INCLUDE_DIR). The first
+# argument is the name of symbolic link to create.  The link is only created if
+# it doesn't already exist.
+symlink_include_dir = $(shell \
+               test -L $(INCLUDE_DIR)/$1 \
+                       || ln -s $C $(INCLUDE_DIR)/$1 )
+
+# Create a file with flags used to trigger rebuilding when they change. The
+# first argument is the name of the file where to store the flags, the second
+# are the flags and the third argument is a text to be displayed if the flags
+# have changed (optional).  This should be used as a rule action or something
+# where a shell script is expected.
+gen_rebuild_flags = $(shell if test x"$2" != x"`cat $1 2>/dev/null`"; then \
+               $(if $3,test -f $1 && echo "$3";) \
+               echo "$2" > $1 ; fi)
+
+# Include sub-directory's Build.mak.  The only argument is a list of
+# subdirectories for which Build.mak should be included.  The $S directory is
+# set properly before including each sub-directory's Build.mak and restored
+# afterwards.
+define build_subdir_code
+_parent__$d__dir_ := $$S
+S := $$(if $$(_parent__$d__dir_),$$(_parent__$d__dir_)/$d,$d)
+include $$T/$$S/Build.mak
+S := $$(_parent__$d__dir_)
+endef
+include_subdirs = $(foreach d,$1,$(eval $(build_subdir_code)))
+
+# Run a command through valgrind if $(VALGRIND) is non-empty.  The first
+# argument is the command to run.  If $(VALGRIND) is empty, the command is
+# executed as passed to this function.  If valgrind is used, the
+# $(VALGRIND_CMD) is prepended to the command to run.  See VALGRIND_CMD
+# definition for extra options that can be passed as make variables.  The
+# second argument is the name of the command to print when $V is non-empty (if
+# omitted, the first word of the first argument is used).
+valgrind = $(call exec,$(if $(VALGRIND),$(VALGRIND_CMD)) $1,\
+               $(if $(VALGRIND),[$(firstword $(VALGRIND_CMD))], ),\
+               $(if $2,$2,$(firstword $1)))
+
+
+# Overridden flags
+##################
+
+# Warn about everything
+override CPPFLAGS += -Wall
+
+# Use the includes directories to search for includes
+override CPPFLAGS += -I$(INCLUDE_DIR)
+
+# Let the program know where it will be installed
+override CPPFLAGS += -DPREFIX=$(prefix)
+
+# Be standard compliant
+override CFLAGS += -std=c99 -pedantic
+override CXXFLAGS += -std=c++98 -pedantic
+
+# Use the generated library directory to for libraries
+override LDFLAGS += -L$L -Wall
+
+# Make sure the generated libraries can be found
+export LD_LIBRARY_PATH := $L:$(LD_LIBRARY_PATH)
+
+
+# Variant flags
+################
+
+ifeq ($F,dbg)
+override CPPFLAGS += -ggdb -DDEBUG
+endif
+
+ifeq ($F,opt)
+override CPPFLAGS += -O2 -DNDEBUG
+endif
+
+ifeq ($F,cov)
+override CPPFLAGS += -ggdb -pg --coverage
+override LDFLAGS += -pg --coverage
+endif
+
+
+# Automatic dependency handling
+################################
+
+# These files are created during compilation.
+sinclude $(shell test -d $O && find $O -name '*.d')
+
+
+# Default rules
+################
+
+# Compile C objects
+$O/%.o: $T/%.c $G/compile-c-flags
+       $(call compile,c,$O)
+
+# Compile C++ objects
+$O/%.o: $T/%.cpp $G/compile-cpp-flags
+       $(call compile,cpp,$O)
+
+# Link binary programs
+$B/%: $G/link-o-flags
+       $(call link)
+
+# Link shared libraries
+$L/%.so: override CFLAGS += -fPIC
+$L/%.so: override CXXFLAGS += -fPIC
+$L/%.so: $G/link-o-flags
+       $(call link,-shared)
+
+# Create pkg-config files using a template
+$L/%.pc:
+       $(call replace,$(PC_VARS),$*-PC-)
+
+# Run doxygen to build the documentation.  It expects the first prerequisite to
+# be the Doxyfile to use and the next prerequisites the input files.  You
+# can override Doxyfile configuration variables by defining a DOXYGEN_VARS
+# Make variable for this rule.  For example, defining:
+# PROJECT_NAME := myproj
+# DOXYGEN_VARS := PROJECT_NAME
+# You can override Doxygen's PROJECT_NAME configuration option. Optionally, you
+# can define DOXYGEN_VARS_PREFIX too, to avoid polluting your Makefile with
+# Doxygen variables.  For example:
+# DOXY.PROJECT_NAME := myproj
+# DOXYGEN_VARS_PREFIX := DOXY.
+# DOXYGEN_VARS := PROJECT_NAME
+# This rule might be still a little restrictive, but you can always make your
+# own if it doesn't fit your needs ;)
+$D/%/doxygen-stamp:
+       $V mkdir -p $(@D)
+       $(call exec,(cat $<; \
+               echo "FULL_PATH_NAMES=YES"; \
+               $(if $(filter INPUT,$(DOXYGEN_VARS)),,\
+                       echo "INPUT=$(patsubst $(<D)/%,$(INCLUDE_DIR)/$*/%, \
+                                       $(wordlist 2,$(words $^),$^))";) \
+               echo "OUTPUT_DIRECTORY=$(@D)"; \
+               echo "STRIP_FROM_PATH=$(INCLUDE_DIR)"; \
+               echo "STRIP_FROM_INC_PATH=$(INCLUDE_DIR)"; \
+               echo "QUIET=$(if $V,YES,NO)"; \
+               $(foreach v,$(DOXYGEN_VARS),\
+                               echo '$v=$($(DOXYGEN_VARS_PREFIX)$v)';) \
+               ) | doxygen -,$(@D),doxygen)
+       $V touch $@
+
+# Run Sphinx to build the documentation.  It expects the variable SPHINX_DIR
+# to be set to the directory where the Sphinx's conf.py and reST source files
+# are.  This rule is a little restrictive, but you can always make your own if
+# it doesn't fit your needs ;)
+$D/%/sphinx-stamp: $G/sphinx-flags
+       $V mkdir -p $(@D)/$(SPHINX_FORMAT)
+       $(call exec,$(SPHINX) $(if $V,-q) -b $(SPHINX_FORMAT) \
+               -d $(@D)/doctrees -D latex_paper_size=$(SPHINX_PAPERSIZE) \
+               $(SPHINX_DIR) $(@D)/$(SPHINX_FORMAT),$(@D),$(SPHINX))
+       $V touch $@
+
+# Install binary programs
+$I/bin/%:
+       $(call install_file,0755)
+
+# Install system binary programs
+$I/sbin/%:
+       $(call install_file,0755)
+
+# Install pkg-config specification files
+$I/lib/pkgconfig/%:
+       $(call install_file)
+
+# Install libraries
+$I/lib/%:
+       $(call install_file)
+
+.PHONY: clean
+clean:
+       $(call exec,$(RM) -r $(VD),$(VD))
+
+# Phony rule to uninstall all built targets (like "install", uses $(install)).
+.PHONY: uninstall
+uninstall:
+       $V$(foreach i,$(install),$(call vexec,$(RM) $i,$i);)
+
+# These rules use the "Secondary Expansion" GNU Make feature, to allow
+# sub-makes to add values to the special variables $(all), after this makefile
+# was read.
+.SECONDEXPANSION:
+
+# Phony rule to make all the targets (sub-makefiles can append targets to build
+# to the $(all) variable).
+.PHONY: all
+all: $$(all)
+
+# Phony rule to install all built targets (sub-makefiles can append targets to
+# build to the $(install) variable).
+.PHONY: install
+install: $$(install)
+
+# Phony rule to build all documentation targets (sub-makefiles can append
+# documentation to build to the $(doc) variable).
+.PHONY: doc
+doc: $$(doc)
+
+# Phony rule to build and run all test (sub-makefiles can append targets to
+# build and run tests to the $(test) variable).
+.PHONY: test
+test: $$(test)
+
+
+# Create build directory structure
+###################################
+
+# Create $O, $B, $L, $D and $(INCLUDE_DIR) directories and replicate the
+# directory structure of the project into $O. Create one symbolic link "last"
+# to the current build directory.
+#
+# NOTE: the second mkdir can yield no arguments if the project don't have any
+#       subdirectories, that's why the current directory "." is included, so it
+#       won't show an error message in case of no subdirectories.
+setup_build_dir__ := $(shell \
+       mkdir -p $O $B $L $D $(INCLUDE_DIR) $(addprefix $O,$(patsubst $T%,%,\
+               $(shell find $T -type d $(foreach d,$(BUILD_DIR_EXCLUDE), \
+                               -not -path '*/$d' -not -path '*/$d/*')))); \
+       test -L $(VD)/last || ln -s $F $(VD)/last )
+
+
+# Automatic rebuilding when flags or commands changes
+######################################################
+
+# Re-compile C files if one of this variables changes
+COMPILE.c.FLAGS := $(call varcat,CC CPPFLAGS CFLAGS TARGET_ARCH prefix)
+
+# Re-compile C++ files if one of this variables changes
+COMPILE.cpp.FLAGS := $(call varcat,CXX CPPFLAGS CXXFLAGS TARGET_ARCH prefix)
+
+# Re-link binaries and libraries if one of this variables changes
+LINK.o.FLAGS := $(call varcat,LD LDFLAGS TARGET_ARCH)
+
+# Re-build sphinx documentation if one of these variables changes
+SPHINX.FLAGS := $(call varcat,SPHINX SPHINX_FORMAT SPHINX_PAPERSIZE)
+
+# Create files containing the current flags to trigger a rebuild if they change
+setup_flag_files__ := $(call gen_rebuild_flags,$G/compile-c-flags, \
+       $(COMPILE.c.FLAGS),C compiler or flags; )
+setup_flag_files__ := $(setup_flag_files__)$(call gen_rebuild_flags, \
+       $G/compile-cpp-flags, $(COMPILE.cpp.FLAGS),C++ compiler or flags; )
+setup_flag_files__ := $(setup_flag_files__)$(call gen_rebuild_flags, \
+       $G/link-o-flags, $(LINK.o.FLAGS),linker or link flags; )
+setup_flag_files__ := $(setup_flag_files__)$(call gen_rebuild_flags, \
+       $G/sphinx-flags, $(SPHINX.FLAGS),sphinx command or flags; )
+
+# Print any generated message (if verbose)
+$(if $V,$(if $(setup_flag_files__), \
+       $(info !! Something changed: $(setup_flag_files__)re-building \
+                       affected files...)))
+
+endif
similarity index 81%
rename from doc/dependencies.rst
rename to README
index 25d83d5ed1a3cd119c8de966e3d01d3201e48061..d18b887404ffad613d5e764fdd01b67d39ffcbe4 100644 (file)
+++ b/README
@@ -1,4 +1,7 @@
 
+posixx is a thin C++ wrapper over the posix API.
+
+
 Dependencies
 ============
 
@@ -18,3 +21,4 @@ Documentation
 
 To generate the documentation, you need Doxygen and Graphviz installed.
 
+.. vim: set filetype=rst :
diff --git a/Toplevel.mak b/Toplevel.mak
new file mode 100644 (file)
index 0000000..8cffea4
--- /dev/null
@@ -0,0 +1,13 @@
+ifndef Toplevel.mak.included
+Toplevel.mak.included := 1
+
+# Load top-level directory local configuration
+sinclude $T/Config.mak
+
+# Include the build system library
+include $T/Makeit.mak
+
+# Include the Build.mak for this directory
+include $T/Build.mak
+
+endif
diff --git a/doc/.gitignore b/doc/.gitignore
deleted file mode 100644 (file)
index 7f41485..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-reference
-include
-.*-stamp
diff --git a/doc/Makefile b/doc/Makefile
deleted file mode 100644 (file)
index 24f3879..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-
-# sources from where to build the sources
-DOC_SOURCES = $(shell find ../src -name '*.hpp')
-
-# prefix for installing the binaries and headers
-prefix=/usr/local
-
-
-# install command
-INSTALL = install -p -m 0644 -D
-
-
-# install utility functions
-install_msg = echo "  INSTALL $(1)"
-
-install_group = @$(call install_msg,$(2)) && \
-       cd reference && \
-       for f in `find $(1) -type f`; do \
-               $(call install,$$f,$(2)/$$f); \
-       done && \
-       cd .. && \
-       touch $@
-
-ifneq ($(V), 1)
-NICE_DOXY = @echo "  DOXYGEN"; (cat Doxyfile; echo "QUIET=YES") | doxygen -
-NICE_CLEAN = @echo "  CLEAN"; $(RM)
-install = $(INSTALL) $(1) $(2)
-else
-NICE_DOXY = doxygen
-NICE_CLEAN = $(RM) -v
-install = $(call install_msg,$(2)); $(INSTALL) $(1) $(2)
-endif
-
-
-default: all
-
-all: doc
-
-doc: .doc-stamp
-
-.doc-stamp: include $(DOC_SOURCES) Doxyfile
-       $(NICE_DOXY)
-       @touch $@
-
-install: install-man install-html
-
-install-man: .install-man-stamp
-
-.install-man-stamp: .doc-stamp
-       $(call install_group,man,$(prefix)/share/man)
-
-install-html: .install-html-stamp
-
-.install-html-stamp: .doc-stamp
-       $(call install_group,html,$(prefix)/share/doc/posixx/html)
-
-include:
-       @mkdir -p include
-       @ln -fs ../../src include/posixx
-
-clean:
-       $(NICE_CLEAN) -r reference include .*-stamp
-
-.PHONY: default all doc install install-man install-doc clean
-
diff --git a/src/.gitignore b/src/.gitignore
deleted file mode 100644 (file)
index d930f66..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-posixx.pc
-.*-stamp
diff --git a/src/Build.mak b/src/Build.mak
new file mode 100644 (file)
index 0000000..a982796
--- /dev/null
@@ -0,0 +1,37 @@
+
+# Create the include directory symbolic link
+setup_include_dir__ := $(call symlink_include_dir,posixx)
+
+# Symbolic target to add to all
+.PHONY: posixx
+all += posixx
+
+# pkg-config specification file
+posixx-PC-PREFIX := $(prefix)
+posixx-PC-NAME := posixx
+posixx-PC-DESC := Thin C++ wrapper for POSIX API
+posixx-PC-URL := https://spec-dev.integratech.net/redmine/projects/show/posixx
+posixx-PC-VERSION := 0.1
+posixx-PC-VARS := PREFIX NAME DESC URL VERSION CFLAGS
+$L/posixx.pc: PC_VARS := $(posixx-PC-VARS)
+$L/posixx.pc: $C/posixx.pc.in $O/$S/posixx.pc-flags
+# trigger a rebuild when flags change
+setup_flags_files__ := $(call gen_rebuild_flags,$O/$S/posixx.pc-flags,\
+               $(call varcat,$(posixx-PC-VARS),posixx-PC-))
+posixx: $L/posixx.pc
+# install
+$I/lib/pkgconfig/posixx.pc: $L/posixx.pc
+install += $I/lib/pkgconfig/posixx.pc
+
+# Build the documentation using doxygen
+.PHONY: posixx-doc
+posixx-doc: $D/posixx/doxygen-stamp
+$D/posixx/doxygen-stamp: $C/Doxyfile $(call find_files,.hpp)
+doc += posixx-doc
+
+# Install the library's headers
+$I/include/posixx/%.hpp: $C/%.hpp
+       $(call install_file)
+# XXX: we can't use += here, call will be resolved lazily if we do
+install := $(install) $(call find_files,.hpp,$I/include/posixx)
+
similarity index 88%
rename from doc/Doxyfile
rename to src/Doxyfile
index e4427002d18107653b0536a8a85d97ae2eb8795d..8706828cfd9243712f1002049b17c41ae9f42f08 100644 (file)
@@ -1,4 +1,4 @@
-# Doxyfile 1.5.6
+# Doxyfile 1.6.1
 
 # This file describes the settings to be used by the documentation system
 # doxygen (www.doxygen.org) for a project
@@ -54,11 +54,11 @@ CREATE_SUBDIRS         = NO
 # information to generate all constant output in the proper language.
 # The default language is English, other supported languages are:
 # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
-# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek,
-# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages),
-# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish,
-# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish,
-# and Ukrainian.
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
 
 OUTPUT_LANGUAGE        = English
 
@@ -114,7 +114,7 @@ FULL_PATH_NAMES        = YES
 # If left blank the directory from which doxygen is run is used as the
 # path to strip.
 
-STRIP_FROM_PATH        = include/
+STRIP_FROM_PATH        =
 
 # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
 # the path mentioned in the documentation of a class, which tells
@@ -123,7 +123,7 @@ STRIP_FROM_PATH        = include/
 # definition is used. Otherwise one should specify the include paths that
 # are normally passed to the compiler using the -I flag.
 
-STRIP_FROM_INC_PATH    = include/
+STRIP_FROM_INC_PATH    =
 
 # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
 # (but less readable) file names. This can be useful is your file systems
@@ -155,13 +155,6 @@ QT_AUTOBRIEF           = NO
 
 MULTILINE_CPP_IS_BRIEF = NO
 
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member
-# documentation.
-
-DETAILS_AT_TOP         = YES
-
 # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
 # member inherits the documentation from any documented member that it
 # re-implements.
@@ -214,6 +207,17 @@ OPTIMIZE_FOR_FORTRAN   = NO
 
 OPTIMIZE_OUTPUT_VHDL   = NO
 
+# Doxygen selects the parser to use depending on the extension of the files it parses.
+# With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this tag.
+# The format is ext=language, where ext is a file extension, and language is one of
+# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP,
+# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat
+# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
 # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
 # to include (a tag file for) the STL sources as input, then you should
 # set this tag to YES in order to let doxygen match functions declarations and
@@ -268,6 +272,22 @@ SUBGROUPING            = YES
 
 TYPEDEF_HIDES_STRUCT   = NO
 
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penality.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will rougly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
@@ -385,6 +405,10 @@ SORT_MEMBER_DOCS       = YES
 
 SORT_BRIEF_DOCS        = NO
 
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
 # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
 # hierarchy of group names into alphabetical order. If set to NO (the default)
 # the group names will appear in their defined order.
@@ -459,7 +483,8 @@ SHOW_DIRECTORIES       = NO
 SHOW_FILES             = YES
 
 # Set the SHOW_NAMESPACES tag to NO to disable the generation of the
-# Namespaces page.  This will remove the Namespaces entry from the Quick Index
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
 # and from the Folder Tree View (if specified). The default is YES.
 
 SHOW_NAMESPACES        = YES
@@ -474,6 +499,15 @@ SHOW_NAMESPACES        = YES
 
 FILE_VERSION_FILTER    =
 
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by
+# doxygen. The layout file controls the global structure of the generated output files
+# in an output format independent way. The create the layout file that represents
+# doxygen's defaults, run doxygen with the -l option. You can optionally specify a
+# file name after the option, if omitted DoxygenLayout.xml will be used as the name
+# of the layout file.
+
+LAYOUT_FILE            =
+
 #---------------------------------------------------------------------------
 # configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
@@ -534,7 +568,7 @@ WARN_LOGFILE           =
 # directories like "/usr/src/myproject". Separate the files or directories
 # with spaces.
 
-INPUT                  = include
+INPUT                  = .
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
@@ -618,14 +652,17 @@ IMAGE_PATH             =
 # by executing (via popen()) the command <filter> <input-file>, where <filter>
 # is the value of the INPUT_FILTER tag, and <input-file> is the name of an
 # input file. Doxygen will then use the output that the filter program writes
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be
 # ignored.
 
 INPUT_FILTER           =
 
 # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis.  Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match.  The filters are a list of the form:
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
 # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
 # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
 # is applied to all files.
@@ -675,7 +712,8 @@ REFERENCES_RELATION    = NO
 # If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
 # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
 # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
-# link to the source code.  Otherwise they will link to the documentstion.
+# link to the source code.
+# Otherwise they will link to the documentation.
 
 REFERENCES_LINK_SOURCE = YES
 
@@ -764,12 +802,13 @@ HTML_STYLESHEET        =
 
 HTML_ALIGN_MEMBERS     = YES
 
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
-# of the generated HTML documentation.
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
 
-GENERATE_HTMLHELP      = NO
+HTML_DYNAMIC_SECTIONS  = NO
 
 # If the GENERATE_DOCSET tag is set to YES, additional index files
 # will be generated that can be used as input for Apple's Xcode 3
@@ -779,6 +818,7 @@ GENERATE_HTMLHELP      = NO
 # directory and running "make install" will install the docset in
 # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
 # it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
 
 GENERATE_DOCSET        = NO
 
@@ -796,13 +836,12 @@ DOCSET_FEEDNAME        = "Doxygen generated docs"
 
 DOCSET_BUNDLE_ID       = org.doxygen.Project
 
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded. For this to work a browser that supports
-# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
-# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
 
-HTML_DYNAMIC_SECTIONS  = NO
+GENERATE_HTMLHELP      = NO
 
 # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
 # be used to specify the file name of the resulting .chm file. You
@@ -841,6 +880,55 @@ BINARY_TOC             = NO
 
 TOC_EXPAND             = NO
 
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER
+# are set, an additional index file will be generated that can be used as input for
+# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated
+# HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          =
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add.
+# For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION           =
+
 # The DISABLE_INDEX tag can be used to turn on/off the condensed index at
 # top of each HTML page. The value NO (the default) enables the index and
 # the value YES disables it.
@@ -854,20 +942,18 @@ ENUM_VALUES_PER_LINE   = 4
 
 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
 # structure should be generated to display hierarchical information.
-# If the tag value is set to FRAME, a side panel will be generated
+# If the tag value is set to YES, a side panel will be generated
 # containing a tree-like index structure (just like the one that
 # is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
-# probably better off using the HTML help feature. Other possible values
-# for this tag are: HIERARCHIES, which will generate the Groups, Directories,
-# and Class Hiererachy pages using a tree view instead of an ordered list;
-# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which
-# disables this behavior completely. For backwards compatibility with previous
-# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE
-# respectively.
-
-GENERATE_TREEVIEW      = FRAME
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = NO
 
 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
 # used to set the initial width (in pixels) of the frame in which the tree
@@ -883,6 +969,13 @@ TREEVIEW_WIDTH         = 250
 
 FORMULA_FONTSIZE       = 10
 
+# When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP)
+# there is already a search function so this one should typically
+# be disabled.
+
+SEARCHENGINE           = NO
+
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
@@ -959,6 +1052,10 @@ LATEX_BATCHMODE        = NO
 
 LATEX_HIDE_INDICES     = NO
 
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
 #---------------------------------------------------------------------------
 # configuration options related to the RTF output
 #---------------------------------------------------------------------------
@@ -1008,7 +1105,7 @@ RTF_EXTENSIONS_FILE    =
 # If the GENERATE_MAN tag is set to YES (the default) Doxygen will
 # generate man pages
 
-GENERATE_MAN           = YES
+GENERATE_MAN           = NO
 
 # The MAN_OUTPUT tag is used to specify where the man pages will be put.
 # If a relative path is entered the value of OUTPUT_DIRECTORY will be
@@ -1095,8 +1192,10 @@ GENERATE_PERLMOD       = NO
 PERLMOD_LATEX          = NO
 
 # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader.  This is useful
-# if you want to understand what is going on.  On the other hand, if this
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
 # tag is set to NO the size of the Perl module output will be much smaller
 # and Perl will parse it just the same.
 
@@ -1183,9 +1282,11 @@ SKIP_FUNCTION_MACROS   = YES
 # Optionally an initial location of the external documentation
 # can be added for each tagfile. The format of a tag file without
 # this location is as follows:
-#   TAGFILES = file1 file2 ...
+#
+# TAGFILES = file1 file2 ...
 # Adding location for the tag files is done as follows:
-#   TAGFILES = file1=loc1 "file2 = loc2" ...
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
 # where "loc1" and "loc2" can be relative or absolute paths or
 # URLs. If a location is present for each tag, the installdox tool
 # does not have to be run to correct the links.
@@ -1264,6 +1365,11 @@ HAVE_DOT               = YES
 
 DOT_FONTNAME           = FreeSans
 
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
 # By default doxygen will tell dot to use the output directory to look for the
 # FreeSans.ttf font (which doxygen will put there itself). If you specify a
 # different font using DOT_FONTNAME you can set the path where dot
@@ -1381,10 +1487,10 @@ DOT_GRAPH_MAX_NODES    = 50
 MAX_DOT_GRAPH_DEPTH    = 0
 
 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is enabled by default, which results in a transparent
-# background. Warning: Depending on the platform used, enabling this option
-# may lead to badly anti-aliased labels on the edges of a graph (i.e. they
-# become hard to read).
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
 
 DOT_TRANSPARENT        = YES
 
@@ -1406,12 +1512,3 @@ GENERATE_LEGEND        = YES
 # the various graphs.
 
 DOT_CLEANUP            = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE           = NO
index cfea6e64d38b836282671c28d9c4e4e3b87453e7..17a2e2c0768759213779b72317f65c4d1fa75fd8 100644 (file)
@@ -1,80 +1,10 @@
 
-# Build flags (include general stuff in the .pc file instead)
-LOCAL_CFLAGS =
-LOCAL_LDFLAGS =
+# Top-level directory
+T := ..
 
-# XXX: The cut pipe is to strip the leading "./" from find results. It's
-#      a little ugly but I couldn't find a better way to get a list of all
-#      headers in the directory (recursively).
-HEADERS = $(shell find -name '*.hpp' | cut -b3-)
-HDRPATH = posixx
-PCFILE = posixx.pc
-PCTEMPLATE = $(PCFILE).template
+# Default goal for building this directory
+.DEFAULT_GOAL := posixx
 
-# prefix for installing the binaries
-prefix = /usr/local
-
-
-# Flags fetched from pkg-config .pc file
-ifneq ($(PCTEMPLATE), )
-PKG_LIB = $(shell grep Libs.private: $(PCTEMPLATE) | cut -d' ' -f2-)
-PKG_REQ = $(shell grep Requires: $(PCTEMPLATE) | cut -d' ' -f2-)
-ifneq ($(PKG_REQ), )
-PKG_REQ_CFLAGS = $(shell pkg-config --cflags $(PKG_REQ))
-PKG_REQ_LDFLAGS = $(shell pkg-config --libs $(PKG_REQ))
-endif
-endif
-
-# XXX: LI_* variables are for internal use only
-# (for the super-repository local-install target)
-ALL_CFLAGS = $(LOCAL_CFLAGS) $(PKG_REQ_CFLAGS) $(LI_CFLAGS) $(CFLAGS)
-ALL_LDFLAGS = $(LOCAL_LDFLAGS) $(PKG_LIB) $(PKG_REQ_LDFLAGS) $(LI_LDFLAGS) \
-               $(LDFLAGS)
-
-
-# install command
-INSTALL = install -p -m 0644 -D
-
-
-# install utility functions
-install_msg = echo "  INSTALL $(1)"
-
-install_files = @$(call install_msg,$(2)) && \
-       for f in $(1); do \
-               $(call install,$$f,$(2)/$$f); \
-       done && \
-       touch $@
-
-ifneq ($(V), 1)
-NICE_CLEAN = @echo "  CLEAN"; $(RM)
-install = $(INSTALL) $(1) $(2)
-else
-NICE_CLEAN = $(RM) -v
-install = $(call install_msg,$(2)); $(INSTALL) $(1) $(2)
-endif
-
-
-default: all
-
-all:
-
-$(PCFILE): $(PCTEMPLATE)
-       @sed 's|PREFIX|$(prefix)|' $< > $@
-
-install: install-headers install-pc
-
-install-headers: .install-headers-stamp
-
-.install-headers-stamp: $(HEADERS)
-       $(call install_files,$^,$(prefix)/include/$(HDRPATH))
-
-install-pc: .install-pc-stamp
-
-.install-pc-stamp: $(PCFILE)
-       $(call install_files,$^,$(prefix)/lib/pkgconfig)
-
-clean:
-       $(NICE_CLEAN) $(PCFILE) .*-stamp
-
-.PHONY: default all install install-headers install-pc clean
+# Include the top-level build
+include $T/Toplevel.mak
 
diff --git a/src/posixx.pc.in b/src/posixx.pc.in
new file mode 100644 (file)
index 0000000..5cd03fe
--- /dev/null
@@ -0,0 +1,12 @@
+
+prefix=@PREFIX@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+Name: @NAME@
+Description: @DESC@
+URL: @URL@
+Version: @VERSION@
+Cflags: -I${includedir}
+
diff --git a/src/posixx.pc.template b/src/posixx.pc.template
deleted file mode 100644 (file)
index a288288..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-
-prefix=PREFIX
-exec_prefix=${prefix}
-libdir=${exec_prefix}/lib
-includedir=${prefix}/include
-
-Name: posixx
-Description: Thin C++ wrapper for POSIX API
-URL: https://spec-dev.integratech.net/redmine/projects/show/posixx
-Version: 0.1
-Cflags: -I${includedir}
-
diff --git a/test/.gitignore b/test/.gitignore
deleted file mode 100644 (file)
index a80bb3f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-*.o
-.deps
-include
-test_suite
-test_suite.log
-valgrind.log
-valgrind.test_suite.log
-.*-stamp
diff --git a/test/Build.mak b/test/Build.mak
new file mode 100644 (file)
index 0000000..b514e59
--- /dev/null
@@ -0,0 +1,16 @@
+
+# Build the test executable
+$B/test-posixx: LINKER := $(CXX)
+$B/test-posixx: $(call find_objects,cpp)
+
+# Run the test executable (though valgrind if $(VALGRIND) is non-empty)
+.PHONY: test-posixx
+test-posixx: LDFLAGS += -lboost_unit_test_framework-mt
+test-posixx: VALGRIND_SUPP := $C/valgrind.suppressions
+test-posixx: $B/test-posixx
+       $(call valgrind,$< --detect_memory_leak=1 --detect_fp_exceptions=1 \
+                       --report_level=$(if $V,no,short))
+
+# Run our unit tests when the "test" goal is built
+test += test-posixx
+
index 7f8519a719bed6450943c833e301021d93fb2a0b..fffeed5c985cf43dbd64618d6d60dce288c86d40 100644 (file)
 
-LOCAL_CFLAGS = -std=c++98 -Wall -pedantic -Iinclude
-LOCAL_LDFLAGS = -lboost_unit_test_framework-mt
+# Top-level directory
+T := ..
 
-TESTPRG = test_suite
-TESTCMD = ./$(TESTPRG) --detect_memory_leak=1 --report_level=short \
-               #--build_info=yes --log_level=test_suite \
-               #| grep -v "Entering test case " | grep -v "Leaving test case"
-
-VALGRIND = valgrind --tool=memcheck --leak-check=yes --db-attach=no \
-               --num-callers=24 --leak-resolution=high --track-fds=yes \
-               --suppressions=valgrind.suppressions --error-exitcode=1
-
-
-SOURCES = $(shell find -name '*.cpp')
-OBJS = $(SOURCES:.cpp=.o)
-
-
-
-ALL_CFLAGS = $(LOCAL_CFLAGS) $(LI_CFLAGS) $(CFLAGS)
-ALL_LDFLAGS = $(LOCAL_LDFLAGS) $(LI_LDFLAGS) $(LDFLAGS)
-
-ifdef RELEASE
-ALL_CFLAGS += -O3 -DNDEBUG
-endif
-
-ifdef DEBUG
-ALL_CFLAGS += -g -DDEBUG
-endif
-
-ifdef PROFILE
-ALL_CFLAGS += -g -pg -fprofile-arcs -ftest-coverage
-endif
-
-
-ifneq ($(V), 1)
-NICE_CXX = @echo "  CXX $@"; $(CXX)
-NICE_LINK = @echo "  LINK $@"; $(CXX)
-NICE_TEST = @echo "  TEST"; $(TESTCMD) > $(TESTPRG).log 2>&1
-NICE_MEMTEST = @echo "  MEMTEST"; $(VALGRIND) --log-file=valgrind.log \
-               $(TESTCMD) > valgrind.$(TESTPRG).log 2>&1
-NICE_CLEAN = @echo "  CLEAN"; $(RM)
-else
-NICE_CXX = $(CXX)
-NICE_LINK = $(CXX)
-NICE_TEST = $(TESTCMD)
-NICE_MEMTEST = $(VALGRIND) $(TESTCMD)
-NICE_CLEAN = $(RM) -v
-endif
-
-
-default: all
-
-all: $(TESTPRG)
-
-
-# dependency handling
-
-# XXX the mkdir *has* to be inside the rule, otherwise make will build the
-#     dependencies over and over again, because of this:
-#     When a file that is included in the Makefile need to be built by itself,
-#     the Makefile is re-executed after building the files to include. The
-#     problem is, the directory .deps is updated *after* the files are created
-#     in it, so when the Makefile re-executes, the files to include are created
-#     but one of it's dependencies (the .deps directory) is outdated, so the
-#     the files to include are re-built and the Makefile re-executed again,
-#     entering in an infinite loop.
-.deps/%.deps: %.cpp
-       @mkdir -p $(dir $@)
-       @set -e; rm -f $@; \
-               $(CC) -MM -MG -MP $(CPPFLAGS) $(ALL_CFLAGS) $< -MF $@.$$$$; \
-               sed 's,\($(notdir $*)\)\.o[ :]*,$(dir $<)\1.o $@ : ,g' \
-                               < $@.$$$$ > $@; \
-               rm -f $@.$$$$
-
-ifneq ($(MAKECMDGOALS),clean)
--include $(addprefix .deps/,$(OBJS:.o=.deps))
-endif
-
-
-# main build
-
-
-$(TESTPRG): $(OBJS)
-       $(NICE_LINK) $(ALL_LDFLAGS) -o $@ $^
-
-$(OBJS): include
-
-.cpp.o:
-       $(NICE_CXX) $(ALL_CFLAGS) -c $< -o $@
-
-include:
-       @mkdir -p include
-       @ln -fs ../../src include/posixx
-
-test: .test-stamp
-
-.test-stamp: $(TESTPRG)
-       $(NICE_TEST)
-       @touch $@
-
-memtest: .memtest-stamp
-
-.memtest-stamp: $(TESTPRG)
-       $(NICE_MEMTEST)
-       @touch $@
-
-clean:
-       $(NICE_CLEAN) -r $(TESTPRG) include $(OBJS) .deps valgrind.log \
-               *.bb *.bbg *.da *.gcov *.gcda *.gcno gmon.out .*-stamp
-
-.PHONY: default all test memtest clean
+# Default goal for building this directory
+.DEFAULT_GOAL := test-posixx
 
+# Include the top-level build
+include $T/Toplevel.mak