summaryrefslogtreecommitdiffstats
path: root/devel/Makefile.am
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 06:53:20 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 06:53:20 +0000
commite5a812082ae033afb1eed82c0f2df3d0f6bdc93f (patch)
treea6716c9275b4b413f6c9194798b34b91affb3cc7 /devel/Makefile.am
parentInitial commit. (diff)
downloadpacemaker-e5a812082ae033afb1eed82c0f2df3d0f6bdc93f.tar.xz
pacemaker-e5a812082ae033afb1eed82c0f2df3d0f6bdc93f.zip
Adding upstream version 2.1.6.upstream/2.1.6
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'devel/Makefile.am')
-rw-r--r--devel/Makefile.am295
1 files changed, 295 insertions, 0 deletions
diff --git a/devel/Makefile.am b/devel/Makefile.am
new file mode 100644
index 0000000..94581e1
--- /dev/null
+++ b/devel/Makefile.am
@@ -0,0 +1,295 @@
+#
+# Copyright 2020-2023 the Pacemaker project contributors
+#
+# The version control history for this file may have further details.
+#
+# This source code is licensed under the GNU General Public License version 2
+# or later (GPLv2+) WITHOUT ANY WARRANTY.
+#
+
+include $(top_srcdir)/mk/common.mk
+include $(top_srcdir)/mk/release.mk
+
+# Coccinelle is a tool that takes special patch-like files (called semantic patches) and
+# applies them throughout a source tree. This is useful when refactoring, changing APIs,
+# catching dangerous or incorrect code, and other similar tasks. It's not especially
+# easy to write a semantic patch but most users should only be concerned about running
+# the target and inspecting the results.
+#
+# Documentation (including examples, which are the most useful):
+# https://coccinelle.gitlabpages.inria.fr/website/docs/
+#
+# Run the "make cocci" target to just output what would be done, or "make cocci-inplace"
+# to apply the changes to the source tree.
+#
+# COCCI_FILES may be set on the command line, if you want to test just a single file
+# while it's under development. Otherwise, it is a list of all the files that are ready
+# to be run.
+#
+# ref-passed-variables-inited.cocci seems to be returning some false positives around
+# GHashTableIters, so it is disabled for the moment.
+COCCI_FILES ?= coccinelle/string-any-of.cocci \
+ coccinelle/string-empty.cocci \
+ coccinelle/string-null-matches.cocci \
+ coccinelle/use-func.cocci
+
+
+dist_noinst_SCRIPTS = coccinelle/test/testrunner.sh
+EXTRA_DIST = README gdbhelpers $(COCCI_FILES) \
+ coccinelle/ref-passed-variables-inited.cocci \
+ coccinelle/rename-fn.cocci \
+ coccinelle/test/ref-passed-variables-inited.input.c \
+ coccinelle/test/ref-passed-variables-inited.output
+
+# Any file in this list is allowed to use any of the pcmk__ internal functions.
+# Coccinelle can use any transformation that depends on "internal" to rewrite
+# code to use the internal functions.
+MAY_USE_INTERNAL_FILES = $(shell find .. -path "../lib/*.c" -o -path "../lib/*private.h" -o -path "../tools/*.c" -o -path "../daemons/*.c" -o -path '../include/pcmki/*h' -o -name '*internal.h')
+
+# And then any file in this list is public API, which may not use internal
+# functions. Thus, only those transformations that do not depend on "internal"
+# may be applied.
+OTHER_FILES = $(shell find ../include -name '*h' -a \! -name '*internal.h' -a \! -path '../include/pcmki/*')
+
+cocci:
+ -for cf in $(COCCI_FILES); do \
+ for f in $(MAY_USE_INTERNAL_FILES); do \
+ spatch $(_SPATCH_FLAGS) -D internal --very-quiet --local-includes --preprocess --sp-file $$cf $$f; \
+ done ; \
+ for f in $(OTHER_FILES); do \
+ spatch $(_SPATCH_FLAGS) --very-quiet --local-includes --preprocess --sp-file $$cf $$f; \
+ done ; \
+ done
+
+cocci-inplace:
+ $(MAKE) $(AM_MAKEFLAGS) _SPATCH_FLAGS=--in-place cocci
+
+cocci-test:
+ for f in coccinelle/test/*.c; do \
+ coccinelle/test/testrunner.sh $$f; \
+ done
+
+#
+# Static analysis
+#
+
+## clang
+
+# See scan-build(1) for possible checkers (leave empty to use default set)
+CLANG_checkers ?=
+
+clang:
+ OUT=$$(cd $(top_builddir) \
+ && scan-build $(CLANG_checkers:%=-enable-checker %) \
+ $(MAKE) $(AM_MAKEFLAGS) CFLAGS="-std=c99 $(CFLAGS)" \
+ clean all 2>&1); \
+ REPORT=$$(echo "$$OUT" \
+ | sed -n -e "s/.*'scan-view \(.*\)'.*/\1/p"); \
+ [ -z "$$REPORT" ] && echo "$$OUT" || scan-view "$$REPORT"
+
+## coverity
+
+# Aggressiveness (low, medium, or high)
+COVLEVEL ?= low
+
+# Generated outputs
+COVERITY_DIR = $(abs_top_builddir)/coverity-$(TAG)
+COVTAR = $(abs_top_builddir)/$(PACKAGE)-coverity-$(TAG).tgz
+COVEMACS = $(abs_top_builddir)/$(TAG).coverity
+COVHTML = $(COVERITY_DIR)/output/errors
+
+# Coverity outputs are phony so they get rebuilt every invocation
+
+.PHONY: $(COVERITY_DIR)
+$(COVERITY_DIR): coverity-clean
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir) init core-clean
+ $(AM_V_GEN)cd $(top_builddir) \
+ && cov-build --dir "$@" $(MAKE) $(AM_MAKEFLAGS) core
+
+# Public coverity instance
+
+.PHONY: $(COVTAR)
+$(COVTAR): $(COVERITY_DIR)
+ $(AM_V_GEN)tar czf "$@" --transform="s@.*$(TAG)@cov-int@" "$<"
+
+.PHONY: coverity
+coverity: $(COVTAR)
+ @echo "Now go to https://scan.coverity.com/users/sign_in and upload:"
+ @echo " $(COVTAR)"
+ @echo "then make clean at the top level"
+
+# Licensed coverity instance
+#
+# The prerequisites are a little hacky; rather than actually required, some
+# of them are designed so that things execute in the proper order (which is
+# not the same as GNU make's order-only prerequisites).
+
+.PHONY: coverity-analyze
+coverity-analyze: $(COVERITY_DIR)
+ @echo ""
+ @echo "Analyzing (waiting for coverity license if necessary) ..."
+ cd $(top_builddir) && cov-analyze --dir "$<" --wait-for-license \
+ --security --aggressiveness-level "$(COVLEVEL)"
+
+.PHONY: $(COVEMACS)
+$(COVEMACS): coverity-analyze
+ $(AM_V_GEN)cd $(top_builddir) \
+ && cov-format-errors --dir "$(COVERITY_DIR)" --emacs-style > "$@"
+
+.PHONY: $(COVHTML)
+$(COVHTML): $(COVEMACS)
+ $(AM_V_GEN)cd $(top_builddir) \
+ && cov-format-errors --dir "$(COVERITY_DIR)" --html-output "$@"
+
+.PHONY: coverity-corp
+coverity-corp: $(COVHTML)
+ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir) core-clean
+ @echo "Done. See:"
+ @echo " file://$(COVHTML)/index.html"
+ @echo "When no longer needed, make coverity-clean"
+
+# Remove all outputs regardless of tag
+.PHONY: coverity-clean
+coverity-clean:
+ -rm -rf "$(abs_builddir)"/coverity-* \
+ "$(abs_builddir)"/$(PACKAGE)-coverity-*.tgz \
+ "$(abs_builddir)"/*.coverity
+
+
+## cppcheck
+
+# Use CPPCHECK_ARGS to pass extra cppcheck options, e.g.:
+# --enable={warning,style,performance,portability,information,all}
+# --inconclusive --std=posix
+# -DBUILD_PUBLIC_LIBPACEMAKER -DDEFAULT_CONCURRENT_FENCING_TRUE
+CPPCHECK_ARGS ?=
+
+CPPCHECK_DIRS = replace lib daemons tools
+CPPCHECK_OUT = $(abs_top_builddir)/cppcheck.out
+
+cppcheck:
+ cppcheck $(CPPCHECK_ARGS) -I $(top_srcdir)/include \
+ --output-file=$(CPPCHECK_OUT) \
+ --max-configs=30 --inline-suppr -q \
+ --library=posix --library=gnu --library=gtk \
+ $(GLIB_CFLAGS) -D__GNUC__ \
+ $(foreach dir,$(CPPCHECK_DIRS),$(top_srcdir)/$(dir))
+ @echo "Done: See $(CPPCHECK_OUT)"
+ @echo "When no longer needed, make cppcheck-clean"
+
+.PHONY: cppcheck-clean
+cppcheck-clean:
+ -rm -f "$(CPPCHECK_OUT)"
+
+#
+# Coverage/profiling
+#
+
+COVERAGE_DIR = $(top_builddir)/coverage
+
+# Check coverage of unit tests
+.PHONY: coverage
+coverage: coverage-partial-clean
+ cd $(top_builddir) \
+ && $(MAKE) $(AM_MAKEFLAGS) core \
+ && lcov --no-external --exclude='*_test.c' -c -i -d . \
+ -o pacemaker_base.info \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && lcov --no-external --exclude='*_test.c' -c -d . \
+ -o pacemaker_test.info \
+ && lcov -a pacemaker_base.info -a pacemaker_test.info \
+ -o pacemaker_total.info
+ genhtml $(top_builddir)/pacemaker_total.info -o $(COVERAGE_DIR) -s
+
+# Check coverage of CLI regression tests
+.PHONY: coverage-cts
+coverage-cts: coverage-partial-clean
+ cd $(top_builddir) \
+ && $(MAKE) $(AM_MAKEFLAGS) core \
+ && lcov --no-external -c -i -d tools -o pacemaker_base.info \
+ && cts/cts-cli \
+ && lcov --no-external -c -d tools -o pacemaker_test.info \
+ && lcov -a pacemaker_base.info -a pacemaker_test.info \
+ -o pacemaker_total.info
+ genhtml $(top_builddir)/pacemaker_total.info -o $(COVERAGE_DIR) -s
+
+# Remove coverage-related files that aren't needed across runs
+.PHONY: coverage-partial-clean
+coverage-partial-clean:
+ -rm -f $(top_builddir)/pacemaker_*.info
+ -rm -rf $(COVERAGE_DIR)
+ -find $(top_builddir) -name "*.gcda" -exec rm -f \{\} \;
+
+# This target removes all coverage-related files. It is only to be run when
+# done with coverage analysis and you are ready to go back to normal development,
+# starting with re-running ./configure. It is not to be run in between
+# "make coverage" runs.
+#
+# In particular, the *.gcno files are generated when the source is built.
+# Removing those files will break "make coverage" until the whole source tree
+# has been built and the *.gcno files generated again.
+.PHONY: coverage-clean
+coverage-clean: coverage-partial-clean
+ -find $(top_builddir) -name "*.gcno" -exec rm -f \{\} \;
+
+#
+# indent cannot cope with all our exceptions and needs heavy manual editing
+#
+
+# indent target: Limit indent to these directories
+INDENT_DIRS ?= .
+
+# indent target: Extra options to pass to indent
+INDENT_OPTS ?=
+
+INDENT_IGNORE_PATHS = daemons/controld/controld_fsa.h \
+ lib/gnu/*
+INDENT_PACEMAKER_STYLE = --blank-lines-after-declarations \
+ --blank-lines-after-procedures \
+ --braces-after-func-def-line \
+ --braces-on-if-line \
+ --braces-on-struct-decl-line \
+ --break-before-boolean-operator \
+ --case-brace-indentation4 \
+ --case-indentation4 \
+ --comment-indentation0 \
+ --continuation-indentation4 \
+ --continue-at-parentheses \
+ --cuddle-do-while \
+ --cuddle-else \
+ --declaration-comment-column0 \
+ --declaration-indentation1 \
+ --else-endif-column0 \
+ --honour-newlines \
+ --indent-label0 \
+ --indent-level4 \
+ --line-comments-indentation0 \
+ --line-length80 \
+ --no-blank-lines-after-commas \
+ --no-comment-delimiters-on-blank-lines \
+ --no-space-after-function-call-names \
+ --no-space-after-parentheses \
+ --no-tabs \
+ --preprocessor-indentation2 \
+ --procnames-start-lines \
+ --space-after-cast \
+ --start-left-side-of-comments \
+ --swallow-optional-blank-lines \
+ --tab-size8
+
+indent:
+ VERSION_CONTROL=none \
+ find $(INDENT_DIRS) -type f -name "*.[ch]" \
+ $(INDENT_IGNORE_PATHS:%= ! -path '%') \
+ -exec indent $(INDENT_PACEMAKER_STYLE) $(INDENT_OPTS) \{\} \;
+
+#
+# Scratch file for ad-hoc testing
+#
+
+EXTRA_PROGRAMS = scratch
+nodist_scratch_SOURCES = scratch.c
+scratch_LDADD = $(top_builddir)/lib/common/libcrmcommon.la
+
+clean-local: coverage-clean coverity-clean cppcheck-clean
+ -rm -f $(EXTRA_PROGRAMS)