diff --git a/cpp/Makefile b/cpp/Makefile index ec93bc0599..82290cddd5 100644 --- a/cpp/Makefile +++ b/cpp/Makefile @@ -7,6 +7,7 @@ CROSS_COMPILE = CXX = $(CROSS_COMPILE)g++ +AR = ar ## DEBUG=1 : A Debug build includes the debugger symbols ## and disables compiler optimization. Typically, @@ -29,6 +30,7 @@ CXXFLAGS += -std=c++20 -iquote . -D_FILE_OFFSET_BITS=64 -DFMT_HEADER_ONLY -DSPDL ## EXTRA_FLAGS : Can be used to pass special purpose flags CXXFLAGS += $(EXTRA_FLAGS) +ARFLAGS = -rcs ## CONNECT_TYPE=FULLSPEC : Specify the type of PiSCSI board type ## that you are using. The typical options are @@ -61,6 +63,7 @@ COVERAGE_FILE = piscsi.dat OS_FILES = ../os_integration OBJDIR := obj/$(shell echo $(CONNECT_TYPE) | tr '[:upper:]' '[:lower:]') +LIBDIR := lib/$(shell echo $(CONNECT_TYPE) | tr '[:upper:]' '[:lower:]') BINDIR := bin/$(shell echo $(CONNECT_TYPE) | tr '[:upper:]' '[:lower:]') BIN_ALL = \ @@ -74,13 +77,11 @@ SRC_PROTOC = piscsi_interface.proto SRC_GENERATED = $(GENERATED_DIR)/piscsi_interface.pb.cpp -SRC_PROTOBUF = \ - shared/protobuf_util.cpp - SRC_SHARED = \ shared/piscsi_version.cpp \ shared/piscsi_util.cpp \ - shared/network_util.cpp + shared/network_util.cpp \ + shared/protobuf_util.cpp SRC_PISCSI_CORE = $(shell find ./piscsi -name '*.cpp' | grep -v piscsi.cpp) SRC_PISCSI_CORE += $(shell find ./controllers -name '*.cpp') @@ -125,10 +126,12 @@ OBJ_SCSIMON := $(addprefix $(OBJDIR)/,$(notdir $(SRC_SCSIMON:%.cpp=%.o))) OBJ_PISCSI_TEST := $(addprefix $(OBJDIR)/,$(notdir $(SRC_PISCSI_TEST:%.cpp=%.o))) OBJ_SCSILOOP := $(addprefix $(OBJDIR)/,$(notdir $(SRC_SCSILOOP:%.cpp=%.o))) OBJ_SHARED := $(addprefix $(OBJDIR)/,$(notdir $(SRC_SHARED:%.cpp=%.o))) -OBJ_PROTOBUF := $(addprefix $(OBJDIR)/,$(notdir $(SRC_PROTOBUF:%.cpp=%.o))) OBJ_GENERATED := $(addprefix $(OBJDIR)/,$(notdir $(SRC_GENERATED:%.cpp=%.o))) -GENERATED_DIR := generated +LIB_PISCSI_CORE = $(LIBDIR)/libpiscsi_core.a +LIB_SHARED = $(LIBDIR)/libshared.a + +GENERATED_DIR = generated # 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 @@ -137,10 +140,10 @@ TEST_WRAPS = -Wl,--wrap=fopen64 # 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 -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)) +ALL_DEPS := $(patsubst %.o,%.d,$(OBJ_PISCSI_CORE) $(OBJ_SCSICTL_CORE) $(OBJ_PISCSI) $(OBJ_SCSICTL) $(OBJ_SCSIDUMP) $(OBJ_SCSIMON) $(OBJ_SHARED) $(OBJ_PISCSI_TEST) $(OBJ_SCSILOOP)) -include $(ALL_DEPS) -$(OBJDIR) $(BINDIR): +$(OBJDIR) $(LIBDIR) $(BINDIR): @echo "-- Creating directory $@" mkdir -p $@ @@ -185,23 +188,29 @@ docs: $(DOC_DIR)/piscsi_man_page.txt $(DOC_DIR)/scsictl_man_page.txt $(DOC_DIR)/ $(SRC_PISCSI_CORE) $(SRC_SCSICTL_CORE) : $(OBJ_GENERATED) -$(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 +$(LIB_PISCSI_CORE): $(OBJ_PISCSI_CORE) | $(LIBDIR) + $(AR) $(ARFLAGS) $@ $(OBJ_PISCSI_CORE) + +$(LIB_SHARED): $(OBJ_SHARED) | $(LIBDIR) + $(AR) $(ARFLAGS) $@ $(OBJ_SHARED) + +$(BINDIR)/$(PISCSI): $(LIB_PISCSI_CORE) $(LIB_SHARED) $(OBJ_GENERATED) $(OBJ_PISCSI) $(OBJ_GENERATED) | $(BINDIR) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(LIB_PISCSI_CORE) $(LIB_SHARED) $(OBJ_PISCSI) $(OBJ_GENERATED) -lpthread -lpcap -lprotobuf -$(BINDIR)/$(SCSICTL): $(OBJ_GENERATED) $(OBJ_SCSICTL_CORE) $(OBJ_SCSICTL) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) | $(BINDIR) - $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ_SCSICTL_CORE) $(OBJ_SCSICTL) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) -lpthread -lprotobuf +$(BINDIR)/$(SCSICTL): $(LIB_SHARED) $(OBJ_GENERATED) $(OBJ_SCSICTL_CORE) $(OBJ_SCSICTL) $(OBJ_GENERATED) | $(BINDIR) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(LIB_SHARED) $(OBJ_SCSICTL_CORE) $(OBJ_SCSICTL) $(OBJ_GENERATED) -lpthread -lprotobuf -$(BINDIR)/$(SCSIDUMP): $(OBJ_SCSIDUMP) $(OBJ_SHARED) | $(BINDIR) - $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ_SCSIDUMP) $(OBJ_SHARED) +$(BINDIR)/$(SCSIDUMP): $(LIB_SHARED) $(OBJ_SCSIDUMP) | $(BINDIR) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(LIB_SHARED) $(OBJ_SCSIDUMP) -$(BINDIR)/$(SCSIMON): $(OBJ_SCSIMON) $(OBJ_SHARED) | $(BINDIR) - $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ_SCSIMON) $(OBJ_SHARED) +$(BINDIR)/$(SCSIMON): $(LIB_SHARED) $(OBJ_SCSIMON) | $(BINDIR) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(LIB_SHARED) $(OBJ_SCSIMON) -$(BINDIR)/$(SCSILOOP): $(OBJ_SHARED) $(OBJ_SCSILOOP) | $(BINDIR) - $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ_SHARED) $(OBJ_SCSILOOP) +$(BINDIR)/$(SCSILOOP): $(LIB_SHARED) $(OBJ_SCSILOOP) | $(BINDIR) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(LIB_SHARED) $(OBJ_SCSILOOP) -$(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 +$(BINDIR)/$(PISCSI_TEST): $(LIB_PISCSI_CORE) $(LIB_SHARED) $(OBJ_GENERATED) $(OBJ_SCSICTL_CORE) $(OBJ_PISCSI_TEST) $(OBJ_SCSICTL_TEST) $(OBJ_GENERATED) | $(BINDIR) + $(CXX) $(CXXFLAGS) $(LDFLAGS) $(TEST_WRAPS) -o $@ $(LIB_PISCSI_CORE) $(LIB_SHARED) $(OBJ_SCSICTL_CORE) $(OBJ_PISCSI_TEST) $(OBJ_GENERATED) -lpthread -lpcap -lprotobuf -lgmock -lgtest # Phony rules for building individual utilities .PHONY: $(PISCSI) $(SCSICTL) $(SCSIDUMP) $(SCSIMON) $(PISCSI_TEST) $(SCSILOOP) @@ -216,7 +225,7 @@ $(SCSILOOP) : $(BINDIR)/$(SCSILOOP) ## compiler files and executable files .PHONY: clean clean: - rm -rf $(OBJDIR) $(BINDIR) $(GENERATED_DIR) $(COVERAGE_DIR) $(COVERAGE_FILE) + rm -rf $(OBJDIR) $(LIBDIR) $(BINDIR) $(GENERATED_DIR) $(COVERAGE_DIR) $(COVERAGE_FILE) ## install : Copies all of the man pages to the correct location ## Copies the binaries to a global install location