LIB60870_HOME=. include make/target_system.mk ifndef WITHOUT_COMMON LIB_SOURCE_DIRS = src/common endif LIB_SOURCE_DIRS += src/iec60870 LIB_SOURCE_DIRS += src/iec60870/cs101 LIB_SOURCE_DIRS += src/iec60870/cs104 LIB_SOURCE_DIRS += src/iec60870/link_layer LIB_SOURCE_DIRS += src/iec60870/apl ifndef WITHOUT_HAL ifeq ($(HAL_IMPL), WIN32) LIB_SOURCE_DIRS += src/hal/socket/win32 LIB_SOURCE_DIRS += src/hal/thread/win32 LIB_SOURCE_DIRS += src/hal/time/win32 LIB_SOURCE_DIRS += src/hal/serial/win32 LIB_SOURCE_DIRS += src/hal/memory else ifeq ($(HAL_IMPL), POSIX) LIB_SOURCE_DIRS += src/hal/socket/linux LIB_SOURCE_DIRS += src/hal/thread/linux LIB_SOURCE_DIRS += src/hal/time/unix LIB_SOURCE_DIRS += src/hal/serial/linux LIB_SOURCE_DIRS += src/hal/memory else ifeq ($(HAL_IMPL), BSD) LIB_SOURCE_DIRS += src/hal/socket/bsd LIB_SOURCE_DIRS += src/hal/thread/bsd LIB_SOURCE_DIRS += src/hal/time/unix LIB_SOURCE_DIRS += src/hal/memory endif # Auto-detect mbedtls dependency folder if not explicitly provided. # Prefer mbedtls-3.6* over mbedtls-2.28*, and pick the highest patch version when multiple exist. # If the user sets WITH_MBEDTLS or WITH_MBEDTLS3 externally, that will be respected. ifeq ($(strip $(WITH_MBEDTLS)),) ifeq ($(strip $(WITH_MBEDTLS3)),) # try mbedtls-3.6* first (only directories, exclude archives) MBEDTLS_DIR := $(shell for d in $(LIB60870_HOME)/dependencies/mbedtls-3.6*; do [ -d "$$d" ] && echo "$$d"; done | sort -V | tail -n1) ifeq ($(strip $(MBEDTLS_DIR)),) # fallback to mbedtls-2.28* (only directories) MBEDTLS_DIR := $(shell for d in $(LIB60870_HOME)/dependencies/mbedtls-2.28*; do [ -d "$$d" ] && echo "$$d"; done | sort -V | tail -n1) ifneq ($(strip $(MBEDTLS_DIR)),) WITH_MBEDTLS := 1 endif else WITH_MBEDTLS3 := 1 endif endif endif ifdef WITH_MBEDTLS LIB_SOURCE_DIRS += $(MBEDTLS_DIR)/library LIB_SOURCE_DIRS += src/hal/tls/mbedtls LIB_INCLUDE_DIRS += src/hal/tls/mbedtls LIB_INCLUDE_DIRS += $(MBEDTLS_DIR)/include CFLAGS += -D'MBEDTLS_CONFIG_FILE="mbedtls_config.h"' CFLAGS += -D'CONFIG_CS104_SUPPORT_TLS=1' endif ifdef WITH_MBEDTLS3 LIB_SOURCE_DIRS += $(MBEDTLS_DIR)/library LIB_SOURCE_DIRS += src/hal/tls/mbedtls3 LIB_INCLUDE_DIRS += src/hal/tls/mbedtls3 LIB_INCLUDE_DIRS += $(MBEDTLS_DIR)/include CFLAGS += -D'MBEDTLS_CONFIG_FILE="mbedtls_config.h"' CFLAGS += -D'CONFIG_CS104_SUPPORT_TLS=1' endif endif LIB_INCLUDE_DIRS += config LIB_INCLUDE_DIRS += src/inc/api LIB_INCLUDE_DIRS += src/inc/internal LIB_INCLUDE_DIRS += src/hal/inc LIB_INCLUDE_DIRS += src/common/inc LIB_INCLUDES = $(addprefix -I,$(LIB_INCLUDE_DIRS)) ifndef INSTALL_PREFIX INSTALL_PREFIX = ./.install endif LIB_API_HEADER_FILES = src/hal/inc/hal_time.h LIB_API_HEADER_FILES += src/hal/inc/hal_thread.h LIB_API_HEADER_FILES += src/hal/inc/hal_socket.h LIB_API_HEADER_FILES += src/hal/inc/hal_serial.h LIB_API_HEADER_FILES += src/hal/inc/hal_base.h LIB_API_HEADER_FILES += src/common/inc/linked_list.h LIB_API_HEADER_FILES += src/inc/api/cs101_information_objects.h LIB_API_HEADER_FILES += src/inc/api/cs101_master.h LIB_API_HEADER_FILES += src/inc/api/cs101_slave.h LIB_API_HEADER_FILES += src/inc/api/cs104_connection.h LIB_API_HEADER_FILES += src/inc/api/cs104_slave.h LIB_API_HEADER_FILES += src/inc/api/iec60870_common.h LIB_API_HEADER_FILES += src/inc/api/iec60870_master.h LIB_API_HEADER_FILES += src/inc/api/iec60870_slave.h LIB_API_HEADER_FILES += src/inc/api/link_layer_parameters.h LIB_API_HEADER_FILES += src/hal/inc/tls_config.h LIB_API_HEADER_FILES += src/hal/inc/tls_ciphers.h LIB_API_HEADER_FILES += src/file-service/cs101_file_service.h LIB_TEST_SOURCES = tests/all_tests.c LIB_TEST_SOURCES += tests/unity/unity.c LIB_TEST_INCLUDE_DIRS = tests/unity TEST_INCLUDES = $(addprefix -I,$(LIB_TEST_INCLUDE_DIRS)) get_sources_from_directory = $(wildcard $1/*.c) get_sources = $(foreach dir, $1, $(call get_sources_from_directory,$(dir))) src_to = $(addprefix $(LIB_OBJS_DIR)/,$(subst .c,$1,$2)) LIB_SOURCES = $(call get_sources,$(LIB_SOURCE_DIRS)) LIB_OBJS = $(call src_to,.o,$(LIB_SOURCES)) TEST_OBJS = $(call src_to,.o,$(LIB_TEST_SOURCES)) CFLAGS += -std=gnu99 #CFLAGS += -Wno-error=format CFLAGS += -Wstrict-prototypes -Wall -Wextra ifneq ($(HAL_IMPL), WIN32) CFLAGS += -Wuninitialized endif CFLAGS += -Wsign-compare CFLAGS += -Wpointer-arith CFLAGS += -Wnested-externs CFLAGS += -Wmissing-declarations CFLAGS += -Wshadow CFLAGS += -Wall #CFLAGS += -Werror all: lib static_checks: lib splint -preproc +posixlib +skip-sys-headers +gnuextensions $(LIB_INCLUDES) $(LIB_SOURCES) cppcheck: lib cppcheck --xml --force --std=c99 --enable=all $(LIB_INCLUDES) $(LIB_SOURCES) 2> cppcheck-output.xml lib: $(LIB_NAME) tests: $(TEST_NAME) dynlib: CFLAGS += -fPIC dynlib: $(DYN_LIB_NAME) .PHONY: examples examples: cd examples; $(MAKE) $(TEST_NAME): $(LIB_OBJS) $(TEST_OBJS) $(CC) -o $(TEST_NAME) $(LIB_OBJS) $(TEST_OBJS) -lpthread $(LIB_NAME): $(LIB_OBJS) $(AR) r $(LIB_NAME) $(LIB_OBJS) $(RANLIB) $(LIB_NAME) $(DYN_LIB_NAME): $(LIB_OBJS) $(CC) $(LDFLAGS) $(DYNLIB_LDFLAGS) -shared -o $(DYN_LIB_NAME) $(LIB_OBJS) $(LDLIBS) $(LIB_OBJS_DIR)/%.o: %.c config @echo compiling $(notdir $<) $(SILENCE)mkdir -p $(dir $@) $(CC) $(CFLAGS) -c $(LIB_INCLUDES) $(TEST_INCLUDES) $(OUTPUT_OPTION) $< install: $(LIB_NAME) mkdir -p $(INSTALL_PREFIX)/include mkdir -p $(INSTALL_PREFIX)/lib cp $(LIB_API_HEADER_FILES) $(INSTALL_PREFIX)/include cp $(LIB_NAME) $(INSTALL_PREFIX)/lib clean: rm -f $(EXAMPLES) rm -rf $(LIB_OBJS_DIR)