aboutsummaryrefslogtreecommitdiff
path: root/Makefile.in
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2011-06-19 20:47:29 -0700
committerAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2011-06-19 20:47:29 -0700
commit0edaecc54329048eb91ad6a45338265ef1a4569c (patch)
treeb0695be27ac3b1e14aa944c4820683fcd8adefca /Makefile.in
parente63e4fbe8794c68e1ad846a36e33cba62e801b34 (diff)
downloadpk-0edaecc54329048eb91ad6a45338265ef1a4569c.zip
pk-0edaecc54329048eb91ad6a45338265ef1a4569c.tar.gz
pk-0edaecc54329048eb91ad6a45338265ef1a4569c.tar.bz2
temporary undoing of renaming
Diffstat (limited to 'Makefile.in')
-rw-r--r--Makefile.in461
1 files changed, 461 insertions, 0 deletions
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..a072d63
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,461 @@
+#=========================================================================
+# Toplevel Makefile for the Modular C++ Build System
+#=========================================================================
+# Please read the documenation in 'mcppbs-doc.txt' for more details on
+# how the Modular C++ Build System works. For most projects, a developer
+# will not need to make any changes to this makefile. The key targets
+# are as follows:
+#
+# - default : build all libraries and programs
+# - check : build and run all unit tests
+# - install : install headers, project library, and some programs
+# - clean : remove all generated content (except autoconf files)
+# - dist : make a source tarball
+# - distcheck : make a source tarball, untar it, check it, clean it
+# - distclean : remove everything
+#
+
+#-------------------------------------------------------------------------
+# Basic setup
+#-------------------------------------------------------------------------
+
+# Remove all default implicit rules since they can cause subtle bugs
+# and they just make things run slower
+.SUFFIXES:
+% : %,v
+% : RCS/%,v
+% : RCS/%
+% : s.%
+% : SCCS/s.%
+
+# Default is to build the prereqs of the all target (defined at bottom)
+default : all
+.PHONY : default
+
+project_name := @PACKAGE_TARNAME@
+src_dir := @srcdir@
+scripts_dir := $(src_dir)/scripts
+
+# If the version information is not in the configure script, then we
+# assume that we are in a working directory. We use the vcs-version.sh
+# script in the scripts directory to generate an appropriate version
+# string. Currently the way things are setup we have to run this script
+# everytime we run make so the script needs to be as fast as possible.
+
+ifeq (@PACKAGE_VERSION@,?)
+ project_ver:=$(shell $(scripts_dir)/vcs-version.sh $(src_dir))
+else
+ project_ver:=@PACKAGE_VERSION@
+endif
+
+# Installation directories
+
+prefix := @prefix@
+enable_stow := @enable_stow@
+
+ifeq ($(enable_stow),yes)
+ stow_pkg_dir := $(prefix)/pkgs
+ DESTDIR ?= $(stow_pkg_dir)/$(project_name)-$(project_ver)
+else
+ DESTDIR ?= $(prefix)
+endif
+
+install_hdrs_dir := $(DESTDIR)/include/$(project_name)
+install_libs_dir := $(DESTDIR)/lib/$(project_name)
+install_exes_dir := $(DESTDIR)/bin
+
+#-------------------------------------------------------------------------
+# List of subprojects
+#-------------------------------------------------------------------------
+
+sprojs := @subprojects@
+sprojs_enabled := @subprojects_enabled@
+
+sprojs_include := -I. $(addprefix -I$(src_dir)/, $(sprojs_enabled))
+VPATH := $(addprefix $(src_dir)/, $(sprojs_enabled))
+
+#-------------------------------------------------------------------------
+# Programs and flags
+#-------------------------------------------------------------------------
+
+# C++ compiler
+# - CPPFLAGS : flags for the preprocessor (eg. -I,-D)
+# - CXXFLAGS : flags for C++ compiler (eg. -Wall,-g,-O3)
+
+CC := @CC@
+CFLAGS := @CFLAGS@
+COMPILE := $(CC) -MMD -MP $(CFLAGS) \
+ $(sprojs_include)
+# Linker
+# - LDFLAGS : Flags for the linker (eg. -L)
+# - LIBS : Library flags (eg. -l)
+
+LD := $(CC)
+LDFLAGS := @LDFLAGS@ -nostartfiles -nostdlib
+LIBS := @LIBS@
+LINK := $(LD) $(LDFLAGS) -T $(src_dir)/pk/pk.ld
+
+# Library creation
+
+AR := @AR@
+RANLIB := @RANLIB@
+
+# Host simulator
+
+RUN := @RUN@
+RUNFLAGS := @RUNFLAGS@
+
+# Installation
+
+MKINSTALLDIRS := $(scripts_dir)/mk-install-dirs.sh
+INSTALL := @INSTALL@
+INSTALL_HDR := $(INSTALL) -m 444
+INSTALL_LIB := $(INSTALL) -m 644
+INSTALL_EXE := $(INSTALL) -m 555
+STOW := @stow@
+
+#-------------------------------------------------------------------------
+# Include subproject makefile fragments
+#-------------------------------------------------------------------------
+
+sprojs_mk = $(addsuffix .mk, $(sprojs_enabled))
+
+-include $(sprojs_mk)
+
+dist_junk += $(sprojs_mk)
+
+#-------------------------------------------------------------------------
+# Reverse list helper function
+#-------------------------------------------------------------------------
+# This function is used by the subproject template to reverse the list
+# of dependencies. It uses recursion to perform the reversal.
+#
+# Arguments:
+# $(1) : space separated input list
+# retval : input list in reverse order
+#
+
+reverse_list = $(call reverse_list_h,$(1),)
+define reverse_list_h
+ $(if $(strip $(1)), \
+ $(call reverse_list_h, \
+ $(wordlist 2,$(words $(1)),$(1)), \
+ $(firstword $(1)) $(2)), \
+ $(2))
+endef
+
+#-------------------------------------------------------------------------
+# Template for per subproject rules
+#-------------------------------------------------------------------------
+# The template is instantiated for each of the subprojects. It relies on
+# subprojects defining a certain set of make variables which are all
+# prefixed with the subproject name. Since subproject names can have
+# dashes in them (and the make variables are assumed to only use
+# underscores) the template takes two arguments - one with the regular
+# subproject name and one with dashes replaced with underscores.
+#
+# Arguments:
+# $(1) : real subproject name (ie with dashes)
+# $(2) : normalized subproject name (ie dashes replaced with underscores)
+#
+
+define subproject_template
+
+# In some (rare) cases, a subproject might not have any actual object
+# files. It might only include header files or program sources. To keep
+# things consistent we still want a library for this subproject, so in
+# this spectial case we create a dummy source file and thus the build
+# system will create a library for this subproject with just the
+# corresponding dummy object file.
+
+ifeq ($$(strip $$($(2)_c_srcs)),)
+$(2)_c_srcs += _$(1).c
+$(2)_junk += _$(1).c
+endif
+
+_$(1).c :
+ echo "int _$(2)( int arg ) { return arg; }" > $$@
+
+# Build the object files for this subproject
+
+$(2)_c_objs := $$(patsubst %.c, %.o, $$($(2)_c_srcs))
+$(2)_asm_objs := $$(patsubst %.S, %.o, $$($(2)_asm_srcs))
+$(2)_c_deps := $$(patsubst %.o, %.d, $$($(2)_c_objs))
+$$($(2)_c_objs) : %.o : %.c
+ $(COMPILE) -c $$<
+$$($(2)_asm_objs) : %.o : %.S
+ $(COMPILE) -c $$<
+
+$(2)_junk += $$($(2)_c_objs) $$($(2)_c_deps) $$($(2)_asm_objs)
+
+# Build a library for this subproject
+
+lib$(1).a : $$($(2)_c_objs) $$($(2)_asm_objs)
+ $(AR) rcv $$@ $$^
+ $(RANLIB) $$@
+
+$(2)_junk += lib$(1).a
+
+# Reverse the dependency list so that a given subproject only depends on
+# subprojects listed to its right. This is the correct order for linking
+# the list of subproject libraries.
+
+$(2)_reverse_deps := $$(call reverse_list,$$($(2)_subproject_deps))
+
+# Build unit tests
+
+$(2)_test_objs := $$(patsubst %.c, %.o, $$($(2)_test_srcs))
+$(2)_test_deps := $$(patsubst %.o, %.d, $$($(2)_test_objs))
+$(2)_test_exes := $$(patsubst %.t.c, %-utst, $$($(2)_test_srcs))
+$(2)_test_outs := $$(patsubst %, %.out, $$($(2)_test_exes))
+$(2)_test_libs := $(1) $$($(2)_reverse_deps) utst
+$(2)_test_libnames := $$(patsubst %, lib%.a, $$($(2)_test_libs))
+$(2)_test_libarg := -L. $$(patsubst %, -l%, $$($(2)_test_libs))
+
+$$($(2)_test_objs) : %.o : %.c
+ $(COMPILE) -c $$<
+
+$$($(2)_test_exes) : %-utst : %.t.o $$($(2)_test_libnames)
+ $(LINK) -o $$@ $$< $$($(2)_test_libarg) $(LIBS)
+
+$(2)_c_deps += $$($(2)_test_deps)
+$(2)_junk += \
+ $$($(2)_test_objs) $$($(2)_test_deps) \
+ $$($(2)_test_exes) *.junk-dat
+
+# Run unit tests
+
+$$($(2)_test_outs) : %.out : %
+ $(RUN) $(RUNFLAGS) ./$$< default | tee $$@
+
+$(2)_junk += $$($(2)_test_outs)
+
+# Build programs
+
+$(2)_prog_objs := $$(patsubst %.S, %.o, $$($(2)_prog_srcs))
+$(2)_prog_deps := $$(patsubst %.o, %.d, $$($(2)_prog_objs))
+$(2)_prog_exes := $$(patsubst %.S, %, $$($(2)_prog_srcs))
+$(2)_prog_libs := $(1) $$($(2)_reverse_deps)
+$(2)_prog_libnames := $$(patsubst %, lib%.a, $$($(2)_prog_libs))
+$(2)_prog_libarg := -L. $$(patsubst %, -l%, $$($(2)_prog_libs))
+
+$$($(2)_prog_objs) : %.o : %.S
+ $(COMPILE) -c $$<
+
+$$($(2)_prog_exes) : % : %.o $$($(2)_prog_libnames)
+ $(LINK) -o $$@ $$< $$($(2)_prog_libarg) $(LIBS)
+
+$(2)_c_deps += $$($(2)_prog_deps)
+$(2)_junk += $$($(2)_prog_objs) $$($(2)_prog_deps) $$($(2)_prog_exes)
+
+# Build programs which will be installed
+
+$(2)_install_prog_objs := $$(patsubst %.S, %.o, $$($(2)_install_prog_srcs))
+$(2)_install_prog_deps := $$(patsubst %.o, %.d, $$($(2)_install_prog_objs))
+$(2)_install_prog_exes := $$(patsubst %.S, %, $$($(2)_install_prog_srcs))
+
+$$($(2)_install_prog_objs) : %.o : %.S
+ $(COMPILE) -c $$<
+
+$$($(2)_install_prog_exes) : % : %.o $$($(2)_prog_libnames)
+ $(LINK) -o $$@ $$< $$($(2)_prog_libarg) $(LIBS)
+
+$(2)_c_deps += $$($(2)_install_prog_deps)
+$(2)_junk += \
+ $$($(2)_install_prog_objs) $$($(2)_install_prog_deps) \
+ $$($(2)_install_prog_exes)
+
+# Subproject specific targets
+
+all-$(1) : lib$(1).a $$($(2)_install_prog_exes)
+
+check-$(1) : $$($(2)_test_outs)
+ echo; grep -h -e'Unit Tests' -e'FAILED' -e'Segementation' $$^; echo
+
+clean-$(1) :
+ rm -rf $$($(2)_junk)
+
+.PHONY : all-$(1) check-$(1) clean-$(1)
+
+# Update running variables
+
+libs += lib$(1).a
+objs += $$($(2)_c_objs)
+srcs += $$(addprefix $(src_dir)/$(1)/, $$($(2)_c_srcs))
+hdrs += $$(addprefix $(src_dir)/$(1)/, $$($(2)_hdrs))
+junk += $$($(2)_junk)
+deps += $$($(2)_c_deps)
+
+test_outs += $$($(2)_test_outs)
+
+install_hdrs += $$(addprefix $(src_dir)/$(1)/, $$($(2)_hdrs))
+install_libs += lib$(1).a
+install_exes += $$($(2)_install_prog_exes)
+
+endef
+
+# Iterate over the subprojects and call the template for each one
+
+$(foreach sproj,$(sprojs_enabled), \
+ $(eval $(call subproject_template,$(sproj),$(subst -,_,$(sproj)))))
+
+#-------------------------------------------------------------------------
+# Autodependency files
+#-------------------------------------------------------------------------
+
+-include $(deps)
+
+deps : $(deps)
+.PHONY : deps
+
+#-------------------------------------------------------------------------
+# Check
+#-------------------------------------------------------------------------
+
+check : $(test_outs)
+ echo; grep -h -e'Unit Tests' -e'FAILED' -e'Segementation' $^; echo
+
+.PHONY : check
+
+#-------------------------------------------------------------------------
+# Installation
+#-------------------------------------------------------------------------
+
+install-hdrs : $(install_hdrs)
+ $(MKINSTALLDIRS) $(install_hdrs_dir)
+ for file in $(install_hdrs); \
+ do \
+ $(INSTALL_HDR) $$file $(install_hdrs_dir); \
+ done
+
+install-libs : $(install_libs)
+ $(MKINSTALLDIRS) $(install_libs_dir)
+ for file in $(install_libs); \
+ do \
+ $(INSTALL_LIB) $$file $(install_libs_dir); \
+ done
+
+install-exes : $(install_exes)
+ $(MKINSTALLDIRS) $(install_exes_dir)
+ for file in $(install_exes); \
+ do \
+ $(INSTALL_EXE) $$file $(install_exes_dir); \
+ done
+
+install : install-hdrs install-libs install-exes
+ifeq ($(enable_stow),yes)
+ $(MKINSTALLDIRS) $(stow_pkg_dir)
+ cd $(stow_pkg_dir) && \
+ $(STOW) --delete $(project_name)-* && \
+ $(STOW) $(project_name)-$(project_ver)
+endif
+
+.PHONY : install install-hdrs install-libs install-exes
+
+#-------------------------------------------------------------------------
+# Regenerate configure information
+#-------------------------------------------------------------------------
+
+configure_prereq = \
+ $(src_dir)/configure.ac \
+ $(src_dir)/aclocal.m4 \
+ $(join $(addprefix $(src_dir)/, $(sprojs_enabled)), \
+ $(patsubst %, /%.ac, $(sprojs_enabled)))
+
+$(src_dir)/configure : $(configure_prereq)
+ cd $(src_dir) && autoconf && autoheader
+
+config.status : $(src_dir)/configure
+ ./config.status --recheck
+
+sprojs_mk_in = \
+ $(join $(addprefix $(src_dir)/, $(sprojs_enabled)), \
+ $(patsubst %, /%.mk.in, $(sprojs_enabled)))
+
+Makefile : $(src_dir)/Makefile.in $(sprojs_mk_in) config.status
+ ./config.status
+
+dist_junk += config.status config.h Makefile config.log
+
+#-------------------------------------------------------------------------
+# Distribution
+#-------------------------------------------------------------------------
+# The distribution tarball is named project-ver.tar.gz and it includes
+# both enabled and disabled subprojects.
+
+dist_files = \
+ $(sprojs) \
+ README \
+ style-guide.txt \
+ mcppbs-uguide.txt \
+ scripts \
+ configure.ac \
+ aclocal.m4 \
+ configure \
+ config.h.in \
+ Makefile.in \
+
+dist_dir := $(project_name)-$(project_ver)
+dist_tgz := $(project_name)-$(project_ver).tar.gz
+
+# Notice that when we make the distribution we rewrite the configure.ac
+# script with the current version and we rerun autoconf in the new
+# source directory so that the distribution will have the proper version
+# information. We also rewrite the "Version : " line in the README.
+
+dist :
+ rm -rf $(dist_dir)
+ mkdir $(dist_dir)
+ tar -C $(src_dir) -cf - $(dist_files) | tar -C $(dist_dir) -xpf -
+ sed -i.bak 's/^\(# Version :\).*/\1 $(project_ver)/' $(dist_dir)/README
+ sed -i.bak 's/\( proj_version,\).*/\1 [$(project_ver)])/' $(dist_dir)/configure.ac
+ cd $(dist_dir) && \
+ autoconf && autoheader && \
+ rm -rf autom4te.cache configure.ac.bak README.bak
+ tar -czvf $(dist_tgz) $(dist_dir)
+ rm -rf $(dist_dir)
+
+# You can use the distcheck target to try untarring the distribution and
+# then running configure, make, make check, and make distclean. A
+# "directory is not empty" error means distclean is not removing
+# everything.
+
+distcheck : dist
+ rm -rf $(dist_dir)
+ tar -xzvf $(dist_tgz)
+ mkdir -p $(dist_dir)/build
+ cd $(dist_dir)/build; ../configure; make; make check; make distclean
+ rm -rf $(dist_dir)
+
+junk += $(project_name)-*.tar.gz
+
+.PHONY : dist distcheck
+
+#-------------------------------------------------------------------------
+# Default
+#-------------------------------------------------------------------------
+
+all : $(install_hdrs) $(install_libs) $(install_exes)
+.PHONY : all
+
+#-------------------------------------------------------------------------
+# Makefile debugging
+#-------------------------------------------------------------------------
+# This handy rule will display the contents of any make variable by
+# using the target debug-<varname>. So for example, make debug-junk will
+# display the contents of the junk variable.
+
+debug-% :
+ @echo $* = $($*)
+
+#-------------------------------------------------------------------------
+# Clean up junk
+#-------------------------------------------------------------------------
+
+clean :
+ rm -rf *~ \#* $(junk)
+
+distclean :
+ rm -rf *~ \#* $(junk) $(dist_junk)
+
+.PHONY : clean distclean