2020-07-07 19:16:02 +00:00
|
|
|
.DEFAULT_GOAL: all
|
|
|
|
|
2020-09-05 15:25:05 +00:00
|
|
|
## Optional build flags:
|
2021-12-06 19:45:44 +00:00
|
|
|
## CROSS_COMPILE : Specify which compiler toolchain to use.
|
|
|
|
## To cross compile set this accordingly, e.g. to:
|
|
|
|
## arm-linux-gnueabihf-
|
|
|
|
CROSS_COMPILE =
|
2020-08-28 04:16:23 +00:00
|
|
|
|
|
|
|
CXX = $(CROSS_COMPILE)g++
|
2020-07-07 19:16:02 +00:00
|
|
|
|
2020-09-05 15:25:05 +00:00
|
|
|
## DEBUG=1 : A Debug build includes the debugger symbols
|
|
|
|
## and disables compiler optimization. Typically,
|
|
|
|
## this is only used by developers.
|
2020-07-10 22:49:02 +00:00
|
|
|
DEBUG ?= 0
|
|
|
|
ifeq ($(DEBUG), 1)
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
# Debug compiler flags
|
2023-10-15 06:38:15 +00:00
|
|
|
CXXFLAGS += -Og -g -Wall -Wextra -DDEBUG
|
2020-07-10 22:49:02 +00:00
|
|
|
else
|
2022-09-07 14:38:42 +00:00
|
|
|
# Release compiler flags
|
|
|
|
CXXFLAGS += -O3 -Wall -Werror -Wextra -DNDEBUG
|
2020-07-10 22:49:02 +00:00
|
|
|
endif
|
2022-01-07 18:17:44 +00:00
|
|
|
ifeq ("$(shell uname -s)","Linux")
|
|
|
|
# -Wno-psabi might not work on non-Linux platforms
|
|
|
|
CXXFLAGS += -Wno-psabi
|
|
|
|
endif
|
|
|
|
|
2023-10-15 06:38:15 +00:00
|
|
|
CXXFLAGS += -std=c++20 -iquote . -D_FILE_OFFSET_BITS=64 -DFMT_HEADER_ONLY -DSPDLOG_FMT_EXTERNAL -MD -MP
|
2021-06-27 03:26:04 +00:00
|
|
|
|
|
|
|
## EXTRA_FLAGS : Can be used to pass special purpose flags
|
|
|
|
CXXFLAGS += $(EXTRA_FLAGS)
|
2020-07-07 19:16:02 +00:00
|
|
|
|
2021-12-20 18:50:14 +00:00
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
## CONNECT_TYPE=FULLSPEC : Specify the type of PiSCSI board type
|
2020-09-05 15:25:05 +00:00
|
|
|
## that you are using. The typical options are
|
2021-02-07 19:00:48 +00:00
|
|
|
## STANDARD or FULLSPEC. The default is FULLSPEC
|
2020-09-05 15:25:05 +00:00
|
|
|
## * THIS IS TYPICALLY THE ONLY COMPILE OPTION YOU
|
|
|
|
## * NEED TO SPECIFY
|
2020-10-19 12:31:06 +00:00
|
|
|
# If its not specified, build for FULLSPEC configuration
|
|
|
|
CONNECT_TYPE ?= FULLSPEC
|
2020-07-04 14:57:44 +00:00
|
|
|
|
|
|
|
ifdef CONNECT_TYPE
|
|
|
|
CXXFLAGS += -DCONNECT_TYPE_$(CONNECT_TYPE)
|
|
|
|
endif
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
PISCSI = piscsi
|
|
|
|
SCSICTL = scsictl
|
|
|
|
SCSIDUMP = scsidump
|
2020-07-07 19:16:02 +00:00
|
|
|
SCSIMON = scsimon
|
2022-12-05 17:58:23 +00:00
|
|
|
PISCSI_TEST = piscsi_test
|
2022-12-03 04:20:27 +00:00
|
|
|
SCSILOOP = scsiloop
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
SYSTEMD_CONF = /etc/systemd/system/piscsi.service
|
|
|
|
RSYSLOG_CONF = /etc/rsyslog.d/piscsi.conf
|
|
|
|
RSYSLOG_LOG = /var/log/piscsi.log
|
2020-09-05 15:25:05 +00:00
|
|
|
|
2020-07-09 18:21:59 +00:00
|
|
|
USR_LOCAL_BIN = /usr/local/bin
|
2021-11-19 01:41:33 +00:00
|
|
|
MAN_PAGE_DIR = /usr/local/man/man1
|
2022-10-25 19:59:30 +00:00
|
|
|
DOC_DIR = ../doc
|
2022-11-10 06:44:06 +00:00
|
|
|
COVERAGE_DIR = coverage
|
2022-12-05 17:58:23 +00:00
|
|
|
COVERAGE_FILE = piscsi.dat
|
2023-01-28 23:03:41 +00:00
|
|
|
OS_FILES = ../os_integration
|
2020-07-09 18:21:59 +00:00
|
|
|
|
2022-11-10 06:44:06 +00:00
|
|
|
OBJDIR := obj/$(shell echo $(CONNECT_TYPE) | tr '[:upper:]' '[:lower:]')
|
|
|
|
BINDIR := bin/$(shell echo $(CONNECT_TYPE) | tr '[:upper:]' '[:lower:]')
|
2020-08-28 14:18:02 +00:00
|
|
|
|
2021-10-01 23:28:14 +00:00
|
|
|
BIN_ALL = \
|
2022-12-05 17:58:23 +00:00
|
|
|
$(BINDIR)/$(PISCSI) \
|
|
|
|
$(BINDIR)/$(SCSICTL) \
|
2021-10-01 23:28:14 +00:00
|
|
|
$(BINDIR)/$(SCSIMON) \
|
2022-12-05 17:58:23 +00:00
|
|
|
$(BINDIR)/$(SCSIDUMP) \
|
2022-12-03 04:20:27 +00:00
|
|
|
$(BINDIR)/$(SCSILOOP)
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
SRC_PROTOC = piscsi_interface.proto
|
2022-11-10 06:44:06 +00:00
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
SRC_GENERATED = $(GENERATED_DIR)/piscsi_interface.pb.cpp
|
2021-07-18 22:15:13 +00:00
|
|
|
|
|
|
|
SRC_PROTOBUF = \
|
2023-10-15 06:38:15 +00:00
|
|
|
shared/protobuf_util.cpp
|
2021-07-18 22:15:13 +00:00
|
|
|
|
2022-10-08 17:26:04 +00:00
|
|
|
SRC_SHARED = \
|
2022-12-05 17:58:23 +00:00
|
|
|
shared/piscsi_version.cpp \
|
2023-10-15 06:38:15 +00:00
|
|
|
shared/piscsi_util.cpp \
|
|
|
|
shared/network_util.cpp
|
2022-10-08 17:26:04 +00:00
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
SRC_PISCSI_CORE = $(shell find ./piscsi -name '*.cpp')
|
|
|
|
SRC_PISCSI_CORE += $(shell find ./controllers -name '*.cpp')
|
|
|
|
SRC_PISCSI_CORE += $(shell find ./devices -name '*.cpp')
|
|
|
|
SRC_PISCSI_CORE += $(shell find ./hal -name '*.cpp')
|
2022-08-28 17:25:08 +00:00
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
SRC_PISCSI = piscsi.cpp
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-11-10 06:44:06 +00:00
|
|
|
SRC_SCSIMON = scsimon.cpp
|
2022-01-07 18:17:44 +00:00
|
|
|
SRC_SCSIMON += $(shell find ./monitor -name '*.cpp')
|
2022-09-10 21:40:24 +00:00
|
|
|
SRC_SCSIMON += $(shell find ./hal -name '*.cpp')
|
2020-10-19 12:31:06 +00:00
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
SRC_SCSICTL_CORE = $(shell find ./scsictl -name '*.cpp')
|
2022-10-08 17:26:04 +00:00
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
SRC_SCSICTL = scsictl.cpp
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
SRC_SCSIDUMP = scsidump.cpp
|
|
|
|
SRC_SCSIDUMP += $(shell find ./scsidump -name '*.cpp')
|
|
|
|
SRC_SCSIDUMP += $(shell find ./hal -name '*.cpp')
|
2022-08-28 17:25:08 +00:00
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
SRC_PISCSI_TEST = $(shell find ./test -name '*.cpp')
|
|
|
|
SRC_PISCSI_TEST += $(shell find ./scsidump -name '*.cpp')
|
|
|
|
SRC_PISCSI_TEST += $(shell find ./monitor -name '*.cpp')
|
2022-08-28 17:25:08 +00:00
|
|
|
|
2022-12-03 04:20:27 +00:00
|
|
|
SRC_SCSILOOP = scsiloop.cpp
|
|
|
|
SRC_SCSILOOP += $(shell find ./scsiloop -name '*.cpp')
|
|
|
|
SRC_SCSILOOP += $(shell find ./hal -name '*.cpp')
|
|
|
|
|
|
|
|
vpath %.h ./ ./shared ./controllers ./devices ./monitor ./hal \
|
2022-12-05 17:58:23 +00:00
|
|
|
./hal/boards ./hal/pi_defs ./piscsi ./scsictl ./scsidump \
|
2022-12-03 04:20:27 +00:00
|
|
|
./scsiloop
|
|
|
|
vpath %.cpp ./ ./shared ./controllers ./devices ./monitor ./hal \
|
2022-12-05 17:58:23 +00:00
|
|
|
./hal/boards ./hal/pi_defs ./piscsi ./scsictl ./scsidump \
|
2022-12-03 04:20:27 +00:00
|
|
|
./scsiloop ./test
|
2020-08-28 14:18:02 +00:00
|
|
|
vpath %.o ./$(OBJDIR)
|
|
|
|
vpath ./$(BINDIR)
|
|
|
|
|
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
OBJ_PISCSI_CORE := $(addprefix $(OBJDIR)/,$(notdir $(SRC_PISCSI_CORE:%.cpp=%.o)))
|
|
|
|
OBJ_PISCSI := $(addprefix $(OBJDIR)/,$(notdir $(SRC_PISCSI:%.cpp=%.o)))
|
|
|
|
OBJ_SCSICTL_CORE := $(addprefix $(OBJDIR)/,$(notdir $(SRC_SCSICTL_CORE:%.cpp=%.o)))
|
|
|
|
OBJ_SCSICTL := $(addprefix $(OBJDIR)/,$(notdir $(SRC_SCSICTL:%.cpp=%.o)))
|
|
|
|
OBJ_SCSIDUMP := $(addprefix $(OBJDIR)/,$(notdir $(SRC_SCSIDUMP:%.cpp=%.o)))
|
2021-07-18 22:15:13 +00:00
|
|
|
OBJ_SCSIMON := $(addprefix $(OBJDIR)/,$(notdir $(SRC_SCSIMON:%.cpp=%.o)))
|
2022-12-05 17:58:23 +00:00
|
|
|
OBJ_PISCSI_TEST := $(addprefix $(OBJDIR)/,$(notdir $(SRC_PISCSI_TEST:%.cpp=%.o)))
|
2022-12-03 04:20:27 +00:00
|
|
|
OBJ_SCSILOOP := $(addprefix $(OBJDIR)/,$(notdir $(SRC_SCSILOOP:%.cpp=%.o)))
|
2022-10-08 17:26:04 +00:00
|
|
|
OBJ_SHARED := $(addprefix $(OBJDIR)/,$(notdir $(SRC_SHARED:%.cpp=%.o)))
|
2022-10-06 14:15:19 +00:00
|
|
|
OBJ_PROTOBUF := $(addprefix $(OBJDIR)/,$(notdir $(SRC_PROTOBUF:%.cpp=%.o)))
|
2022-11-10 06:44:06 +00:00
|
|
|
OBJ_GENERATED := $(addprefix $(OBJDIR)/,$(notdir $(SRC_GENERATED:%.cpp=%.o)))
|
2021-07-18 22:15:13 +00:00
|
|
|
|
2022-11-10 06:44:06 +00:00
|
|
|
GENERATED_DIR := generated
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-12-03 04:20:27 +00:00
|
|
|
# For the unit tests, the following functions will be "wrapped" by the linker, meaning the
|
|
|
|
# __wrap_xxxx() function will be called instead of the real function. These linker flags
|
|
|
|
# should only be used for testing purposes!
|
|
|
|
TEST_WRAPS = -Wl,--wrap=fopen64
|
2020-09-04 00:39:10 +00:00
|
|
|
|
|
|
|
# The following will include all of the auto-generated dependency files (*.d)
|
|
|
|
# if they exist. This will trigger a rebuild of a source file if a header changes
|
2022-12-05 17:58:23 +00:00
|
|
|
ALL_DEPS := $(patsubst %.o,%.d,$(OBJ_PISCSI_CORE) $(OBJ_SCSICTL_CORE) $(OBJ_PISCSI) $(OBJ_SCSICTL) $(OBJ_SCSIDUMP) $(OBJ_SCSIMON) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_PISCSI_TEST) $(OBJ_SCSILOOP))
|
2020-09-04 00:39:10 +00:00
|
|
|
-include $(ALL_DEPS)
|
|
|
|
|
2020-08-28 14:18:02 +00:00
|
|
|
$(OBJDIR) $(BINDIR):
|
2022-11-10 06:44:06 +00:00
|
|
|
@echo "-- Creating directory $@"
|
2020-08-28 14:18:02 +00:00
|
|
|
mkdir -p $@
|
|
|
|
|
2020-09-04 00:39:10 +00:00
|
|
|
$(OBJDIR)/%.o: %.cpp | $(OBJDIR)
|
2020-07-04 14:57:44 +00:00
|
|
|
$(CXX) $(CXXFLAGS) -c $< -o $@
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-11-10 06:44:06 +00:00
|
|
|
$(SRC_GENERATED) : $(SRC_PROTOC)
|
|
|
|
@echo "-- Generating protobuf-based source files"
|
|
|
|
mkdir -p $(GENERATED_DIR)
|
|
|
|
protoc --cpp_out=$(GENERATED_DIR) $(SRC_PROTOC)
|
2022-12-05 17:58:23 +00:00
|
|
|
mv $(GENERATED_DIR)/piscsi_interface.pb.cc $@
|
2022-11-10 06:44:06 +00:00
|
|
|
|
2023-10-15 06:38:15 +00:00
|
|
|
$(OBJ_GENERATED) : $(SRC_GENERATED) | $(OBJDIR)
|
2022-11-10 06:44:06 +00:00
|
|
|
$(CXX) $(CXXFLAGS) -c $< -o $@
|
2021-07-18 22:15:13 +00:00
|
|
|
|
2020-09-05 15:25:05 +00:00
|
|
|
## Build Targets:
|
|
|
|
## all : Rebuild all of the executable files and re-generate
|
|
|
|
## the text versions of the manpages
|
|
|
|
## docs : Re-generate the text versions of the man pages
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
## test : Build and run unit tests
|
2022-09-10 05:59:41 +00:00
|
|
|
## coverage : Build and run unit tests and create coverage SonarQube files.
|
|
|
|
## lcov : Build and run unit tests and create coverage HTML files.
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
## Note that you have to run 'make clean' before switching
|
2022-09-10 05:59:41 +00:00
|
|
|
## between coverage and non-coverage builds.
|
2020-07-10 22:49:02 +00:00
|
|
|
.DEFAULT_GOAL := all
|
2023-10-15 06:38:15 +00:00
|
|
|
.PHONY: all docs test coverage lcov
|
|
|
|
|
|
|
|
all: $(SRC_GENERATED) $(BIN_ALL) docs
|
2020-07-10 22:49:02 +00:00
|
|
|
|
2023-10-15 06:38:15 +00:00
|
|
|
test: $(SRC_GENERATED) $(BINDIR)/$(PISCSI_TEST)
|
2022-12-05 17:58:23 +00:00
|
|
|
$(BINDIR)/$(PISCSI_TEST)
|
2022-08-28 17:25:08 +00:00
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
coverage: CXXFLAGS += --coverage
|
|
|
|
coverage: test
|
2022-09-10 05:59:41 +00:00
|
|
|
|
|
|
|
lcov: CXXFLAGS += --coverage
|
|
|
|
lcov: test
|
2022-12-05 17:58:23 +00:00
|
|
|
lcov -q -c -d . --include '*/cpp/*' -o $(COVERAGE_FILE) --exclude '*/test/*' --exclude '*/interfaces/*' --exclude '*/piscsi_interface.pb*'
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
genhtml -q -o $(COVERAGE_DIR) --legend $(COVERAGE_FILE)
|
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
docs: $(DOC_DIR)/piscsi_man_page.txt $(DOC_DIR)/scsictl_man_page.txt $(DOC_DIR)/scsimon_man_page.txt $(DOC_DIR)/scsidump_man_page.txt $(DOC_DIR)/scsiloop_man_page.txt
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
$(SRC_PISCSI_CORE) $(SRC_SCSICTL_CORE) : $(OBJ_GENERATED)
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2023-10-15 06:38:15 +00:00
|
|
|
$(BINDIR)/$(PISCSI): $(OBJ_GENERATED) $(OBJ_PISCSI_CORE) $(OBJ_PISCSI) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) | $(BINDIR)
|
|
|
|
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ_PISCSI_CORE) $(OBJ_PISCSI) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) -lpthread -lpcap -lprotobuf
|
2022-10-06 14:15:19 +00:00
|
|
|
|
2023-10-15 06:38:15 +00:00
|
|
|
$(BINDIR)/$(SCSICTL): $(OBJ_GENERATED) $(OBJ_SCSICTL_CORE) $(OBJ_SCSICTL) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) | $(BINDIR)
|
2023-03-24 07:54:05 +00:00
|
|
|
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ_SCSICTL_CORE) $(OBJ_SCSICTL) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) -lpthread -lprotobuf
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-12-05 17:58:23 +00:00
|
|
|
$(BINDIR)/$(SCSIDUMP): $(OBJ_SCSIDUMP) $(OBJ_SHARED) | $(BINDIR)
|
2023-03-24 07:54:05 +00:00
|
|
|
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ_SCSIDUMP) $(OBJ_SHARED)
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-11-10 06:44:06 +00:00
|
|
|
$(BINDIR)/$(SCSIMON): $(OBJ_SCSIMON) $(OBJ_SHARED) | $(BINDIR)
|
2023-03-24 07:54:05 +00:00
|
|
|
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ_SCSIMON) $(OBJ_SHARED)
|
2022-08-28 17:25:08 +00:00
|
|
|
|
2022-12-03 04:20:27 +00:00
|
|
|
$(BINDIR)/$(SCSILOOP): $(OBJ_SHARED) $(OBJ_SCSILOOP) | $(BINDIR)
|
2023-03-24 07:54:05 +00:00
|
|
|
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ_SHARED) $(OBJ_SCSILOOP)
|
|
|
|
|
2023-10-15 06:38:15 +00:00
|
|
|
$(BINDIR)/$(PISCSI_TEST): $(OBJ_GENERATED) $(OBJ_PISCSI_CORE) $(OBJ_SCSICTL_CORE) $(OBJ_PISCSI_TEST) $(OBJ_SCSICTL_TEST) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) | $(BINDIR)
|
|
|
|
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(TEST_WRAPS) -o $@ $(OBJ_PISCSI_CORE) $(OBJ_SCSICTL_CORE) $(OBJ_PISCSI_TEST) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) -lpthread -lpcap -lprotobuf -lgmock -lgtest
|
2022-01-07 18:17:44 +00:00
|
|
|
|
|
|
|
# Phony rules for building individual utilities
|
2022-12-05 17:58:23 +00:00
|
|
|
.PHONY: $(PISCSI) $(SCSICTL) $(SCSIDUMP) $(SCSIMON) $(PISCSI_TEST) $(SCSILOOP)
|
|
|
|
$(PISCSI) : $(BINDIR)/$(PISCSI)
|
|
|
|
$(SCSICTL) : $(BINDIR)/$(SCSICTL)
|
|
|
|
$(SCSIDUMP) : $(BINDIR)/$(SCSIDUMP)
|
2022-01-07 18:17:44 +00:00
|
|
|
$(SCSIMON) : $(BINDIR)/$(SCSIMON)
|
2022-12-05 17:58:23 +00:00
|
|
|
$(PISCSI_TEST): $(BINDIR)/$(PISCSI_TEST)
|
2022-12-03 04:20:27 +00:00
|
|
|
$(SCSILOOP) : $(BINDIR)/$(SCSILOOP)
|
2022-01-07 18:17:44 +00:00
|
|
|
|
2020-09-05 15:25:05 +00:00
|
|
|
## clean : Remove all of the object files, intermediate
|
|
|
|
## compiler files and executable files
|
|
|
|
.PHONY: clean
|
2018-05-03 13:47:57 +00:00
|
|
|
clean:
|
2022-11-10 06:44:06 +00:00
|
|
|
rm -rf $(OBJDIR) $(BINDIR) $(GENERATED_DIR) $(COVERAGE_DIR) $(COVERAGE_FILE)
|
2020-07-07 00:23:54 +00:00
|
|
|
|
2020-09-05 15:25:05 +00:00
|
|
|
## install : Copies all of the man pages to the correct location
|
|
|
|
## Copies the binaries to a global install location
|
2022-12-05 17:58:23 +00:00
|
|
|
## Configures the Systemd and RSyslog services to auto-run PiSCSI
|
2020-09-05 15:25:05 +00:00
|
|
|
## * This target needs to be run with sudo (ex: sudo make install)
|
2022-12-05 17:58:23 +00:00
|
|
|
## * Before running this, you need to stop the piscsi service if
|
2020-09-05 15:25:05 +00:00
|
|
|
## * it is already running:
|
2022-12-05 17:58:23 +00:00
|
|
|
## * sudo systemctl stop piscsi
|
2020-09-05 15:25:05 +00:00
|
|
|
## * After running this, you will need to reboot or run:
|
|
|
|
## * sudo systemctl daemon-reload
|
|
|
|
## * sudo systemctl restart rsyslog
|
2022-12-05 17:58:23 +00:00
|
|
|
## * sudo systemctl enable piscsi
|
|
|
|
## * sudo systemctl start piscsi
|
2020-09-05 15:25:05 +00:00
|
|
|
.PHONY: install
|
2021-10-02 06:16:35 +00:00
|
|
|
install: \
|
2022-12-05 17:58:23 +00:00
|
|
|
$(MAN_PAGE_DIR)/piscsi.1 \
|
|
|
|
$(MAN_PAGE_DIR)/scsictl.1 \
|
2021-10-02 06:16:35 +00:00
|
|
|
$(MAN_PAGE_DIR)/scsimon.1 \
|
2022-12-03 04:20:27 +00:00
|
|
|
$(MAN_PAGE_DIR)/scsiloop.1 \
|
2022-12-05 17:58:23 +00:00
|
|
|
$(MAN_PAGE_DIR)/scsidump.1 \
|
|
|
|
$(USR_LOCAL_BIN)/$(SCSICTL) \
|
|
|
|
$(USR_LOCAL_BIN)/$(PISCSI) \
|
2021-10-02 06:16:35 +00:00
|
|
|
$(USR_LOCAL_BIN)/$(SCSIMON) \
|
2022-12-03 04:20:27 +00:00
|
|
|
$(USR_LOCAL_BIN)/$(SCSILOOP) \
|
2022-12-05 17:58:23 +00:00
|
|
|
$(USR_LOCAL_BIN)/$(SCSIDUMP) \
|
2021-10-02 06:16:35 +00:00
|
|
|
$(SYSTEMD_CONF) \
|
|
|
|
$(RSYSLOG_CONF) \
|
|
|
|
$(RSYSLOG_LOG)
|
2020-09-05 15:25:05 +00:00
|
|
|
@echo "-- Done installing!"
|
|
|
|
|
|
|
|
$(USR_LOCAL_BIN)% : $(BINDIR)/%
|
|
|
|
@echo "-- Copying $@"
|
|
|
|
cp $< $@
|
2020-07-09 18:21:59 +00:00
|
|
|
|
2021-12-19 23:51:45 +00:00
|
|
|
$(MAN_PAGE_DIR)/%.1 : $(DOC_DIR)/%.1 | $(MAN_PAGE_DIR)/
|
2020-09-05 15:25:05 +00:00
|
|
|
@echo "-- Copying $@"
|
|
|
|
cp $< $@
|
2020-07-09 18:21:59 +00:00
|
|
|
|
|
|
|
$(DOC_DIR)/%_man_page.txt : $(DOC_DIR)/%.1
|
2020-07-09 18:28:17 +00:00
|
|
|
@echo "!! ------ THIS FILE IS AUTO_GENERATED! DO NOT MANUALLY UPDATE!!!" > $@
|
|
|
|
@echo "!! ------ The native file is $(notdir $<). Re-run 'make docs' after updating\n\n" >> $@
|
|
|
|
man -l $< | col -bx >> $@
|
2020-07-07 19:16:02 +00:00
|
|
|
|
2020-09-05 15:25:05 +00:00
|
|
|
$(SYSTEMD_CONF) : $(OS_FILES)/$(notdir $(SYSTEMD_CONF))
|
|
|
|
@echo "-- Copying $@"
|
|
|
|
cp $< $@
|
|
|
|
|
|
|
|
$(RSYSLOG_CONF) : $(OS_FILES)/$(notdir $(RSYSLOG_CONF))
|
|
|
|
@echo "-- Copying $@"
|
|
|
|
cp $< $@
|
|
|
|
|
|
|
|
$(RSYSLOG_LOG) :
|
|
|
|
@echo "-- Creating $@"
|
2022-12-05 17:58:23 +00:00
|
|
|
touch /var/log/piscsi.log
|
|
|
|
chown root:adm /var/log/piscsi.log
|
2020-09-05 15:25:05 +00:00
|
|
|
|
2021-12-19 23:51:45 +00:00
|
|
|
$(MAN_PAGE_DIR)/:
|
|
|
|
echo "-- Creating directory $@"
|
|
|
|
mkdir -p $@
|
|
|
|
|
2020-09-05 15:25:05 +00:00
|
|
|
## help : Lists information about how to use the makefile
|
|
|
|
# The help rule is based upon the approach from:
|
|
|
|
# https://swcarpentry.github.io/make-novice/08-self-doc/index.html
|
|
|
|
.PHONY: help
|
|
|
|
help : Makefile
|
|
|
|
@sed -n 's/^##//p' $<
|
|
|
|
|
|
|
|
## Debug : Same as 'all'. Useful when using a debugger.
|
2020-07-07 19:16:02 +00:00
|
|
|
.PHONY: Debug
|
2020-07-09 22:57:13 +00:00
|
|
|
Debug: all
|
2020-09-05 15:25:05 +00:00
|
|
|
|