# 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