OSCAR-code/Building/Linux/rpm/generic-rpm.make
2020-12-08 21:09:18 +00:00

219 lines
4.7 KiB
Makefile

#
# Generic Makefile for RPMs
#
# Original source: https://github.com/perfsonar/pscheduler/tree/master/make-generic-rpm
# Licensed Apache Software License Version 2.0
#
# To use this file, create a Makefile containing the following:
#
# inclulde make/generic-rpm.make
#
# Targets (Shortcuts in Parentheses):
#
# build (b) - Build the RPM. This is the default target.
# clean (c) - Remove build by-products
# install (i) - Install the RPM forcibly. Must be run as a user
# that can do this.
# rpmdump (r) - Dump contents of built RPMs.
#
# Other useful shortcut targets:
#
# cb - Clean and build
# cbr - Clean, build and rpmdump
# cbi - Clean, build and install
# cbic - Clean, build and install and forced re-clean
# cbrc - Clean, build, rpmdump and forced re-clean
#
#
# To construct a tarball of your sources automatically:
#
# - Name a subdirectory with the name of the product (e.g, foomatic)
# - Specify a tarball in the source (e.g., Source0: foomatic-1.3.tar.gz)
# - Set AUTO_TARBALL=1 in your makefile
#
# NOTE: The version number in the spec may not contain hyphens.
#
#
# NO USER-SERVICEABLE PARTS BELOW THIS LINE
#
default: build
#
# Spec file and things derived from it
#
# Do this in a POSIX-y way, which precludes mindepth.
SPEC := $(shell find . -name '*.spec' | sed -e '/^\.\/[^/]*$$/!d; s/^\.\///')
ifeq "$(words $(SPEC))" "0"
$(error No spec in this directory)
endif
ifneq "$(words $(SPEC))" "1"
$(error This directory contains more than one spec file)
endif
NAME := $(shell echo "$(SPEC)" | sed -e 's/\.spec$$//')
VERSION := $(shell rpmspec -P "$(SPEC)" | awk '$$1 == "Version:" { print $$2 }')
SOURCE_FILES := $(shell spectool -S $(SPEC) | awk '{ print $$2 }')
PATCH_FILES := $(shell spectool -P $(SPEC) | awk '{ print $$2 }')
#
# Automagic source tarball construction
#
ifdef AUTO_TARBALL
ifeq "$(words $(SOURCE_FILES))" "0"
$(error No need to set AUTO_TARBALL with no sources in spec file)
endif
ifeq "$(shell [ $(words $(SOURCE_FILES)) -gt 1 ]; echo $$?)" "0"
$(error Cannot automatically build a tarball from multiple sources)
endif
ifneq "$(findstring -, $(VERSION))" ""
$(error The version number in the spec may not contain hyphens.)
endif
TARBALL_SOURCE=$(shell echo $(SOURCE_FILES) | sed -e 's/-[^-]*\.tar\.gz$$//')
TARBALL_NAME=$(TARBALL_SOURCE)-$(VERSION)
TARBALL=$(TARBALL_NAME).tar.gz
ALL_TARBALLS=$(TARBALL_SOURCE)-*.tar.gz
$(TARBALL): $(TARBALL_SOURCE)
cp -r $(TARBALL_SOURCE) $(TARBALL_NAME)
tar czf $@ $(TARBALL_NAME)
rm -rf $(TARBALL_NAME)
BUILD_DEPS += $(TARBALL)
TO_CLEAN += $(TARBALL) $(TARBALL_NAME) $(ALL_TARBALLS)
endif
#
# RPM Build Directory
#
BUILD_DIR=./rpmbuild
BUILD_BUILD=$(BUILD_DIR)/BUILD
BUILD_RPMS=$(BUILD_DIR)/RPMS
BUILD_SOURCES=$(BUILD_DIR)/SOURCES
BUILD_SPECS=$(BUILD_DIR)/SPECS
BUILD_SRPMS=$(BUILD_DIR)/SRPMS
BUILD_SUBS=\
$(BUILD_BUILD) \
$(BUILD_RPMS) \
$(BUILD_SOURCES) \
$(BUILD_SPECS) \
$(BUILD_SRPMS) \
$(BUILD_DIR): $(SPEC) $(SOURCE_FILES)
rm -rf $@
mkdir -p $(BUILD_SUBS)
cp $(SPEC) $(BUILD_SPECS)
ifneq "$(words $(SOURCE_FILES))" "0"
cp $(SOURCE_FILES) $(BUILD_SOURCES)
endif
ifneq "$(words $(PATCH_FILES))" "0"
cp $(PATCH_FILES) $(BUILD_SOURCES)
endif
TO_CLEAN += $(BUILD_DIR)
BUILD_ROOT=./BUILD-ROOT
$(BUILD_ROOT):
mkdir -p $@
TO_CLEAN += $(BUILD_ROOT)
RPM=rpm
RPMBUILD=rpmbuild
#
# Useful Targets
#
build:: $(BUILD_DEPS) $(BUILD_DIR) $(BUILD_ROOT)
set -o pipefail \
&& dnf builddep $(SPEC) \
&& HOME=$(shell pwd) \
$(RPMBUILD) -ba \
--buildroot $(shell cd $(BUILD_ROOT) && pwd) \
$(SPEC) 2>&1 \
| tee build.log
find $(BUILD_DIR) -name '*.rpm' | xargs -I{} cp {} .
TO_CLEAN += build.log
TO_CLEAN += *.rpm
srpm:: $(BUILD_DEPS) $(BUILD_DIR)
HOME=$(shell pwd) rpmbuild -v -bs $(RPMBUILD_OPTS) $(SPEC)
find $(BUILD_DIR) -name '*.src.rpm' | xargs -I{} cp {} .
TO_CLEAN += *.src.rpm
rpmdump::
@if [ -d "$(BUILD_RPMS)" ] ; then \
for RPM in `find $(BUILD_RPMS) -name '*.rpm'` ; do \
echo `basename $${RPM}`: ; \
rpm -qpl $$RPM 2>&1 | sed -e 's/^/\t/' ; \
echo ; \
done ; \
else \
echo "RPMs are not built." ; \
false ; \
fi
install::
find $(BUILD_RPMS) -name '*.rpm' | xargs $(RPM) -Uvh --force
clean::
rm -rf $(TO_CLEAN)
find . -name '*~' | xargs rm -rf
find . -depth -name Makefile \
-exec /bin/sh -c \
'[ "{}" != "./Makefile" ] && make -C `dirname {}` clean' \;
# Placeholder for running unit tests.
test::
@true
#
# Convenient shorthands
#
b: build
c: clean
i: install
r: rpmdump
cb: c b
cbr: c b r
cbi: c b i
# CBI with forced clean afterward
cbic: cbi
$(MAKE) clean
# CBR with forced clean afterward
cbrc: cbr
$(MAKE) clean