mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2024-12-23 07:33:27 -06:00
d8791f8f9b
Build all scripts in install/tools/ to check them with pylint, so that ``make pylint`` always checks all scripts. The script files are generated by make. Please note that fastlint does not check script files. See: https://pagure.io/freeipa/issue/7772 Signed-off-by: Christian Heimes <cheimes@redhat.com> Reviewed-By: Thomas Woerner <twoerner@redhat.com>
423 lines
13 KiB
Makefile
423 lines
13 KiB
Makefile
NULL =
|
|
|
|
ACLOCAL_AMFLAGS = -I m4
|
|
|
|
if ENABLE_SERVER
|
|
IPASERVER_SUBDIRS = ipaserver
|
|
SERVER_SUBDIRS = daemons init install
|
|
endif
|
|
|
|
if WITH_IPATESTS
|
|
IPATESTS_SUBDIRS = ipatests
|
|
endif
|
|
|
|
IPACLIENT_SUBDIRS = ipaclient ipalib ipaplatform ipapython
|
|
PYTHON_SUBDIRS = $(IPACLIENT_SUBDIRS) $(IPATESTS_SUBDIRS) $(IPASERVER_SUBDIRS)
|
|
IPA_PLACEHOLDERS = freeipa ipa ipaserver ipatests
|
|
SUBDIRS = asn1 util client contrib po pypi $(PYTHON_SUBDIRS) $(SERVER_SUBDIRS)
|
|
|
|
GENERATED_PYTHON_FILES = \
|
|
$(top_builddir)/ipaplatform/override.py \
|
|
$(top_builddir)/ipapython/version.py \
|
|
$(top_builddir)/makeaci \
|
|
$(top_builddir)/makeapi \
|
|
$(NULL)
|
|
|
|
MOSTLYCLEANFILES = ipasetup.pyc ipasetup.pyo \
|
|
pylint_plugins.pyc pylint_plugins.pyo
|
|
|
|
# user-facing scripts
|
|
nodist_bin_SCRIPTS = ipa
|
|
|
|
# files required for build but not installed
|
|
nodist_noinst_SCRIPTS = \
|
|
makeapi \
|
|
makeaci \
|
|
$(NULL)
|
|
|
|
dist_noinst_SCRIPTS = \
|
|
make-doc \
|
|
make-test \
|
|
pylint_plugins.py \
|
|
$(NULL)
|
|
|
|
# templates
|
|
dist_noinst_DATA = \
|
|
ipa.in \
|
|
makeaci.in \
|
|
makeapi.in \
|
|
$(NULL)
|
|
|
|
ipasetup.py: ipasetup.py.in $(CONFIG_STATUS)
|
|
$(AM_V_GEN)sed \
|
|
-e 's|@VERSION[@]|$(VERSION)|g' \
|
|
$< > $@
|
|
|
|
.wheelconstraints: .wheelconstraints.in $(CONFIG_STATUS)
|
|
$(AM_V_GEN)sed \
|
|
-e 's|@VERSION[@]|$(VERSION)|g' \
|
|
$< > $@
|
|
|
|
EXTRA_DIST = .mailmap \
|
|
ACI.txt \
|
|
API.txt \
|
|
BUILD.txt \
|
|
config.rpath \
|
|
README.md \
|
|
Contributors.txt \
|
|
COPYING.openssl \
|
|
contrib \
|
|
doc \
|
|
freeipa.spec.in \
|
|
ipasetup.py.in \
|
|
pylintrc \
|
|
.wheelconstraints.in
|
|
|
|
clean-local:
|
|
rm -rf "$(RPMBUILD)"
|
|
rm -rf "$(top_builddir)/dist"
|
|
rm -rf "$(top_builddir)/.tox"
|
|
rm -rf "$(top_srcdir)/__pycache__"
|
|
rm -f "$(top_builddir)"/$(PACKAGE)-*.tar.gz
|
|
rm -rf "$(top_srcdir)/cov-int"
|
|
rm -f "$(top_srcdir)/freeipa.tgz"
|
|
|
|
# convenience targets for RPM build
|
|
.PHONY: rpmroot rpmdistdir version-update _dist-version-bakein _rpms-prep \
|
|
rpms _rpms-body srpms _srpms-body
|
|
RPMBUILD ?= $(abs_builddir)/rpmbuild
|
|
TARBALL = $(PACKAGE)-$(VERSION).tar.gz
|
|
|
|
freeipa.spec: freeipa.spec.in $(top_builddir)/$(CONFIG_STATUS)
|
|
$(AM_V_GEN)sed \
|
|
-e 's|@VERSION[@]|$(VERSION)|g' \
|
|
-e 's|@VENDOR_SUFFIX[@]|$(VENDOR_SUFFIX)|g' \
|
|
$< > $@
|
|
|
|
rpmroot:
|
|
mkdir -p $(RPMBUILD)/BUILD
|
|
mkdir -p $(RPMBUILD)/RPMS
|
|
mkdir -p $(RPMBUILD)/SOURCES
|
|
mkdir -p $(RPMBUILD)/SPECS
|
|
mkdir -p $(RPMBUILD)/SRPMS
|
|
|
|
rpmdistdir:
|
|
mkdir -p $(top_builddir)/dist/rpms
|
|
mkdir -p $(top_builddir)/dist/srpms
|
|
|
|
# force IPA version re-generation (useful for build from Git)
|
|
version-update:
|
|
touch $(srcdir)/VERSION.m4
|
|
|
|
# convert Git snapshot version to static value usable from inside of tarball
|
|
_dist-version-bakein:
|
|
if !IS_GIT_SNAPSHOT
|
|
@echo "version-bakein target requires IPA_VERSION_IS_GIT_SNAPSHOT=yes"
|
|
exit 1
|
|
endif !IS_GIT_SNAPSHOT
|
|
chmod u+w $(top_distdir)/VERSION.m4
|
|
$(SED) -e 's/^define(IPA_VERSION_IS_GIT_SNAPSHOT,.*)/define(IPA_VERSION_IS_GIT_SNAPSHOT, no)/' -i $(top_distdir)/VERSION.m4
|
|
$(SED) -e 's/^define(IPA_VERSION_PRE_RELEASE,\(.*\))/define(IPA_VERSION_PRE_RELEASE,\1.$(GIT_VERSION))/' -i $(top_distdir)/VERSION.m4
|
|
cd $(top_distdir) && autoconf # re-generate configure from VERSION.m4
|
|
|
|
if IS_GIT_SNAPSHOT
|
|
VERSION_UPDATE_TARGET = version-update
|
|
VERSION_BAKEIN_TARGET = _dist-version-bakein
|
|
endif IS_GIT_SNAPSHOT
|
|
|
|
# HACK to support IPA_VERSION_IS_GIT_SNAPSHOT:
|
|
# touch VERSION.m4 will reexecute configure and change $(VERSION) used by dist
|
|
# but it will not change $(VERSION) in already running target rpms.
|
|
# We need to record new $(TARBALL) value used by dist for furher use
|
|
# in rpms target.
|
|
dist-hook: $(VERSION_BAKEIN_TARGET)
|
|
echo "$(TARBALL)" > $(top_builddir)/.tarball_name
|
|
echo "$(VERSION)" > $(top_builddir)/.version
|
|
|
|
_rpms-prep: dist-gzip rpmroot rpmdistdir freeipa.spec
|
|
cp $(top_builddir)/$$(cat $(top_builddir)/.tarball_name) $(RPMBUILD)/SOURCES/
|
|
rm -f $(top_builddir)/.tarball_name
|
|
|
|
rpms: $(VERSION_UPDATE_TARGET)
|
|
$(MAKE) _rpms-body
|
|
|
|
_rpms-body: _rpms-prep
|
|
rpmbuild --define "_topdir $(RPMBUILD)" -ba $(top_builddir)/$(PACKAGE).spec $(RPMBUILD_OPTS)
|
|
cp $(RPMBUILD)/RPMS/*/*$$(cat $(top_builddir)/.version)*.rpm $(top_builddir)/dist/rpms/
|
|
cp $(RPMBUILD)/SRPMS/*$$(cat $(top_builddir)/.version)*.src.rpm $(top_builddir)/dist/srpms/
|
|
rm -f rm -f $(top_builddir)/.version
|
|
|
|
srpms: $(VERSION_UPDATE_TARGET)
|
|
$(MAKE) _srpms-body
|
|
|
|
_srpms-body: _rpms-prep
|
|
rpmbuild --define "_topdir $(RPMBUILD)" -bs $(top_builddir)/$(PACKAGE).spec $(RPMBUILD_OPTS)
|
|
cp $(RPMBUILD)/SRPMS/*$$(cat $(top_builddir)/.version)*.src.rpm $(top_builddir)/dist/srpms/
|
|
rm -f rm -f $(top_builddir)/.version
|
|
|
|
.PHONY: lite-server
|
|
lite-server: $(GENERATED_PYTHON_FILES)
|
|
+$(MAKE) -C $(top_builddir)/install/ui
|
|
PYTHONPATH=$(top_srcdir) $(PYTHON) -bb \
|
|
contrib/lite-server.py $(LITESERVER_ARGS)
|
|
|
|
.PHONY: lint
|
|
if WITH_POLINT
|
|
POLINT_TARGET = polint
|
|
endif WITH_POLINT
|
|
if WITH_PYLINT
|
|
PYLINT_TARGET = pylint
|
|
endif WITH_PYLINT
|
|
if WITH_JSLINT
|
|
JSLINT_TARGET = jslint
|
|
endif WITH_JSLINT
|
|
lint: acilint apilint $(POLINT_TARGET) $(PYLINT_TARGET) $(JSLINT_TARGET) rpmlint yamllint
|
|
|
|
.PHONY: devcheck
|
|
devcheck: all
|
|
if ! WITH_POLINT
|
|
@echo "ERROR: polint not available"; exit 1
|
|
endif
|
|
if ! WITH_PYLINT
|
|
@echo "ERROR: pylint not available"; exit 1
|
|
endif
|
|
if ! WITH_JSLINT
|
|
@echo "ERROR: jslint not available"; exit 1
|
|
endif
|
|
@ # just tests, aci, api and pylint on Python 3
|
|
PYTHONPATH=$(abspath $(top_srcdir)) $(PYTHON) ipatests/ipa-run-tests \
|
|
--ipaclient-unittests
|
|
$(MAKE) $(AM_MAKEFLAGS) acilint apilint polint pylint jslint rpmlint yamllint check
|
|
@echo "All tests passed."
|
|
|
|
.PHONY: fastcheck fasttest fastlint
|
|
fastcheck:
|
|
@$(MAKE) -j1 $(AM_MAKEFLAGS) fastlint rpmlint yamllint fasttest apilint acilint
|
|
|
|
fasttest: $(GENERATED_PYTHON_FILES) ipasetup.py
|
|
@ # --ignore doubles speed of total test run compared to pytest.skip()
|
|
@ # on module.
|
|
PYTHONPATH=$(abspath $(top_srcdir)) $(PYTHON) ipatests/ipa-run-tests \
|
|
--skip-ipaapi \
|
|
--ignore $(abspath $(top_srcdir))/ipatests/test_integration \
|
|
--ignore $(abspath $(top_srcdir))/ipatests/test_xmlrpc
|
|
|
|
fastlint: $(GENERATED_PYTHON_FILES) ipasetup.py
|
|
if ! WITH_PYLINT
|
|
@echo "ERROR: pylint not available"; exit 1
|
|
endif
|
|
@echo "Fast linting with $(PYTHON) from branch '$(GIT_BRANCH)'"
|
|
|
|
@MERGEBASE=$$(git merge-base --fork-point $(GIT_BRANCH)); \
|
|
FILES=$$(git diff --name-only --diff-filter=d $${MERGEBASE} \
|
|
| grep -E '\.py$$'); \
|
|
if [ -n "$${FILES}" ]; then \
|
|
echo -e "Fast linting files:\n$${FILES}\n"; \
|
|
echo "pycodestyle"; \
|
|
echo "-----------"; \
|
|
git diff -U0 $${MERGEBASE} | \
|
|
$(PYTHON) -m pycodestyle --diff || exit $$?; \
|
|
echo -e "\npylint"; \
|
|
echo "------"; \
|
|
PYTHONPATH=$(abspath $(top_srcdir)) $(PYTHON) -m pylint \
|
|
--rcfile=$(top_srcdir)/pylintrc \
|
|
--load-plugins pylint_plugins \
|
|
$${FILES} || exit $$?; \
|
|
else \
|
|
echo "No modified Python files found"; \
|
|
fi
|
|
|
|
|
|
.PHONY: $(top_builddir)/ipaplatform/override.py
|
|
$(top_builddir)/ipaplatform/override.py:
|
|
(cd $(top_builddir)/ipaplatform && make override.py)
|
|
|
|
.PHONY: $(top_builddir)/ipapython/version.py
|
|
$(top_builddir)/ipapython/version.py:
|
|
(cd $(top_builddir)/ipapython && make version.py)
|
|
|
|
.PHONY: acilint
|
|
acilint: $(GENERATED_PYTHON_FILES)
|
|
cd $(srcdir); $(PYTHON) ./makeaci --validate
|
|
|
|
.PHONY: apilint
|
|
apilint: $(GENERATED_PYTHON_FILES)
|
|
cd $(srcdir); $(PYTHON) ./makeapi --validate
|
|
|
|
.PHONY: polint
|
|
polint:
|
|
$(MAKE) -C $(srcdir)/po PYTHON=$(PYTHON) \
|
|
validate-src-strings validate-po test-gettext
|
|
|
|
.PHONY: rpmlint
|
|
rpmlint: freeipa.spec
|
|
rpmlint ./$<
|
|
|
|
YAML_FILES = \
|
|
$(top_srcdir)/.travis.yml \
|
|
$(top_srcdir)/.lgtm.yml \
|
|
$(wildcard $(top_srcdir)/.*.yaml) \
|
|
$(wildcard $(top_srcdir)/ipatests/prci_definitions/*.yaml)
|
|
|
|
.PHONY: yamllint
|
|
yamllint: $(YAML_FILES)
|
|
@for YAML in $^; do \
|
|
$(PYTHON) -c "import yaml; f = open('$${YAML}'); yaml.safe_load(f); f.close()" || exit 1; \
|
|
done
|
|
|
|
# Run pylint for all python files. Finds all python files/packages, skips
|
|
# folders rpmbuild, freeipa-* and dist. Skip (match, but don't print) .*,
|
|
# *.in, *~. Finally print all python files, including scripts that do not
|
|
# have python extension.
|
|
|
|
.PHONY: pylint
|
|
|
|
if WITH_PYLINT
|
|
pylint: $(GENERATED_PYTHON_FILES) ipasetup.py
|
|
@# build CLI scripts
|
|
$(MAKE) -C $(top_builddir)/install/tools
|
|
FILES=`find $(top_srcdir) \
|
|
-type d -exec test -e '{}/__init__.py' \; -print -prune -o \
|
|
-path './rpmbuild' -prune -o \
|
|
-path './freeipa-*' -prune -o \
|
|
-path './dist' -prune -o \
|
|
-path './pypi' -prune -o \
|
|
-path './.tox' -prune -o \
|
|
-name '.*' -o \
|
|
-name '*.in' -o \
|
|
-name '*~' -o \
|
|
-name '*.py' -print -o \
|
|
-type f -exec grep -qsm1 '^#!.*\bpython' '{}' \; -print`; \
|
|
echo "Pylint on $(PYTHON) is running, please wait ..."; \
|
|
PYTHONPATH=$(top_srcdir) $(PYTHON) -m pylint \
|
|
--rcfile=$(top_srcdir)/pylintrc \
|
|
--load-plugins pylint_plugins \
|
|
$${FILES}
|
|
endif # WITH_PYLINT
|
|
|
|
.PHONY: jslint jslint-ui jslint-ui-test jslint-html \
|
|
$(top_builddir)/install/ui/src/libs/loader.js
|
|
|
|
if WITH_JSLINT
|
|
jslint: jslint-ui jslint-ui-test jslint-html
|
|
|
|
$(top_builddir)/install/ui/src/libs/loader.js:
|
|
(cd $(top_builddir)/install/ui/src/libs && make loader.js)
|
|
|
|
# create temporary symlinks to allow jslint to find libs/loader.js
|
|
jslint-ui: $(top_builddir)/install/ui/src/libs/loader.js
|
|
cd $(top_srcdir)/install/ui; \
|
|
jsl -nologo -nosummary -nofilelisting -conf jsl.conf;
|
|
|
|
jslint-ui-test:
|
|
cd $(top_srcdir)/install/ui/test; \
|
|
jsl -nologo -nosummary -nofilelisting -conf jsl.conf
|
|
|
|
jslint-html:
|
|
cd $(top_srcdir)/install/html; \
|
|
jsl -nologo -nosummary -nofilelisting -conf jsl.conf
|
|
endif # WITH_JSLINT
|
|
|
|
.PHONY: bdist_wheel wheel_bundle wheel_placeholder pypi_packages
|
|
WHEELDISTDIR = $(top_builddir)/dist/wheels
|
|
WHEELPYPIDIR = $(top_builddir)/dist/pypi
|
|
WHEELBUNDLEDIR = $(top_builddir)/dist/bundle
|
|
|
|
@MK_IFEQ@ ($(IPA_SERVER_WHEELS),1)
|
|
IPA_WHEEL_PACKAGES @MK_ASSIGN@ $(IPACLIENT_SUBDIRS) ipaplatform ipaserver
|
|
IPA_OMIT_INSTALL @MK_ASSIGN@ 0
|
|
@MK_ELSE@
|
|
IPA_WHEEL_PACKAGES @MK_ASSIGN@ $(IPACLIENT_SUBDIRS)
|
|
IPA_OMIT_INSTALL @MK_ASSIGN@ 1
|
|
@MK_ENDIF@
|
|
|
|
# additional wheels for bundle, e.g. IPA_EXTRA_WHEELS="ipatests[webui] pylint"
|
|
IPA_EXTRA_WHEELS=
|
|
|
|
$(WHEELDISTDIR):
|
|
mkdir -p $(WHEELDISTDIR)
|
|
|
|
$(WHEELBUNDLEDIR):
|
|
mkdir -p $(WHEELBUNDLEDIR)
|
|
|
|
$(WHEELPYPIDIR):
|
|
mkdir -p $(WHEELPYPIDIR)
|
|
|
|
bdist_wheel: $(WHEELDISTDIR)
|
|
rm -f $(foreach item,$(IPA_WHEEL_PACKAGES) ipatests,$(WHEELDISTDIR)/$(item)-*.whl)
|
|
export IPA_OMIT_INSTALL=$(IPA_OMIT_INSTALL); \
|
|
for dir in $(IPA_WHEEL_PACKAGES) ipatests; do \
|
|
$(MAKE) $(AM_MAKEFLAGS) -C $${dir} $@ || exit 1; \
|
|
done
|
|
|
|
wheel_bundle: $(WHEELBUNDLEDIR) bdist_wheel .wheelconstraints
|
|
rm -f $(foreach item,$(IPA_WHEEL_PACKAGES) ipatests,$(WHEELBUNDLEDIR)/$(item)-*.whl)
|
|
@# dbus-python sometimes fails when MAKEFLAGS is set to -j2 or higher
|
|
MAKEFLAGS= $(PYTHON) -m pip wheel \
|
|
--disable-pip-version-check \
|
|
--constraint .wheelconstraints \
|
|
--find-links $(WHEELDISTDIR) \
|
|
--find-links $(WHEELBUNDLEDIR) \
|
|
--wheel-dir $(WHEELBUNDLEDIR) \
|
|
$(IPA_EXTRA_WHEELS) $(IPA_WHEEL_PACKAGES)
|
|
|
|
pypi_packages: $(WHEELPYPIDIR) .wheelconstraints
|
|
rm -f $(WHEELPYPIDIR)/*
|
|
for dir in $(IPACLIENT_SUBDIRS); do \
|
|
$(MAKE) $(AM_MAKEFLAGS) \
|
|
IPA_OMIT_INSTALL=1 WHEELDISTDIR="$(abspath $(WHEELPYPIDIR))" \
|
|
-C $${dir} bdist_wheel || exit 1; \
|
|
done
|
|
for dir in $(IPA_PLACEHOLDERS); do \
|
|
$(MAKE) $(AM_MAKEFLAGS) \
|
|
IPA_OMIT_INSTALL=1 WHEELDISTDIR="$(abspath $(WHEELPYPIDIR))" \
|
|
-C $(top_srcdir)/pypi/$${dir} bdist_wheel || exit 1; \
|
|
done
|
|
@echo -e "\n\nTo upload packages to PyPI, run:\n"
|
|
@echo -e " twine upload $(WHEELPYPIDIR)/*-$(VERSION)-py2.py3-none-any.whl\n"
|
|
|
|
.PHONY: python_install
|
|
python_install:
|
|
for dir in $(PYTHON_SUBDIRS); do \
|
|
$(MAKE) $(AM_MAKEFLAGS) -C $${dir} install || exit 1; \
|
|
done
|
|
|
|
.PHONY:
|
|
strip-po:
|
|
$(MAKE) -C po strip-po
|
|
|
|
.PHONY: cov-scan
|
|
cov-scan:
|
|
$(MAKE) clean
|
|
@# analyse C code with workaround for missing _Float types
|
|
@# https://stackoverflow.com/questions/50434236/coverity-scan-fails-to-build-stdlib-h-with-gnu-source-defined
|
|
cov-build --dir cov-int $(MAKE) all \
|
|
CFLAGS="-D_Float32=float -D_Float32x=double -D_Float64=double -D_Float64x='long double' -D_Float128='long double'"
|
|
@# remove build directories and analyse Python
|
|
rm -rf ipa*/build
|
|
cov-build --dir cov-int --no-command \
|
|
$(foreach d,$(PYTHON_SUBDIRS),--fs-capture-search $(d))
|
|
@# analyze JS files
|
|
cov-build --dir cov-int --no-command --fs-capture-search install/ui
|
|
@# compress and upload
|
|
tar czvf freeipa.tgz cov-int
|
|
if [ -n "$${COVERITY_SCAN_TOKEN}" ]; then \
|
|
curl --progress-bar --output /dev/null \
|
|
--form token=$${COVERITY_SCAN_TOKEN} \
|
|
--form email=scan@mg.freeipa.org \
|
|
--form file=@freeipa.tgz \
|
|
--form version="$(VERSION)" \
|
|
--form description="FreeIPA" \
|
|
"https://scan.coverity.com/builds?project=freeipa%2Ffreeipa"; \
|
|
fi
|
|
|
|
PYTHON_SHEBANG = \
|
|
ipa \
|
|
makeaci \
|
|
makeapi \
|
|
$(NULL)
|
|
|
|
CLEANFILES = $(PYTHON_SHEBANG)
|
|
|
|
include $(top_srcdir)/Makefile.pythonscripts.am
|