#========================================================================
# This is the toplevel Makefile for the dieharder project. It has
# some very specialized targets:
#
# make alone should build the entire application
# make install should build and install the entire application
# make installweb installs to website for download
# make installrepo installs to yum repo
#
# make tgz makes $(TGZ) of entire tree for standalone or rpm build
# make rpm makes $(RPM) packages built by dieharder.spec
# make svn does a svn commit and creates the timestamp $(SVNTIME)
# make sync does a svn commit and syncs to list of svn-tree hosts
#
# make clean cleans the source directories
#========================================================================
PROJECT = dieharder
LIBRARY = libdieharder
LIBTIME = libwulf.time
PROGRAM = dieharder
PROGTIME = dieharder.time
MANUAL = manual
MANTIME = manual.time
#========================================================================
# This is essential. The rpmbuild overrides it, but we have to make
# build "work" when executed only in the source tree directory itself.
# This isn't easy, since the dependences are more than a bit scattered.
# We therefore point to the directory one level up, where we should
# find a ./lib, ./include, ./share and ./bin directory tree from which
# the various dieharder files will actually be assembled into an rpm
# with PREFIX=/usr (for example).
#========================================================================
BUILDROOT=$(PWD)/buildroot
PREFIX=$(BUILDROOT)/usr
# The destination on a remote webserver, used as:
# $(HOME)/public_html/$(WDIR)
# on that server, and the name of an ssh-accessible login server
# that contains the public_html path.
WLOGIN = login.phy.duke.edu
WDIR = General
SVNTREE = $(HOME)/Src/svn-tree
SVNPATH = $(SVNTREE)/$(PROJECT)
SVNTIME = $(PROJECT:=.svn.time)
#========================================================================
# This is revision information that MUST be set here and ONLY here.
# It will automagically set the related information in $(SPEC) and the
# subsidiary Makefiles in the source subdirectories.
#========================================================================
VERSION_MAJOR=2
VERSION_MINOR=6.24
RELEASE=1
ABS = $(PROJECT).abs
PHP = $(PROJECT).php
# RPM/tarball target objects. We need rules for all of these.
PROJECTDIR = $(PROJECT)-$(VERSION_MAJOR).$(VERSION_MINOR)
TAR = $(PROJECTDIR).tar
TGZ = $(PROJECTDIR).tgz
SPEC = $(PROJECT).spec
#========================================================================
# List of variants one can make. all is the default. We always
# presume the simplest of dependencies and remake if includes change
# for example.
#========================================================================
all: $(LIBTIME) $(PROGTIME)
# This is not, actually, a particularly useful toplevel target. To
# work correctly it also would require a full parsing of all
# lower level dependencies. I'm leaving it in for the moment just
# to have a default target at the toplevel that CAN be used to test.
$(LIBTIME):
(cd $(LIBRARY); \
make)
$(PROGTIME):
(cd $(PROGRAM); \
make)
$(SPEC): Makefile $(SPEC)
# Version information is set ONLY in the toplevel Makefile.
cat $(SPEC) | \
sed -e 's/^\(Version:\) \(.*\)/\1 $(VERSION_MAJOR).$(VERSION_MINOR)/' \
-e 's/^\(Release:\) \(.*\)/\1 $(RELEASE)/' > /tmp/$(SPEC).$$
mv /tmp/$(SPEC).$$ $(SPEC)
# While we're at it, update program and library Makefiles
cat $(LIBRARY)/Makefile | \
sed -e 's/^\(VERSION_MAJOR=\)\(.*\)/\1$(VERSION_MAJOR)/' \
-e 's/^\(VERSION_MINOR=\)\(.*\)/\1$(VERSION_MINOR)/' \
-e 's/^\(RELEASE=\)\(.*\)/\1$(RELEASE)/' > /tmp/Makefile.$$
mv /tmp/Makefile.$$ $(LIBRARY)/Makefile
cat $(PROGRAM)/Makefile | \
sed -e 's/^\(VERSION_MAJOR=\)\(.*\)/\1$(VERSION_MAJOR)/' \
-e 's/^\(VERSION_MINOR=\)\(.*\)/\1$(VERSION_MINOR)/' \
-e 's/^\(RELEASE=\)\(.*\)/\1$(RELEASE)/' > /tmp/Makefile.$$
mv /tmp/Makefile.$$ $(PROGRAM)/Makefile
cat $(MANUAL)/Makefile | \
sed -e 's/^\(VERSION_MAJOR=\)\(.*\)/\1$(VERSION_MAJOR)/' \
-e 's/^\(VERSION_MINOR=\)\(.*\)/\1$(VERSION_MINOR)/' \
-e 's/^\(RELEASE=\)\(.*\)/\1$(RELEASE)/' > /tmp/Makefile.$$
mv /tmp/Makefile.$$ $(MANUAL)/Makefile
$(ABS): Makefile
cat $(ABS) | \
sed -e 's/^\(
Version \)\(.*\)/\1$(VERSION_MAJOR).$(VERSION_MINOR)<\/H2><\/center>/' > /tmp/$(ABS).$$
mv /tmp/$(ABS).$$ $(ABS)
#========================================================================
# This is a required target for both its own sake and to support the
# rpm build. It has to run unconditionally when called. Note that we
# make PRECISELY what we need in terms of the source directories,
# excluding all restricted material and irrelevant data.
#========================================================================
tgz: Makefile COPYING Copyright NOTES README $(SPEC) $(ABS) $(PHP)
( rm -rf $(TAR) $(TGZ) $(PROJECTDIR); \
mkdir -p $(PROJECTDIR); \
cd $(LIBRARY); \
make clean; \
cd ..; \
cp -r $(LIBRARY) $(PROJECTDIR); \
cd $(PROGRAM); \
make clean; \
cd ..; \
cp -r $(PROGRAM) $(PROJECTDIR); \
cd $(MANUAL); \
make clean; \
cd ..; \
cp -r $(MANUAL) $(PROJECTDIR); \
cp -r include $(PROJECTDIR); \
cp $(SPEC) $(PROJECTDIR); \
cp $(ABS) $(PROJECTDIR); \
cp $(PHP) $(PROJECTDIR); \
cp Makefile $(PROJECTDIR); \
cp Copyright $(PROJECTDIR); \
cp COPYING $(PROJECTDIR); \
cp README $(PROJECTDIR); \
cp NOTES $(PROJECTDIR); \
tar -cvpf $(TAR) \
--exclude=.svn \
--exclude=Cruft \
--exclude=Exclude \
--exclude=*.tar \
--exclude=*.tgz \
--exclude=*.rpm \
./$(PROJECTDIR); \
gzip $(TAR); \
mv $(TAR).gz $(TGZ); \
rm -rf $(PROJECTDIR))
#========================================================================
# rpm target special stuff
#
# To work in userspace, add the following:
# %_topdir /home/rgb/Src/redhat
# to your personal $(HOME)/.rpmmacros after building
# yourself a private copy of the /usr/src/redhat directory structure.
#
# RPM_TOPDIR=/usr/src/redhat
RPM_TOPDIR=$(HOME)/Src/rpm_tree
# This is needed to get the right library and binary rpm.
ARCH=`uname -i`
# ARCH=i386
# These are the three rpms automagically built by the spec
SSRPM = $(PROJECT)-src-$(VERSION_MAJOR).$(VERSION_MINOR)-$(RELEASE).src.rpm
SRPM = $(PROJECT)-$(VERSION_MAJOR).$(VERSION_MINOR)-$(RELEASE).src.rpm
LRPM = libdieharder-$(VERSION_MAJOR).$(VERSION_MINOR)-$(RELEASE).$(ARCH).rpm
PRPM = dieharder-$(VERSION_MAJOR).$(VERSION_MINOR)-$(RELEASE).$(ARCH).rpm
$(TGZ): tgz
$(SRPM): rpm
$(LRPM): rpm
$(PRPM): rpm
#========================================================================
# One stop shop. Basically we build this every time, we hope.
rpm: Makefile $(TGZ)
rm -rf /var/tmp/dieharder*
cp $(TGZ) $(RPM_TOPDIR)/SOURCES
cp $(SPEC) $(RPM_TOPDIR)/SPECS
rpmbuild -ba --target=$(ARCH) $(RPM_TOPDIR)/SPECS/$(SPEC)
cp $(RPM_TOPDIR)/SRPMS/$(SSRPM) $(SRPM)
cp $(RPM_TOPDIR)/RPMS/$(ARCH)/$(LRPM) .
cp $(RPM_TOPDIR)/RPMS/$(ARCH)/$(PRPM) .
svn:
echo "New Checkin `date`" >> $(SVNTIME) # Will force a commit and increment revision
svn commit .
cat $(SVNTIME) | \
sed -e '/^New Checkin/d' >> $(SVNTIME).tmp
mv $(SVNTIME).tmp $(SVNTIME)
sync:
echo "New Checkin `date`" >> $(SVNTIME) # Will force a commit and increment revision
svn commit . # Do the commit
rsync -avz --delete $(SVNPATH) login.phy.duke.edu:/home/einstein/prof/rgb/Src/svn-tree
rsync -avz --delete $(SVNPATH) 209.42.212.5:$(SVNTREE)
cat $(SVNTIME) | \
sed -e '/^New Checkin/d' >> $(SVNTIME).tmp
mv $(SVNTIME).tmp $(SVNTIME)
#========================================================================
# A standard cleanup target
#========================================================================
clean :
- (cd $(LIBRARY); \
$(MAKE) clean; \
cd ..; \
cd $(PROGRAM); \
$(MAKE) clean; \
cd ..; \
cd $(MANUAL); \
$(MAKE) clean;)
#========================================================================
# We need two toplevel targets that have to be mirrored in $(SPEC).
#========================================================================
install:
(make clean;\
make installlib;\
make installprog;\
)
# Restore this here and in the specfile when we are ready to
# actually publish the manual, which is NOT YET.
# make installman;\
installlib:
(cd $(LIBRARY);\
make BUILDROOT=$(BUILDROOT) PREFIX=$(PREFIX) install)
installprog:
(cd $(PROGRAM);\
make PREFIX=$(PREFIX) install)
installman:
(cd $(MANUAL);\
make PREFIX=$(PREFIX) install)
installweb : $(TGZ) $(RPM) $(SRPM) $(LRPM) $(PRPM) $(MRPM) $(ABS) $(PHP)
(ssh $(WLOGIN) mkdir -p public_html/$(WDIR)/$(PROJECT);\
rsync -avz $(TGZ) $(WLOGIN):public_html/$(WDIR)/$(PROJECT)/; \
rsync -avz $(SRPM) $(WLOGIN):public_html/$(WDIR)/$(PROJECT)/; \
rsync -avz $(LRPM) $(WLOGIN):public_html/$(WDIR)/$(PROJECT)/; \
rsync -avz $(PRPM) $(WLOGIN):public_html/$(WDIR)/$(PROJECT)/; \
rsync -avz $(MRPM) $(WLOGIN):public_html/$(WDIR)/$(PROJECT)/; \
rsync -avz $(ABS) $(WLOGIN):public_html/$(WDIR)/$(PROJECT)/; \
rsync -avz $(PHP) $(WLOGIN):public_html/$(WDIR)/)
REPOSERVER = uriel
REPOPATH = /var/www/html/fc/6/local/
installrepo : $(TGZ) $(RPM) $(SRPM) $(LRPM) $(PRPM) $(MRPM) $(ABS) $(PHP)
(ssh $(REPOSERVER) mkdir -p $(REPOPATH);\
rsync -avz $(TGZ) root@$(REPOSERVER):$(REPOPATH);\
rsync -avz $(SRPM) root@$(REPOSERVER):$(REPOPATH)/SRPM;\
ssh $(REPOSERVER) mkdir -p $(REPOPATH)/$(ARCH);\
rsync -avz $(LRPM) root@$(REPOSERVER):$(REPOPATH)/$(ARCH);\
rsync -avz $(PRPM) root@$(REPOSERVER):$(REPOPATH)/$(ARCH);\
rsync -avz $(MRPM) root@$(REPOSERVER):$(REPOPATH)/$(ARCH);\
ssh root@$(REPOSERVER) "cd $(REPOPATH)/$(ARCH);createrepo .")
#========================================================================
# We give all generic rules below. Currently we only need a rule for
# objects.
#========================================================================
%.o:%.c $(INCLUDES)
$(CC) -c $(CFLAGS) $<