2010-03-26 01:20:59 +02:00
# top-level Makefile for NUT
# include directory for aclocal
ACLOCAL_AMFLAGS = -I m4
# subdirectories to build and distribute. The order matters, as
2012-01-24 12:22:33 +02:00
# several subdirectories depend on stuff in "common" or tools being built first
2022-07-10 10:23:45 +03:00
SUBDIRS = include common clients conf data docs drivers tools \
2012-08-13 00:39:31 +03:00
lib scripts server tests
2010-03-26 01:20:59 +02:00
2022-07-10 10:23:45 +03:00
# 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
2011-06-01 23:31:49 +03:00
# COPYING is included automatically.
2014-04-22 21:39:47 +03:00
EXTRA_DIST = INSTALL.nut LICENSE-GPL2 LICENSE-GPL3 MAINTAINERS UPGRADING
2010-03-26 01:20:59 +02:00
# ----------------------------------------------------------------------
# flags to pass to ./configure when calling "make distcheck" and "make
# distcheck-light". Try to check as many features as possible! Also
2022-07-10 10:23:45 +03:00
# need to give augeas-lenses-dir, hotplug-dir and udev-dir, so that
# staged install does not fail.
2010-03-26 01:20:59 +02:00
2011-01-26 11:35:08 +02:00
DISTCHECK_FLAGS = --with-all --with-ssl --with-doc= auto
DISTCHECK_LIGHT_FLAGS = --with-all= auto --with-ssl= auto --with-doc= auto
2022-07-10 10:23:45 +03:00
DISTCHECK_VALGRIND_FLAGS = --with-all= auto --with-ssl= auto --with-doc= skip --with-valgrind CXXFLAGS = '$(CXXFLAGS) -g' CFLAGS = '$(CFLAGS) -g'
2010-03-26 01:20:59 +02:00
DISTCHECK_CONFIGURE_FLAGS = ${ DISTCHECK_FLAGS } \
2015-04-30 16:53:36 +03:00
--with-systemdsystemunitdir= '$${prefix}/lib/systemd/system' \
2022-07-10 10:23:45 +03:00
--with-systemdshutdowndir= '$${prefix}/lib/systemd/system-shutdown' \
--with-systemdtmpfilesdir= '$${prefix}/usr/lib/tmpfiles.d' \
--with-augeas-lenses-dir= '$${prefix}/usr/share/augeas/lenses' \
2010-03-26 01:20:59 +02:00
--with-hotplug-dir= '$${prefix}/etc/hotplug' \
2014-04-22 21:39:47 +03:00
--with-udev-dir= '$${prefix}/etc/udev' \
--with-devd-dir= '$${prefix}/etc/devd'
2010-03-26 01:20:59 +02:00
distcheck-light :
$( MAKE) $( AM_MAKEFLAGS) DISTCHECK_FLAGS = " $( DISTCHECK_LIGHT_FLAGS) " distcheck
2022-07-10 10:23:45 +03:00
# 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
2010-03-26 01:20:59 +02:00
# workaround the dist generated files that are also part of the distribution
2011-01-26 11:35:08 +02:00
# 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 :
@:
2022-07-10 10:23:45 +03:00
# 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.
d o c s p e l l c h e c k - s o r t d i c t \
a l l - d o c s c h e c k - d o c s \
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@
i f H A V E _ C P P C H E C K
cppcheck : cppcheck -cxx 11.xml cppcheck -c 99.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>$@
e l s e ! H A V E _ C P P C H E C K
cppcheck :
@echo "CPPCHECK analysis not available since 'cppcheck' was not found."
e n d i f ! H A V E _ C P P C H E C K
2015-04-30 16:53:36 +03:00
# ----------------------------------------------------------------------
2013-11-24 17:00:12 +02:00
# Automatically generate the ChangeLog from Git logs:
2022-07-10 10:23:45 +03:00
MAINTAINERCLEANFILES += ChangeLog
2015-04-30 16:53:36 +03:00
# 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
2013-11-24 17:00:12 +02:00
# Force ChangeLog regeneration upon make dist (due to nonexistant 'dummy-stamp'),
2012-01-24 12:22:33 +02:00
# in case it has already been generated previously
2022-07-10 10:23:45 +03:00
# Note that the script is hard-coded to generate "ChangeLog" in the current dir
2012-01-24 12:22:33 +02:00
dummy-stamp :
2013-11-24 17:00:12 +02:00
ChangeLog : tools /gitlog 2changelog .py dummy -stamp
2022-07-10 10:23:45 +03:00
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 /gitlog 2changelog .py .in
cd $( @D) && $( MAKE) -s $( @F)
2011-01-26 11:35:08 +02:00
2015-04-30 16:53:36 +03:00
# ----------------------------------------------------------------------
2014-04-22 21:39:47 +03:00
# Maintainers targets: distribution signature and hashes
2022-07-10 10:23:45 +03:00
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
2016-07-18 03:11:41 +03:00
rm -f nut-@PACKAGE_VERSION@.tar.gz.sig
2014-04-22 21:39:47 +03:00
gpg --detach-sign nut-@PACKAGE_VERSION@.tar.gz
2022-07-10 10:23:45 +03:00
dist-hash : nut -@PACKAGE_VERSION @.tar .gz
2014-04-22 21:39:47 +03:00
md5sum nut-@PACKAGE_VERSION@.tar.gz > nut-@PACKAGE_VERSION@.tar.gz.md5
sha256sum nut-@PACKAGE_VERSION@.tar.gz > nut-@PACKAGE_VERSION@.tar.gz.sha256
2010-03-26 01:20:59 +02:00
# ----------------------------------------------------------------------
# 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)
2022-07-10 10:23:45 +03:00
$( MAKE) installdirs
2010-03-26 01:20:59 +02:00
c g i b u i l d - c g i i n s t a l l - c g i i n s t a l l - c g i - d i r i n s t a l l - c g i - b i n \
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. "
2016-07-18 03:11:41 +03:00
@echo "Use './configure --with-dev' instead."
2010-03-26 01:20:59 +02:00
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."
2022-07-10 10:23:45 +03:00
@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