349 lines
15 KiB
Makefile
349 lines
15 KiB
Makefile
# top-level Makefile for NUT
|
|
|
|
# include directory for aclocal
|
|
ACLOCAL_AMFLAGS = -I m4
|
|
|
|
# subdirectories to build and distribute. The order matters, as
|
|
# several subdirectories depend on stuff in "common" or tools being built first
|
|
SUBDIRS = include common clients conf data docs drivers tools \
|
|
lib scripts server tests
|
|
|
|
# Automatically update the libtool script if it becomes out-of-date
|
|
# See https://www.gnu.org/software/libtool/manual/html_node/LT_005fINIT.html
|
|
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
|
libtool: $(LIBTOOL_DEPS)
|
|
$(SHELL) ./config.status libtool
|
|
|
|
# COPYING is included automatically.
|
|
EXTRA_DIST = INSTALL.nut LICENSE-GPL2 LICENSE-GPL3 MAINTAINERS UPGRADING
|
|
|
|
# ----------------------------------------------------------------------
|
|
# flags to pass to ./configure when calling "make distcheck" and "make
|
|
# distcheck-light". Try to check as many features as possible! Also
|
|
# need to give augeas-lenses-dir, hotplug-dir and udev-dir, so that
|
|
# staged install does not fail.
|
|
|
|
DISTCHECK_FLAGS = --with-all --with-ssl --with-doc=auto
|
|
DISTCHECK_LIGHT_FLAGS = --with-all=auto --with-ssl=auto --with-doc=auto
|
|
DISTCHECK_VALGRIND_FLAGS = --with-all=auto --with-ssl=auto --with-doc=skip --with-valgrind CXXFLAGS='$(CXXFLAGS) -g' CFLAGS='$(CFLAGS) -g'
|
|
|
|
DISTCHECK_CONFIGURE_FLAGS = ${DISTCHECK_FLAGS} \
|
|
--with-systemdsystemunitdir='$${prefix}/lib/systemd/system' \
|
|
--with-systemdshutdowndir='$${prefix}/lib/systemd/system-shutdown' \
|
|
--with-systemdtmpfilesdir='$${prefix}/usr/lib/tmpfiles.d' \
|
|
--with-augeas-lenses-dir='$${prefix}/usr/share/augeas/lenses' \
|
|
--with-hotplug-dir='$${prefix}/etc/hotplug' \
|
|
--with-udev-dir='$${prefix}/etc/udev' \
|
|
--with-devd-dir='$${prefix}/etc/devd'
|
|
|
|
distcheck-light:
|
|
$(MAKE) $(AM_MAKEFLAGS) DISTCHECK_FLAGS="$(DISTCHECK_LIGHT_FLAGS)" distcheck
|
|
|
|
# Make a distcheck (and check in particular) with enabled valgrind and debug info
|
|
memcheck distcheck-valgrind:
|
|
$(MAKE) $(AM_MAKEFLAGS) DISTCHECK_FLAGS="$(DISTCHECK_VALGRIND_FLAGS)" distcheck
|
|
|
|
# workaround the dist generated files that are also part of the distribution
|
|
# Note that distcleancheck is disabled for now, while waiting for a proper
|
|
# solution, that do not break older unix systems
|
|
#distcleancheck_listfiles = \
|
|
# find . -type f -exec sh -c 'test -f $(srcdir)/{} || echo {}' ';'
|
|
distcleancheck:
|
|
@:
|
|
|
|
# Quick alias for root dir recipe:
|
|
realclean: maintainer-clean
|
|
|
|
# Files made by our targets:
|
|
CLEANFILES = *-spellchecked cppcheck*.xml
|
|
DISTCLEANFILES = ChangeLog
|
|
|
|
# Most of the files generated by custom rules in the configure script
|
|
# or by autogen.sh are cleaned by the Makefile.am in their directories.
|
|
# Files below are re-created by running `configure` script and may be
|
|
# wiped by a `make distclean`:
|
|
DISTCLEANFILES += config.log configure~
|
|
#???# configure.ac~
|
|
DISTCLEANFILES += include/config.h.in~
|
|
|
|
# Files made by autotools and common rituals of the configure script,
|
|
# these are needed to run the configure script itself so are not wiped
|
|
# by a mere `make distclean`; most of these are copied by autotools
|
|
# from their installation, or made by `automake` etc. on the system
|
|
# which generates `configure`; rebuilding NUT after deleting these
|
|
# requires `autogen.sh` script to be re-run (and tools available):
|
|
MAINTAINERCLEANFILES = INSTALL
|
|
MAINTAINERCLEANFILES += aclocal.m4 config.guess config.sub
|
|
MAINTAINERCLEANFILES += configure
|
|
MAINTAINERCLEANFILES += depcomp install-sh ltmain.sh test-driver
|
|
MAINTAINERCLEANFILES += m4/libtool.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 m4/lt~obsolete.m4
|
|
MAINTAINERCLEANFILES += Makefile.in .dirstamp include/config.h.in
|
|
|
|
# Executed after default rules
|
|
maintainer-clean-local:
|
|
rm -f missing || true
|
|
|
|
# Do not let $SUBDIRS/Makefile rules delete their local .deps because
|
|
# this breaks our ability to clean up (e.g. some common/.../*.Plo files
|
|
# are included by generated Makefiles from other subdirectories, so they
|
|
# should be available during their clean-up). Just in case, we make sure
|
|
# here that their sub-distcleans complete first.
|
|
distclean-local:
|
|
@for DIR in $(SUBDIRS) ; do \
|
|
if test -f "$${DIR}/Makefile" ; then \
|
|
echo " DISTCLEAN in $${DIR}" >&2 ; \
|
|
( cd "$${DIR}" && $(MAKE) -s distclean ) || exit ; \
|
|
fi ; \
|
|
done
|
|
rm -rf .inst tmp autom4te.cache
|
|
find "$(builddir)" -type d -name '.deps' | while read DIR ; do rm -rf "$${DIR}" ; done
|
|
|
|
# Hook the documentation building and validating recipes
|
|
# Note: these are optionally available (as determined during configure runs)
|
|
spellcheck spellcheck-interactive:
|
|
@RES=0; \
|
|
(cd $(builddir)/docs && $(MAKE) -s $@) || RES=$$? ; \
|
|
(cd $(builddir)/docs/man && $(MAKE) -s $@) || RES=$$? ; \
|
|
(cd $(builddir)/conf && $(MAKE) -s $@) || RES=$$? ; \
|
|
(cd $(builddir)/data && $(MAKE) -s $@) || RES=$$? ; \
|
|
exit $$RES
|
|
|
|
# Note: the "all-docs" and "check-docs" targets may require tools not
|
|
# found by `configure` script (and so avoided by conventional recipes)
|
|
# such as PDF generators, so it should only be called at developer's
|
|
# discretion, choice and risk. The "check-man" targets covers source
|
|
# texts, man pages and HTML rendering of man pages, as enabled by tools.
|
|
doc spellcheck-sortdict \
|
|
all-docs check-docs \
|
|
man all-man man-man check-man man-html all-html:
|
|
cd $(builddir)/docs && $(MAKE) $@
|
|
|
|
check-NIT check-NIT-devel:
|
|
cd $(builddir)/tests/NIT && $(MAKE) $@
|
|
|
|
# This target adds syntax-checking for committed shell script files,
|
|
# to avoid surprises and delays in finding fatal typos after packaging
|
|
###
|
|
### Note: currently, shellcheck target calls check-scripts-syntax
|
|
### so when both are invoked at once, in the end the check is only
|
|
### executed once. Later it is anticipated that shellcheck would
|
|
### be implemented by requiring, configuring and calling the tool
|
|
### named "shellcheck" for even more code inspection and details.
|
|
### Still, there remains value in also checking the script syntax
|
|
### by the very version of the shell interpreter that would run
|
|
### these scripts in production usage of the resulting packages.
|
|
###
|
|
check-scripts-syntax:
|
|
@echo 'NOTE: modern bash complains about scripts using backticks (warning not error), which we ignore in NUT codebase for portability reasons: `...` obsolete, use $$(...)'
|
|
@RUNBASH=bash; if [ -x /bin/bash ]; then RUNBASH=/bin/bash ; else if [ -x /usr/bin/env ] ; then RUNBASH="/usr/bin/env bash"; fi; fi ; \
|
|
for F in `git ls-files || find . -type f` ; do \
|
|
case "`file "$$F"`" in \
|
|
*"Bourne-Again shell script"*) ( set -x ; $$RUNBASH -n "$$F" ; ) ;; \
|
|
*"POSIX shell script"*|*"shell script"*) ( set -x ; /bin/sh -n "$$F" ; ) ;; \
|
|
esac || { RES=$$? ; echo "ERROR: Syntax check failed for script file: $$F" >&2 ; exit $$RES ; } ; \
|
|
done
|
|
@echo 'SUCCESS: Shell scripts syntax is acceptable, no fatal issues were found'
|
|
|
|
shellcheck-disclaimer:
|
|
@echo "==============================================================================="
|
|
@echo "NOTICE: 'make shellcheck' is currently an alias for 'make check-scripts-syntax'"
|
|
@echo "Later it may become a call to the real shellcheck tool (if available on the"
|
|
@echo "build system during the configure phase)"
|
|
@echo "==============================================================================="
|
|
|
|
# Note: currently not part of shellcheck target, because the script below
|
|
# can test the logic with numerous SHELL_PROGS in a CI setting, and because
|
|
# check-scripts-syntax probably has checked the basic syntax above already.
|
|
shellcheck-nde:
|
|
cd $(srcdir)/tests && SERVICE_FRAMEWORK="selftest" ./nut-driver-enumerator-test.sh
|
|
|
|
shellcheck: shellcheck-disclaimer check-scripts-syntax
|
|
|
|
CPPCHECK = @CPPCHECK@
|
|
if HAVE_CPPCHECK
|
|
cppcheck: cppcheck-cxx11.xml cppcheck-c99.xml
|
|
|
|
# Let the analysis get regenerated due to any change in source;
|
|
# but note that with our different make implementations to support,
|
|
# we can not either $(shell find ...) nor blindly say e.g. *.cpp
|
|
# for each FS structure layer because e.g. there are no ./*.cpp
|
|
# in the root dir of the codebase (and so make complains there is
|
|
# `No rule to make target `*.cpp', needed by `cppcheck-cxx11.xml'`)
|
|
#
|
|
# Note that the actual `cppcheck` scan finds all files it likes
|
|
# (so if CPPCHECK_SRC_* misses something, it just won't trigger
|
|
# automagically a rebuild of the XML in developer working cycles).
|
|
CPPCHECK_SRC_H = $(top_srcdir)/*/*.h $(top_srcdir)/*/*/*.h
|
|
# CPPCHECK_SRC_H += $(top_srcdir)/*.h
|
|
|
|
CPPCHECK_SRC_C = $(top_srcdir)/*/*.c $(top_srcdir)/*/*/*.c
|
|
# CPPCHECK_SRC_C += $(top_srcdir)/*.cpp
|
|
|
|
CPPCHECK_SRC_CXX = $(top_srcdir)/*/*.cpp
|
|
# CPPCHECK_SRC_CXX += $(top_srcdir)/*.cpp $(top_srcdir)/*/*/*.cpp
|
|
|
|
cppcheck-cxx11.xml: $(CPPCHECK_SRC_CXX) $(CPPCHECK_SRC_H)
|
|
$(CPPCHECK) --std=c++11 --enable=all --inconclusive --xml --xml-version=2 . 2>$@
|
|
|
|
cppcheck-c99.xml: $(CPPCHECK_SRC_C) $(CPPCHECK_SRC_H)
|
|
$(CPPCHECK) --std=c99 --enable=all --inconclusive --xml --xml-version=2 . 2>$@
|
|
else !HAVE_CPPCHECK
|
|
cppcheck:
|
|
@echo "CPPCHECK analysis not available since 'cppcheck' was not found."
|
|
endif !HAVE_CPPCHECK
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Automatically generate the ChangeLog from Git logs:
|
|
MAINTAINERCLEANFILES += ChangeLog
|
|
|
|
# Older boundary of the ChangeLog commits range
|
|
# It can be a tag ('v2.2.0'), a commit hash, a date, ...
|
|
# See gitrevisions for more information on specifying ranges
|
|
GITLOG_START_POINT=v2.6.0
|
|
|
|
# Force ChangeLog regeneration upon make dist (due to nonexistant 'dummy-stamp'),
|
|
# in case it has already been generated previously
|
|
# Note that the script is hard-coded to generate "ChangeLog" in the current dir
|
|
dummy-stamp:
|
|
ChangeLog: tools/gitlog2changelog.py dummy-stamp
|
|
cd $(top_builddir) && \
|
|
./tools/gitlog2changelog.py $(GITLOG_START_POINT) || \
|
|
{ echo "gitlog2changelog.py failed to generate the ChangeLog. See https://github.com/networkupstools/nut/commits/master" > $@ ; }
|
|
|
|
nut_version.h include/nut_version.h:
|
|
cd $(abs_top_builddir)/include && $(MAKE) nut_version.h
|
|
|
|
tools/gitlog2changelog.py: tools/gitlog2changelog.py.in
|
|
cd $(@D) && $(MAKE) -s $(@F)
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Maintainers targets: distribution signature and hashes
|
|
nut-@PACKAGE_VERSION@.tar.gz: dist
|
|
nut-@PACKAGE_VERSION@.tar.gz.sig: dist-sig
|
|
nut-@PACKAGE_VERSION@.tar.gz.md5 nut-@PACKAGE_VERSION@.tar.gz.sha256: dist-hash
|
|
|
|
dist-sig: nut-@PACKAGE_VERSION@.tar.gz
|
|
rm -f nut-@PACKAGE_VERSION@.tar.gz.sig
|
|
gpg --detach-sign nut-@PACKAGE_VERSION@.tar.gz
|
|
|
|
dist-hash: nut-@PACKAGE_VERSION@.tar.gz
|
|
md5sum nut-@PACKAGE_VERSION@.tar.gz > nut-@PACKAGE_VERSION@.tar.gz.md5
|
|
sha256sum nut-@PACKAGE_VERSION@.tar.gz > nut-@PACKAGE_VERSION@.tar.gz.sha256
|
|
|
|
# ----------------------------------------------------------------------
|
|
# targets from old build system (pre-automake).
|
|
# supported for a period of time for backward "compatibility".
|
|
|
|
WARN="----------------------------------------------------------------------"
|
|
|
|
build:
|
|
@echo $(WARN)
|
|
@echo "Warning: 'make build' is deprecated. Use 'make all' instead."
|
|
@echo $(WARN)
|
|
$(MAKE) $(AM_MAKEFLAGS) all
|
|
install-bin:
|
|
@echo $(WARN)
|
|
@echo "Warning: 'make install-bin' is deprecated."
|
|
@echo "Use 'make install-exec' instead for a similar effect."
|
|
@echo $(WARN)
|
|
cd common; $(MAKE) $(AM_MAKEFLAGS) install
|
|
cd drivers; $(MAKE) $(AM_MAKEFLAGS) install
|
|
cd server; $(MAKE) $(AM_MAKEFLAGS) install
|
|
cd clients; $(MAKE) $(AM_MAKEFLAGS) install
|
|
install-man: install-data-recursive
|
|
@echo $(WARN)
|
|
@echo "Warning: 'make install-man' is deprecated."
|
|
@echo "Use 'cd man; make install' instead."
|
|
@echo $(WARN)
|
|
cd man; $(MAKE) $(AM_MAKEFLAGS) install
|
|
install-conf:
|
|
@echo $(WARN)
|
|
@echo "Warning: 'make install-conf' is deprecated."
|
|
@echo "Use 'cd conf; make install' instead."
|
|
@echo $(WARN)
|
|
cd conf; $(MAKE) $(AM_MAKEFLAGS) install
|
|
# The target install-data already has a standardized meaning under automake
|
|
install-dirs:
|
|
@echo $(WARN)
|
|
@echo "Warning: 'make install-dirs' is deprecated."
|
|
@echo "Use 'make installdirs' instead."
|
|
@echo $(WARN)
|
|
$(MAKE) installdirs
|
|
cgi build-cgi install-cgi install-cgi-dir install-cgi-bin \
|
|
install-cgi-man install-cgi-conf install-cgi-html:
|
|
@echo "Error: 'make $@' no longer exists."
|
|
@echo "Use './configure --with-cgi' instead."
|
|
install-lib:
|
|
@echo "Error: 'make $@' no longer exists."
|
|
@echo "Use './configure --with-dev' instead."
|
|
usb build-usb install-usb:
|
|
@echo "Error: 'make $@' no longer exists."
|
|
@echo "Use './configure --with-usb' instead."
|
|
snmp build-snmp install-snmp install-snmp-mgr install-snmp-man:
|
|
@echo "Error: 'make $@' no longer exists."
|
|
@echo "Use './configure --with-snmp' instead."
|
|
setver:
|
|
@echo "Error: 'make setver' no longer exists."
|
|
@echo "Edit configure.ac to set version number."
|
|
|
|
# Clean the dist tarball and packages
|
|
MAINTAINERCLEANFILES_DISTBALL = nut-*.tar.gz
|
|
# HP-UX:
|
|
MAINTAINERCLEANFILES_PACKAGES = NUT_HPUX_package@PACKAGE_VERSION@.depot
|
|
# AIX as below, and RedHat-compatible (cover binary and source packages):
|
|
MAINTAINERCLEANFILES_PACKAGES += nut*rpm
|
|
# Debian-compatible (cover binary and source packages):
|
|
MAINTAINERCLEANFILES_PACKAGES += nut*deb
|
|
# Solaris SVR4 package archives:
|
|
MAINTAINERCLEANFILES_PACKAGES += NUT_solaris_*_package@PACKAGE_VERSION@.local.gz
|
|
# Newer Solaris IPS (aka "pkg(5)" format archives)
|
|
MAINTAINERCLEANFILES_PACKAGES += *.p5p
|
|
|
|
MAINTAINERCLEANFILES += $(MAINTAINERCLEANFILES_DISTBALL)
|
|
MAINTAINERCLEANFILES += $(MAINTAINERCLEANFILES_PACKAGES)
|
|
|
|
package: dist
|
|
DESTDIR="$(abs_builddir)/_install_pkgprotodir" ; export DESTDIR; \
|
|
rm -rf "$$DESTDIR"; \
|
|
case "`uname -s`" in \
|
|
"HP-UX") \
|
|
( cd scripts/HP-UX && \
|
|
$(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$DESTDIR" package && \
|
|
mv NUT_HPUX_package.depot $(abs_top_builddir)/NUT_HPUX_package@PACKAGE_VERSION@.depot ) ;; \
|
|
"SunOS") \
|
|
$(MAKE) $(AM_MAKEFLAGS) && \
|
|
$(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$DESTDIR" install && \
|
|
( cd scripts/Solaris && \
|
|
$(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$DESTDIR" package ) && \
|
|
$(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$DESTDIR" uninstall && \
|
|
rm -rf "$$DESTDIR" || \
|
|
{ echo "FAILED to produce SunOS packages, inspect '$$DESTDIR' for clues" >&2 ; exit 1; } ;; \
|
|
"AIX") \
|
|
if test -d /usr/src/packages/SPECS -a -w /usr/src/packages/SPECS ; then : ; else echo "Can not write to /usr/src/packages/SPECS" >&2 ; exit 1; fi ; \
|
|
if test -d /usr/src/packages/SOURCES -a -w /usr/src/packages/SOURCES ; then : ; else echo "Can not write to /usr/src/packages/SOURCES" >&2 ; exit 1; fi ; \
|
|
$(MAKE) $(AM_MAKEFLAGS) dist && \
|
|
cp scripts/Aix/nut-aix.spec /usr/src/packages/SPECS && \
|
|
cp scripts/Aix/nut.init nut-@PACKAGE_VERSION@.tar.gz /usr/src/packages/SOURCES && \
|
|
rpm -ba /usr/src/packages/SPECS/nut-aix.spec && \
|
|
mv /usr/src/packages/RPMS/nut*rpm $(abs_top_builddir)/ ;; \
|
|
*) echo "Unsupported OS for 'make $@' (no recipe bound)" >&2; exit 1;; \
|
|
esac
|
|
|
|
print-MAINTAINERCLEANFILES print-REALCLEANFILES:
|
|
@echo $(MAINTAINERCLEANFILES)
|
|
|
|
print-DISTCLEANFILES:
|
|
@echo $(DISTCLEANFILES)
|
|
|
|
# TODO: Recursive mode to consider patterns defined in sub-dir makefiles
|
|
git-realclean-check:
|
|
@if test -e .git && (command -v git); then \
|
|
git status --ignored || while read F ; do \
|
|
for P in $(MAINTAINERCLEANFILES) ; do \
|
|
case "$$F" in \
|
|
*/$$P) exit 1 ;; \
|
|
esac ; \
|
|
done; \
|
|
done ; \
|
|
fi
|