mirror of
https://github.com/SCST-project/scst.git
synced 2026-10-22 06:02:33 +00:00
Document SCS.1 and expose make scs_lint for the common C source/header scope, including userspace and KUnit. Adapt engine's OCS.7.5 check to SCST_KUNIT_VISIBLE, SCST_KUNIT_VISIBLE_INLINE and VISIBLE_IF_KUNIT. Require each annotation to occupy its own line; leave other function attributes and source warnings unchanged. Use Tree-sitter to distinguish code from comments, literals and preprocessor directive contents while checking every conditional branch. Pin the parser dependencies and run them through uv. Support whole-tree, DIFFBR and explicit-file selection without new exclusions or diagnostic exceptions. Retain findings and checked-file records even when a later input fails. Add isolated rule, diff-mode, coverage and read-failure fixtures with a separate test target.
726 lines
24 KiB
Makefile
726 lines
24 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 policy to show (default: common)' \
|
|
' ANALYZER_FORMAT=text|json policy output format (default: text)' \
|
|
' sparse, smatch analyze configured modules through Kbuild' \
|
|
' coccicheck run kernel Coccinelle report rules' \
|
|
' cppcheck analyze fresh kernel and userspace build contexts' \
|
|
' checkpatch check C source/header style, including KUnit' \
|
|
' scs_lint check SCST code style rules (doc/scs.md)' \
|
|
' DIFFBR=commit compare with one commit; select relevant inputs' \
|
|
' 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 $@
|
|
|
|
.PHONY: coccicheck
|
|
coccicheck: export SCST_LINT_KDIR := $(KDIR)
|
|
coccicheck:
|
|
+@$(PYTHON) -B scripts/coccinelle/coccicheck.py
|
|
|
|
.PHONY: checkpatch
|
|
checkpatch: export SCST_LINT_KDIR := $(KDIR)
|
|
checkpatch:
|
|
@$(PYTHON) -B scripts/style/checkpatch.py
|
|
|
|
.PHONY: scs_lint scs-lint-test
|
|
scs_lint:
|
|
@scripts/scs_lint/run_scs_lint.sh
|
|
|
|
scs-lint-test:
|
|
@uv run --no-project scripts/scs_lint/test_scs_lint.py
|
|
|
|
.PHONY: cppcheck lint-userspace
|
|
cppcheck: export SCST_LINT_KDIR := $(KDIR)
|
|
cppcheck: export SCST_LINT_CC := $(CC)
|
|
cppcheck:
|
|
+@$(PYTHON) -B scripts/cppcheck/cppcheck.py
|
|
|
|
lint-userspace:
|
|
+$(MAKE) -C scst/src ../include/scst_itf_ver.h
|
|
+$(MAKE) -C $(ISCSI_DIR) progs
|
|
+$(MAKE) -C usr/fileio
|
|
+$(MAKE) -C usr/stpgd
|
|
+$(MAKE) -C usr/events
|
|
|
|
# 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)
|