mirror of
https://github.com/SCST-project/scst.git
synced 2026-10-22 14:12:33 +00:00
Run the native checkers through the ordered SCST module build with C=2. Preserve Kbuild flags, full raw output and every attempted CHECK record. Keep full, diff and explicit input selection on the shared scope; diff selection triggers the complete configured module analysis. Read exact diagnostic exceptions from policy/sparse.json and smatch.json: two reviewed Smatch IRQ reports and the external FC flexible-array warning. Keep the existing SCST matching boundaries and reasons. Smatch uses its matching installed kernel data without engine-specific additions. Reject build, checker, frontend and truncation failures even when Kbuild returns success. Retain per-invocation records and a machine-readable run summary, and detect printed CHECK steps without a record. Require selected C inputs to occur in the build. Keep findings distinct from incompleteness. Check native compatibility before compilation, and forward external kernel capability probes to the real checker instead of skipping them as inputs outside SCST. Include the pinned Smatch typeof frontend correction and isolated fixtures for failure propagation and exact exception boundaries.
692 lines
23 KiB
Makefile
692 lines
23 KiB
Makefile
#
|
|
# Common makefile for SCSI target mid-level and its drivers
|
|
#
|
|
# Copyright (C) 2015 - 2018 Vladislav Bolkhovitin <vst@vlnb.net>
|
|
# Copyright (C) 2007 - 2018 Western Digital Corporation
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation, version 2
|
|
# of the License.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
#
|
|
|
|
SHELL := /bin/bash
|
|
|
|
# Define the location to the kernel src. Can be defined here or on
|
|
# the command line during the build process. If KDIR is defined,
|
|
# we will determine an appropriate value for KVER from the kernel
|
|
# source tree. KVER can still be overridden by the user via the
|
|
# command line or by defining it in this Makefile. If KDIR and KVER
|
|
# are not defined by the user, the current running kernel version is
|
|
# used to define KVER.
|
|
|
|
ifdef KDIR
|
|
ifndef KVER
|
|
KVER = $(strip $(shell \
|
|
cat $(KDIR)/include/config/kernel.release 2>/dev/null || \
|
|
make -s -C $(KDIR) kernelversion))
|
|
endif
|
|
else
|
|
ifndef KVER
|
|
KVER=$(strip $(shell uname -r))
|
|
endif
|
|
|
|
KDIR=/lib/modules/$(KVER)/build
|
|
endif
|
|
|
|
PKG_BUILD_MODE ?= 2release
|
|
|
|
WERROR ?= n
|
|
ifneq ($(words $(strip $(WERROR))),1)
|
|
$(error WERROR must be one of: y n (got '$(WERROR)'))
|
|
endif
|
|
ifneq ($(filter y n,$(strip $(WERROR))),$(strip $(WERROR)))
|
|
$(error WERROR must be one of: y n (got '$(WERROR)'))
|
|
endif
|
|
override WERROR := $(strip $(WERROR))
|
|
export WERROR
|
|
|
|
ifeq ($(WERROR),y)
|
|
ifeq ($(filter -Werror,$(CFLAGS)),)
|
|
override CFLAGS += -Werror
|
|
endif
|
|
ifeq ($(filter -Werror,$(KCFLAGS)),)
|
|
override KCFLAGS += -Werror
|
|
endif
|
|
export CFLAGS KCFLAGS
|
|
endif
|
|
|
|
OLD_QLA_INI_DIR = qla2x00t
|
|
OLD_QLA_DIR = $(OLD_QLA_INI_DIR)/qla2x00-target
|
|
|
|
NEW_QLA_INI_DIR = qla2x00t-32gbit
|
|
NEW_QLA_DIR = $(NEW_QLA_INI_DIR)/qla2x00-target
|
|
|
|
ifeq ($(QLA_32GBIT),no)
|
|
QLA_INI_DIR = $(OLD_QLA_INI_DIR)
|
|
QLA_DIR = $(OLD_QLA_DIR)
|
|
else
|
|
QLA_INI_DIR = $(NEW_QLA_INI_DIR)
|
|
QLA_DIR = $(NEW_QLA_DIR)
|
|
endif
|
|
|
|
SCST_DIR = scst
|
|
DOC_DIR = doc
|
|
SCSTADM_DIR = scstadmin
|
|
USR_DIR = usr
|
|
SRP_DIR = srpt
|
|
SCST_LOCAL_DIR = scst_local
|
|
FCST_DIR = fcst
|
|
EMULEX_DIR = emulex
|
|
ISCSI_DIR = iscsi-scst
|
|
|
|
BUILD_DATE := $(shell date -u '+%Y/%m/%d-%H:%M:%S-%Z%:z')
|
|
GIT_COMMIT := $(shell git rev-parse --short=12 HEAD 2>/dev/null)
|
|
|
|
ifndef BUILD_NUMBER
|
|
BUILD_NUMBER := $(shell git rev-list --count HEAD 2>/dev/null || echo 0)
|
|
endif
|
|
|
|
ifndef ARCH_TYPE
|
|
ARCH_TYPE := $(shell uname -m)
|
|
endif
|
|
|
|
export KVER BUILD_DATE GIT_COMMIT BUILD_NUMBER ARCH_TYPE
|
|
|
|
RELEASE_VERSION := $(shell echo -n "$$(sed -n 's/^\#define[[:blank:]]SCST_VERSION_NAME[[:blank:]]*\"\([^-]*\).*\"/\1/p' scst/include/scst_const.h)")
|
|
|
|
ifndef REVISION
|
|
ifneq ($(GIT_COMMIT),)
|
|
REVISION := $(BUILD_NUMBER).$(GIT_COMMIT)
|
|
else
|
|
REVISION := $(BUILD_NUMBER)
|
|
endif
|
|
endif
|
|
|
|
VERSION := $(RELEASE_VERSION).$(REVISION)
|
|
DEBIAN_REVISION := 1.1
|
|
RPMTOPDIR ?= $(shell if [ $$(id -u) = 0 ]; then echo /usr/src/packages;\
|
|
else echo $$PWD/rpmbuilddir; fi)
|
|
DOCKER ?= docker
|
|
DOCKER_RPM_TARGET ?= rocky-10.2
|
|
DOCKER_RPM_CONTEXT ?= docker/rpm
|
|
DOCKER_RPM_DOCKERFILE ?= $(DOCKER_RPM_CONTEXT)/Dockerfile
|
|
DOCKER_RPM_IMAGE ?= scst-rpm-builder:$(DOCKER_RPM_TARGET)
|
|
DOCKER_RPM_OUTPUT ?= $(CURDIR)/docker-rpmbuilddir/$(DOCKER_RPM_TARGET)
|
|
DOCKER_RPM_BASE_IMAGE ?= $(shell bash scripts/kernel/kernel-matrix rpm-field \
|
|
"$(DOCKER_RPM_TARGET)" base_image)
|
|
DOCKER_RPM_KERNEL_PACKAGE ?= $(shell bash scripts/kernel/kernel-matrix rpm-field \
|
|
"$(DOCKER_RPM_TARGET)" kernel_package)
|
|
DOCKER_RPM_KERNEL_VERSION ?= $(shell bash scripts/kernel/kernel-matrix rpm-field \
|
|
"$(DOCKER_RPM_TARGET)" kernel_version)
|
|
DOCKER_RPM_KERNEL_REPOSITORY ?= $(shell bash scripts/kernel/kernel-matrix rpm-field \
|
|
"$(DOCKER_RPM_TARGET)" kernel_repository)
|
|
RPM_ARTIFACT_SOURCE_DIR ?= $(CURDIR)
|
|
RPM_ARTIFACT_OUTPUT_DIR ?= $(CURDIR)/rpm-artifacts
|
|
RPM_ARTIFACT_KERNEL_DEVEL_PACKAGE ?= kernel-devel
|
|
SCST_SOURCE_FILES = $(shell if [ -e scripts/source/list-source-files ]; then \
|
|
scripts/source/list-source-files; \
|
|
else \
|
|
echo scripts-source-files-is-missing; \
|
|
fi)
|
|
|
|
help:
|
|
@printf '%s\n' \
|
|
'Component tests (see tests/ginkgo/README.md):' \
|
|
' ginkgo-check check the framework without SCST access' \
|
|
' ginkgo-list list tests without SCST access' \
|
|
' ginkgo-config validate GINKGO_CONFIG (JSON file)' \
|
|
' ginkgo-test load built modules, then run tests (root)' \
|
|
' ginkgo-test-build build and load modules, then run tests (root)' \
|
|
' GINKGO_LABEL select local, iscsi, basic, stress, scsi or io' \
|
|
' GINKGO_CONFIG component-test configuration file' \
|
|
'' \
|
|
'KUnit tests (see doc/KUNIT.md):' \
|
|
' kunit-build build all SCST KUnit modules' \
|
|
' kunit-clean clean test module builds; keep run reports' \
|
|
' kunit-list show base/composite labels and source suites' \
|
|
' kunit-run run already-built modules (root)' \
|
|
' kunit-test build, then run tests (root)' \
|
|
' KUNIT_TEST=y|n include all suites (default: n; kunit-build sets y)' \
|
|
' KUNIT_LOG=y|n compile extra execution messages (default: n)' \
|
|
' KUNIT_LABEL base/composite labels to run (default: ALL)' \
|
|
' KUNIT_ARGS runner/list options; run also accepts module paths' \
|
|
'' \
|
|
'Build variables:' \
|
|
' WERROR=y|n treat warnings as errors (default: n)' \
|
|
'' \
|
|
'Build and maintenance targets:' \
|
|
' tags make tags' \
|
|
' cov-build make coverity build' \
|
|
' shellcheck check Bash scripts' \
|
|
' analyzer-policy show shared analyzer input policy (no analysis)' \
|
|
' ANALYZER=common|sparse|smatch policy to show (default: common)' \
|
|
' ANALYZER_FORMAT=text|json policy output format (default: text)' \
|
|
' sparse, smatch analyze configured modules through Kbuild' \
|
|
' DIFFBR=commit analyze when module sources or headers changed' \
|
|
' lint-test test shared analyzer tooling (no modules)' \
|
|
' all make all' \
|
|
' clean clean files' \
|
|
' extraclean clean + clean dependencies' \
|
|
' install install' \
|
|
' uninstall uninstall' \
|
|
' scst make scst only' \
|
|
' scst_clean scst: clean' \
|
|
' scst_extraclean scst: clean + clean dependencies' \
|
|
' scst_install scst: install' \
|
|
' scst_uninstall scst: uninstall' \
|
|
' docs make docs' \
|
|
' docs_clean docs: clean' \
|
|
' docs_extraclean docs: clean + clean dependencies' \
|
|
' scstadm make scstadmin' \
|
|
' scstadm_clean scstadmin: clean' \
|
|
' scstadm_extraclean scstadmin: clean + clean dependencies' \
|
|
' scstadm_install scstadmin: install' \
|
|
' scstadm_uninstall scstadmin: uninstall' \
|
|
' qla make QLA target driver' \
|
|
' qla_clean qla target: clean' \
|
|
' qla_extraclean qla target: clean + clean dependencies' \
|
|
' qla_install qla target: install' \
|
|
' qla_uninstall qla target: uninstall' \
|
|
' iscsi make iSCSI target' \
|
|
' iscsi_clean ISCSI target: clean' \
|
|
' iscsi_extraclean ISCSI target: clean + clean dependencies' \
|
|
' iscsi_install ISCSI target: install' \
|
|
' iscsi_uninstall ISCSI target: uninstall' \
|
|
' emulex make Emulex target' \
|
|
' emulex_clean Emulex target: clean' \
|
|
' emulex_extraclean Emulex target: clean + clean dependencies' \
|
|
' emulex_install Emulex target: install' \
|
|
' emulex_uninstall Emulex target: uninstall' \
|
|
' srpt make SRP target' \
|
|
' srpt_clean srp target: clean' \
|
|
' srpt_extraclean srp target: clean + clean dependencies' \
|
|
' srpt_install srp target: install' \
|
|
' srpt_uninstall srp target: uninstall' \
|
|
' fcst make FCoE target' \
|
|
' fcst_clean FCoE target: clean' \
|
|
' fcst_extraclean FCoE target: clean + clean dependencies' \
|
|
' fcst_install FCoE target: install' \
|
|
' fcst_uninstall FCoE target: uninstall' \
|
|
' scst_local make scst_local target' \
|
|
' scst_local_clean scst_local target: clean' \
|
|
' scst_local_extraclean scst_local target: clean + clean dependencies' \
|
|
' scst_local_install scst_local target: install' \
|
|
' scst_local_uninstall scst_local target: uninstall' \
|
|
' usr make user space targets' \
|
|
' usr_clean usr target: clean' \
|
|
' usr_extraclean usr target: clean + clean dependencies' \
|
|
' usr_install usr target: install' \
|
|
' usr_uninstall usr target: uninstall' \
|
|
' scst-rpm make SCST RPM packages' \
|
|
' scst-dkms-rpm make SCST DKMS RPM packages' \
|
|
' scstadm-rpm make scstadmin RPM packages' \
|
|
' rpm make both SCST and scstadmin RPM packages' \
|
|
' rpm-dkms make both SCST DKMS and scstadmin RPM packages' \
|
|
' rpm-artifacts build verified RPM artifacts' \
|
|
' docker-rpm-image build the RPM builder Docker image' \
|
|
' docker-rpm build RPM packages in Docker' \
|
|
' dpkg make SCST dpkg packages' \
|
|
' 2perf changes debug state to full performance' \
|
|
' 2release changes debug state to release' \
|
|
' 2debug changes debug state to full debug' \
|
|
'' \
|
|
'Installation and module execution may require root.'
|
|
|
|
# Resolve the config relative to the caller, before entering tests/ginkgo.
|
|
export GINKGO_CONFIG
|
|
|
|
ginkgo-test-build: export SCST_TEST_KDIR := $(abspath $(KDIR))
|
|
|
|
ginkgo-check ginkgo-list ginkgo-config ginkgo-test ginkgo-test-build:
|
|
@case "$$GINKGO_CONFIG" in ""|/*) ;; \
|
|
*) GINKGO_CONFIG="$$PWD/$$GINKGO_CONFIG" ;; esac; \
|
|
$(MAKE) -C tests/ginkgo $(patsubst ginkgo-%,%,$@) GINKGO_CONFIG="$$GINKGO_CONFIG"
|
|
|
|
tags:
|
|
find . -type f -name "*.[ch]" | ctags --c-kinds=+p --fields=+iaS --extra=+q -e -L-
|
|
|
|
cov-build:
|
|
for d in $(SCST_DIR) $(ISCSI_DIR) $(OLD_QLA_DIR) $(NEW_QLA_DIR) \
|
|
$(SRP_DIR) $(SCST_LOCAL_DIR) $(FCST_DIR) $(USR_DIR) \
|
|
$(SCSTADM_DIR); do \
|
|
BUILD_2X_MODULE=y CONFIG_SCSI_QLA_FC=y \
|
|
CONFIG_SCSI_QLA2XXX_TARGET=y $(MAKE) -j$$(nproc) -C "$$d" || \
|
|
exit $$?; \
|
|
done
|
|
|
|
shellcheck:
|
|
scripts/source/run-shellcheck
|
|
|
|
.PHONY: analyzer-policy
|
|
analyzer-policy:
|
|
@$(PYTHON) -B scripts/analyzer_policy.py show "$(or $(ANALYZER),common)" --format="$(or $(ANALYZER_FORMAT),text)"
|
|
|
|
.PHONY: sparse smatch lint-kbuild
|
|
sparse smatch: export SCST_LINT_KDIR := $(KDIR)
|
|
sparse smatch:
|
|
+@$(PYTHON) -B scripts/sparse_smatch/smp.py $@
|
|
|
|
# Preserve dependency order. The newer QLogic base is compiled for its target
|
|
# module, but only sources selected by analyzer policy reach the checker.
|
|
lint-kbuild:
|
|
+$(MAKE) -C $(SCST_DIR)
|
|
+$(MAKE) -C $(ISCSI_DIR) mods
|
|
+$(MAKE) -C $(NEW_QLA_DIR) BUILD_2X_MODULE=y
|
|
+$(MAKE) -C $(SRP_DIR)
|
|
+$(MAKE) -C $(SCST_LOCAL_DIR)
|
|
+$(MAKE) -C $(FCST_DIR)
|
|
|
|
.PHONY: lint-test
|
|
lint-test:
|
|
PYTHONDONTWRITEBYTECODE=1 $(PYTHON) -m unittest discover -s scripts/tests -v
|
|
|
|
all clean extraclean install uninstall:
|
|
if [ $@ = extraclean ]; then rm -f TAGS tags cscope.out; fi
|
|
for d in $(SCST_DIR) $(ISCSI_DIR) $(QLA_DIR) $(SRP_DIR) \
|
|
$(SCST_LOCAL_DIR) $(FCST_DIR) $(USR_DIR) $(SCSTADM_DIR); do \
|
|
$(MAKE) -j$$(nproc) -C "$$d" $@ || exit $$?; \
|
|
done
|
|
|
|
scst:
|
|
cd $(SCST_DIR) && $(MAKE) all
|
|
|
|
scst_clean:
|
|
cd $(SCST_DIR) && $(MAKE) clean
|
|
|
|
scst_extraclean:
|
|
cd $(SCST_DIR) && $(MAKE) extraclean
|
|
|
|
scst_install:
|
|
cd $(SCST_DIR) && $(MAKE) install
|
|
|
|
scst_uninstall:
|
|
cd $(SCST_DIR) && $(MAKE) uninstall
|
|
|
|
docs:
|
|
cd $(DOC_DIR) && $(MAKE) all
|
|
|
|
docs_clean:
|
|
cd $(DOC_DIR) && $(MAKE) clean
|
|
|
|
docs_extraclean:
|
|
cd $(DOC_DIR) && $(MAKE) extraclean
|
|
|
|
scstadm:
|
|
cd $(SCSTADM_DIR) && $(MAKE) all
|
|
|
|
scstadm_clean:
|
|
cd $(SCSTADM_DIR) && $(MAKE) clean
|
|
|
|
scstadm_extraclean:
|
|
cd $(SCSTADM_DIR) && $(MAKE) extraclean
|
|
|
|
scstadm_install:
|
|
cd $(SCSTADM_DIR) && $(MAKE) install
|
|
|
|
scstadm_uninstall:
|
|
cd $(SCSTADM_DIR) && $(MAKE) uninstall
|
|
|
|
qla:
|
|
cd $(QLA_DIR) && $(MAKE) all
|
|
|
|
qla_clean:
|
|
cd $(QLA_DIR) && $(MAKE) clean
|
|
|
|
qla_extraclean:
|
|
cd $(QLA_DIR) && $(MAKE) extraclean
|
|
|
|
qla_install:
|
|
cd $(QLA_DIR) && $(MAKE) install
|
|
|
|
qla_uninstall:
|
|
cd $(QLA_DIR) && $(MAKE) uninstall
|
|
|
|
iscsi:
|
|
cd $(ISCSI_DIR) && $(MAKE) all
|
|
|
|
iscsi_clean:
|
|
cd $(ISCSI_DIR) && $(MAKE) clean
|
|
|
|
iscsi_extraclean:
|
|
cd $(ISCSI_DIR) && $(MAKE) extraclean
|
|
|
|
iscsi_install:
|
|
cd $(ISCSI_DIR) && $(MAKE) install
|
|
|
|
iscsi_uninstall:
|
|
cd $(ISCSI_DIR) && $(MAKE) uninstall
|
|
|
|
emulex:
|
|
cd $(EMULEX_DIR) && $(MAKE) all
|
|
|
|
emulex_clean:
|
|
cd $(EMULEX_DIR) && $(MAKE) clean
|
|
|
|
emulex_extraclean:
|
|
cd $(EMULEX_DIR) && $(MAKE) extraclean
|
|
|
|
emulex_install:
|
|
cd $(EMULEX_DIR) && $(MAKE) install
|
|
|
|
emulex_uninstall:
|
|
cd $(EMULEX_DIR) && $(MAKE) uninstall
|
|
|
|
srpt:
|
|
cd $(SRP_DIR) && $(MAKE) all
|
|
|
|
srpt_clean:
|
|
cd $(SRP_DIR) && $(MAKE) clean
|
|
|
|
srpt_extraclean:
|
|
cd $(SRP_DIR) && $(MAKE) extraclean
|
|
|
|
srpt_install:
|
|
cd $(SRP_DIR) && $(MAKE) install
|
|
|
|
srpt_uninstall:
|
|
cd $(SRP_DIR) && $(MAKE) uninstall
|
|
|
|
fcst:
|
|
cd $(FCST_DIR) && $(MAKE) all
|
|
|
|
fcst_clean:
|
|
cd $(FCST_DIR) && $(MAKE) clean
|
|
|
|
fcst_extraclean:
|
|
cd $(FCST_DIR) && $(MAKE) extraclean
|
|
|
|
fcst_install:
|
|
cd $(FCST_DIR) && $(MAKE) install
|
|
|
|
fcst_uninstall:
|
|
cd $(FCST_DIR) && $(MAKE) uninstall
|
|
|
|
scst_local:
|
|
cd $(SCST_LOCAL_DIR) && $(MAKE) all
|
|
|
|
scst_local_clean:
|
|
cd $(SCST_LOCAL_DIR) && $(MAKE) clean
|
|
|
|
scst_local_extraclean:
|
|
cd $(SCST_LOCAL_DIR) && $(MAKE) extraclean
|
|
|
|
scst_local_install:
|
|
cd $(SCST_LOCAL_DIR) && $(MAKE) install
|
|
|
|
scst_local_uninstall:
|
|
cd $(SCST_LOCAL_DIR) && $(MAKE) uninstall
|
|
|
|
usr:
|
|
cd $(USR_DIR) && $(MAKE)
|
|
|
|
usr_clean:
|
|
cd $(USR_DIR) && $(MAKE) clean
|
|
|
|
usr_extraclean:
|
|
cd $(USR_DIR) && $(MAKE) extraclean
|
|
|
|
usr_install:
|
|
cd $(USR_DIR) && $(MAKE) install
|
|
|
|
usr_uninstall:
|
|
cd $(USR_DIR) && $(MAKE) uninstall
|
|
|
|
# Make an SCST source code archive. $(1) is the tar compression option, $(2)
|
|
# is the tar filename compression suffix, $(3) is the version and $(4) is the
|
|
# source file filter.
|
|
make-scst-dist = \
|
|
[ -n "$(1)" ] && [ -n "$(2)" ] && [ -n "$(3)" ] && \
|
|
[ -n "$(4)" ] && \
|
|
name=scst && \
|
|
mkdir "$${name}-$(3)" && \
|
|
{ \
|
|
{ \
|
|
scripts/source/list-source-files | grep -v '/\.gitignore' && \
|
|
if [ -e debian/changelog ]; then echo debian/changelog; fi; \
|
|
if [ -e debian/compat ]; then echo debian/compat; fi; \
|
|
} | \
|
|
$(4) | \
|
|
tar -T- -cf- | \
|
|
tar -C "$${name}-$(3)" -xf-; \
|
|
} && \
|
|
rm -f "$${name}-$(3).tar.$(2)" && \
|
|
tar -c$(1) -f "$${name}-$(3).tar.$(2)" "$${name}-$(3)" && \
|
|
rm -rf "$${name}-$(3)"
|
|
|
|
scst-dist-gzip: scst-$(VERSION).tar.bz2
|
|
|
|
scst-$(VERSION).tar.bz2: $(SCST_SOURCE_FILES)
|
|
$(call make-scst-dist,j,bz2,$(VERSION),grep -E '^debian/|^doc/|^fcst/|^iscsi-scst/|^Makefile|^qla2x00t(|-32gbit)/|^scripts/|^scst.spec|^scst/|^scst_local/|^srpt/|^usr/|^scstadmin/')
|
|
|
|
scst-rpm:
|
|
name=scst && \
|
|
rpmtopdir=$(RPMTOPDIR) && \
|
|
$(MAKE) scst-dist-gzip && \
|
|
for d in BUILD RPMS SOURCES SPECS SRPMS; do \
|
|
mkdir -p $${rpmtopdir}/$$d; \
|
|
done && \
|
|
cp scst-$(VERSION).tar.bz2 $${rpmtopdir}/SOURCES && \
|
|
sed -e "s/@rpm_version@/$(VERSION)/g" \
|
|
-e "s|@depmod@|$(shell which depmod)|g" \
|
|
<$${name}.spec.in >$${name}.spec && \
|
|
MAKE="$(MAKE)" rpmbuild --define="%_topdir $${rpmtopdir}" \
|
|
$(if $(KVER),--define="%kversion $(KVER)") \
|
|
$(if $(KDIR),--define="%kdir $(KDIR)") \
|
|
--define="%pkg_build_mode $(PKG_BUILD_MODE)" \
|
|
-ba $${name}.spec && \
|
|
rm -f scst-$(VERSION).tar.bz2
|
|
|
|
scst-dkms-rpm:
|
|
name=scst-dkms && \
|
|
rpmtopdir=$(RPMTOPDIR) && \
|
|
$(MAKE) scst-dist-gzip && \
|
|
for d in BUILD RPMS SOURCES SPECS SRPMS; do \
|
|
mkdir -p $${rpmtopdir}/$$d; \
|
|
done && \
|
|
cp scst-$(VERSION).tar.bz2 $${rpmtopdir}/SOURCES && \
|
|
sed "s/@rpm_version@/$(VERSION)/g" \
|
|
<$${name}.spec.in >$${name}.spec && \
|
|
MAKE="$(MAKE)" rpmbuild --define="%_topdir $${rpmtopdir}" \
|
|
$(if $(KVER),--define="%kversion $(KVER)") \
|
|
$(if $(KDIR),--define="%kdir $(KDIR)") \
|
|
--define="%pkg_build_mode $(PKG_BUILD_MODE)" \
|
|
-ba $${name}.spec && \
|
|
rm -f scst-$(VERSION).tar.bz2
|
|
|
|
scstadm-rpm:
|
|
$(MAKE) -C scstadmin rpm
|
|
|
|
rpm:
|
|
$(MAKE) scst-rpm
|
|
$(MAKE) scstadm-rpm
|
|
@if [ "$$(id -u)" != 0 ]; then \
|
|
echo; \
|
|
echo "The following RPMs have been built:"; \
|
|
find -name '*.rpm'; \
|
|
fi
|
|
|
|
rpm-dkms:
|
|
$(MAKE) scst-dkms-rpm
|
|
$(MAKE) scstadm-rpm
|
|
@if [ "$$(id -u)" != 0 ]; then \
|
|
echo; \
|
|
echo "The following RPMs have been built:"; \
|
|
find -name '*.rpm'; \
|
|
fi
|
|
|
|
rpm-artifacts:
|
|
mkdir -p "$(RPM_ARTIFACT_OUTPUT_DIR)"
|
|
RPM_ARTIFACT_SOURCE_DIR="$(RPM_ARTIFACT_SOURCE_DIR)" \
|
|
RPM_ARTIFACT_OUTPUT_DIR="$(RPM_ARTIFACT_OUTPUT_DIR)" \
|
|
RPM_ARTIFACT_KERNEL_DEVEL_PACKAGE="$(RPM_ARTIFACT_KERNEL_DEVEL_PACKAGE)" \
|
|
bash "$(CURDIR)/scripts/release/build-rpm-artifacts"
|
|
|
|
docker-rpm-image:
|
|
test -n "$(DOCKER_RPM_BASE_IMAGE)"
|
|
test -n "$(DOCKER_RPM_KERNEL_PACKAGE)"
|
|
test -n "$(DOCKER_RPM_KERNEL_VERSION)"
|
|
$(DOCKER) build --file "$(DOCKER_RPM_DOCKERFILE)" \
|
|
--build-arg "BASE_IMAGE=$(DOCKER_RPM_BASE_IMAGE)" \
|
|
--build-arg "KERNEL_PACKAGE=$(DOCKER_RPM_KERNEL_PACKAGE)" \
|
|
--build-arg "KERNEL_VERSION=$(DOCKER_RPM_KERNEL_VERSION)" \
|
|
--build-arg \
|
|
"KERNEL_REPOSITORY=$(DOCKER_RPM_KERNEL_REPOSITORY)" \
|
|
--tag "$(DOCKER_RPM_IMAGE)" "$(DOCKER_RPM_CONTEXT)"
|
|
|
|
docker-rpm: docker-rpm-image
|
|
mkdir -p "$(DOCKER_RPM_OUTPUT)"
|
|
git_common_dir="$$(git rev-parse --path-format=absolute \
|
|
--git-common-dir)" && \
|
|
$(DOCKER) run --rm \
|
|
--user "$$(id -u):$$(id -g)" \
|
|
--env HOME=/tmp \
|
|
--env WERROR="$(WERROR)" \
|
|
--mount "type=bind,source=$(CURDIR),target=/source,readonly" \
|
|
--mount "type=bind,source=$${git_common_dir},target=$${git_common_dir},readonly" \
|
|
--mount "type=bind,source=$(DOCKER_RPM_OUTPUT),target=/output" \
|
|
"$(DOCKER_RPM_IMAGE)" \
|
|
make -C /source rpm-artifacts \
|
|
RPM_ARTIFACT_SOURCE_DIR=/source \
|
|
RPM_ARTIFACT_OUTPUT_DIR=/output \
|
|
RPM_ARTIFACT_KERNEL_DEVEL_PACKAGE="$(DOCKER_RPM_KERNEL_PACKAGE)-devel"
|
|
|
|
debian/changelog: debian/changelog.in
|
|
sed 's/%{scst_version}/$(VERSION)-$(DEBIAN_REVISION)/' \
|
|
<debian/changelog.in >debian/changelog
|
|
|
|
debian/compat:
|
|
version=$$(dpkg-query -W --showformat='$${Version}\n' debhelper) && \
|
|
printf '%s\n' "$${version%%.*}" >$@
|
|
|
|
../scst_$(VERSION).orig.tar.gz: debian/changelog debian/compat Makefile \
|
|
$(SCST_SOURCE_FILES)
|
|
$(call make-scst-dist,z,gz,$(VERSION),cat) && \
|
|
mv "scst-$(VERSION).tar.gz" "$@"
|
|
|
|
../scst_$(VERSION).orig.tar.xz: debian/changelog debian/compat Makefile \
|
|
$(SCST_SOURCE_FILES)
|
|
$(call make-scst-dist,J,xz,$(VERSION),cat) && \
|
|
mv "scst-$(VERSION).tar.xz" "$@"
|
|
|
|
dpkg: ../scst_$(VERSION).orig.tar.gz
|
|
@[ -n "$$DEBEMAIL" ] || export DEBEMAIL=bvanassche@acm.org && \
|
|
[ -n "$$DEBFULLNAME" ] || export DEBFULLNAME="Bart Van Assche" &&\
|
|
echo "KDIR=$(KDIR)" && \
|
|
echo "KVER=$(KVER)" && \
|
|
sed 's/%{scst_version}/$(VERSION)/' \
|
|
<debian/scst.dkms.in >debian/scst.dkms && \
|
|
sed 's/%{KVER}/$(KVER)/' \
|
|
<debian/scst.preinst.in >debian/scst.preinst && \
|
|
sed 's/%{KVER}/$(KVER)/' \
|
|
<debian/scst.postinst.in >debian/scst.postinst && \
|
|
output_files=( \
|
|
../*_$(VERSION)-$(DEBIAN_REVISION)_*.deb \
|
|
../*_$(VERSION)-$(DEBIAN_REVISION)_*.ddeb \
|
|
../scst_$(VERSION)-$(DEBIAN_REVISION).debian.tar.[gx]z \
|
|
../scst_$(VERSION)-$(DEBIAN_REVISION).dsc \
|
|
../scst_$(VERSION)-$(DEBIAN_REVISION)_amd64.build \
|
|
../scst_$(VERSION)-$(DEBIAN_REVISION)_amd64.buildinfo \
|
|
../scst_$(VERSION)-$(DEBIAN_REVISION)_amd64.changes \
|
|
) && \
|
|
rm -f "$${output_files[@]}" && \
|
|
buildopts=(-uc -us) && \
|
|
if dpkg-buildpackage --help 2>&1 | grep -q -- '-ui'; then \
|
|
buildopts+=(-ui); \
|
|
fi && \
|
|
if dpkg-buildpackage --help 2>&1 | \
|
|
grep -q -- '--jobs\[=<number>|auto\]'; then \
|
|
buildopts+=(-jauto); \
|
|
else \
|
|
buildopts+=(-j4); \
|
|
fi && \
|
|
DEB_CC_SET="$(CC)" DEB_KVER_SET=$(KVER) DEB_KDIR_SET=$(KDIR) \
|
|
DEB_QLA_DIR_SET=$(QLA_DIR) DEB_QLA_INI_DIR_SET=$(QLA_INI_DIR) \
|
|
DEB_PKG_BUILD_MODE=$(PKG_BUILD_MODE) DEB_WERROR_SET="$(WERROR)" \
|
|
debuild "$${buildopts[@]}" --lintian-opts --profile debian && \
|
|
mkdir -p dpkg && \
|
|
for f in "$${output_files[@]}" ../scst_$(VERSION).orig.tar.[gx]z; do\
|
|
mv $$f dpkg || true; \
|
|
done && \
|
|
echo "Output files:" && \
|
|
ls -l dpkg
|
|
|
|
release-archive:
|
|
$(MAKE) 2release
|
|
scripts/release/generate-release-archive scst "$(RELEASE_VERSION)"
|
|
md5sum ../scst-$(RELEASE_VERSION).tar.bz2 \
|
|
> ../scst-$(RELEASE_VERSION).tar.bz2.md5sum
|
|
$(MAKE) 2debug
|
|
|
|
multiple-release-archives:
|
|
$(MAKE) 2release
|
|
for m in $$(find -name Makefile | \
|
|
xargs grep -l '^release-archive:' | \
|
|
grep -v '^\./Makefile'); \
|
|
do \
|
|
(cd $$(dirname $$m) && $(MAKE) release-archive) \
|
|
done
|
|
$(MAKE) 2debug
|
|
|
|
2perf:
|
|
cd $(SCST_DIR) && $(MAKE) $@
|
|
|
|
2release:
|
|
cd $(SCST_DIR) && $(MAKE) $@
|
|
|
|
2debug:
|
|
cd $(SCST_DIR) && $(MAKE) $@
|
|
|
|
.PHONY: help tags cov-build shellcheck all clean extraclean install uninstall \
|
|
ginkgo-check ginkgo-list ginkgo-config ginkgo-test ginkgo-test-build \
|
|
scst scst_clean scst_extraclean scst_install scst_uninstall \
|
|
docs docs_clean docs_extraclean \
|
|
scstadm scstadm_clean scstadm_extraclean scstadm_install scstadm_uninstall \
|
|
qla qla_clean qla_extraclean qla_install qla_uninstall \
|
|
iscsi iscsi_clean iscsi_extraclean iscsi_install iscsi_uninstall \
|
|
emulex emulex_clean emulex_extraclean emulex_install emulex_uninstall \
|
|
srpt srpt_clean srpt_extraclean srpt_install srpt_uninstall \
|
|
fcst fcst_clean fcst_extraclean fcst_install fcst_uninstall \
|
|
scst_local scst_local_clean scst_local_extraclean scst_local_install scst_local_uninstall \
|
|
usr usr_clean usr_extraclean usr_install usr_uninstall \
|
|
scst-rpm scst-dkms-rpm scstadm-rpm rpm rpm-dkms rpm-artifacts \
|
|
docker-rpm-image docker-rpm dpkg \
|
|
2perf 2release 2debug
|
|
|
|
include scst/src/kunit/select.mk
|
|
|
|
PYTHON ?= python3
|
|
|
|
.PHONY: kunit-build kunit-clean kunit-run kunit-test
|
|
|
|
kunit-clean: scst-kunit-clean-files
|
|
@for target in $(SCST_KUNIT_COMPONENTS); do \
|
|
$(MAKE) -C "$$target" clean || exit $$?; \
|
|
done
|
|
|
|
kunit-build:
|
|
@rm -f .kunit-modules .kunit-modules.tmp
|
|
@echo "Building all SCST KUnit tests"
|
|
@for target in $(SCST_KUNIT_COMPONENTS); do \
|
|
$(MAKE) -C "$$target" kunit-build KUNIT_TEST=y || exit $$?; \
|
|
done
|
|
@for module in $(SCST_KUNIT_MODULES); do \
|
|
test -f "$$module" || { echo "Missing built module: $$module"; exit 2; }; \
|
|
done
|
|
@printf '%s\n' $(SCST_KUNIT_MODULES) > .kunit-modules.tmp
|
|
@mv .kunit-modules.tmp .kunit-modules
|
|
|
|
# Build and run sequentially even under make -j.
|
|
kunit-test:
|
|
@$(MAKE) kunit-build
|
|
@$(MAKE) kunit-run
|
|
|
|
kunit-run:
|
|
@$(PYTHON) scripts/kunit/run.py --labels "$(KUNIT_LABEL)" $(KUNIT_ARGS)
|