Files
bacnet_stack/apps/Makefile
T
Kari Argillander 0177c59f4a Use pre-commit and editorconfig (#753)
* Add editorconfig and pre-commit config

Editorconfig is widly used and supported file. It says basic things how
files should be formatted.

pre-commit is tool which can automatically check some basic checks like
code formatting everytime someone makes commit. This can also be used in
CI to run these things. Then it is very easy to do same things locally
as in CI. This also makes easy to select clang-format version so
everyone is using same one.

* clang-format: Ignore folders where are external code

We should not format external code. Add clang-format files to exclude
those. We should move external code always to example external/ folder
so we can exclude those more easily.

* clang-format: Remove custom zephyr/.clang-gormat

This clang-format file where introduces before our root clang-format. It
does not make sense anymore as we have root clang-format. Removing this
will unifie formatting in whole repo.

* clang-format: Add couple new rules

Add couple new formatting rules.

Always align const to left side. We did have only one place where it was
right side so this make sense as it is already rule for us.

I choose also insertbraces becuase when I run this I notice that we have
lot of multiline code without braces. So very error prone places. This
will take error possibility away. Repo also always use braces even with
single line statments so this does not matter much.

* ci: Add pre-commit validation

Validate pre-commit in CI.

* format: Convert spaces to tabs in Makefiles

Makefile normally use tabs. We enforce that with editorconfig. Fix
couple places where spaces where still in use.

---------

Co-authored-by: Kari Argillander <kari.argillander@fidelix.com>
2024-08-28 17:04:00 -05:00

462 lines
9.8 KiB
Makefile

# tools - only if you need them.
# Most platforms have this already defined
# CC = gcc
# AR = ar
# MAKE = make
# SIZE = size
#
# Assumes rm and cp are available
# Passing parameters via command line or from Makefile export to this one
BACNET_DEFINES ?=
# BACnet Library
BACNET_LIB_DIR = $(realpath ./lib)
BACNET_LIB_NAME = bacnet
BACNET_LIB_TARGET = $(BACNET_LIB_DIR)/lib$(BACNET_LIB_NAME).a
BACNET_LIB ?= -L$(BACNET_LIB_DIR) -l$(BACNET_LIB_NAME)
# choose a datalink to build the example applications
# Use BACDL=mstp or BACDL=bip and BBMD=server when invoking make
ifeq (${BACDL_DEFINE},)
ifeq (${BACDL},ethernet)
BACDL_DEFINE=-DBACDL_ETHERNET=1
endif
ifeq (${BACDL},arcnet)
BACDL_DEFINE=-DBACDL_ARCNET=1
endif
ifeq (${BACDL},mstp)
BACDL_DEFINE=-DBACDL_MSTP=1
endif
ifeq (${BACDL},bip)
BACDL_DEFINE=-DBACDL_BIP=1
endif
ifeq (${BACDL},bip6)
BACDL_DEFINE=-DBACDL_BIP6=1
endif
ifeq (${BACDL},none)
BACDL_DEFINE=-DBACDL_NONE=1
endif
ifeq (${BACDL},bip-mstp)
BACDL_DEFINE=-DBACDL_ROUTER=1
endif
ifeq (${BACDL},bip-bip6)
BACDL_DEFINE=-DBACDL_ROUTER=1
endif
ifeq (${BACDL},all)
BACDL_DEFINE=-DBACDL_ALL=1
endif
ifeq (${BACDL},)
BACDL_DEFINE ?= -DBACDL_BIP=1
BBMD_DEFINE ?= -DBBMD_ENABLED=1 -DBBMD_CLIENT_ENABLED
endif
ifeq (${BBMD},none)
BBMD_DEFINE = -DBBMD_ENABLED=0
endif
ifeq (${BBMD},server)
BBMD_DEFINE = -DBBMD_ENABLED=1
endif
ifeq (${BBMD},client)
BBMD_DEFINE = -DBBMD_ENABLED=0 -DBBMD_CLIENT_ENABLED
endif
ifeq (${BBMD},full)
BBMD_DEFINE = -DBBMD_ENABLED=1 -DBBMD_CLIENT_ENABLED
endif
endif
# Define WEAK_FUNC for unsupported or specific compilers
BACNET_DEFINES += $(BACDL_DEFINE)
BACNET_DEFINES += $(BBMD_DEFINE)
BACNET_DEFINES += -DWEAK_FUNC=
BACNET_DEFINES += $(MAKE_DEFINE)
# Choose a BACnet Ports Directory for the example applications target OS
ifeq (${BACNET_PORT},)
ifeq ($(OS),Windows_NT)
BACNET_PORT = win32
else
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
BACNET_PORT = linux
endif
ifeq ($(UNAME_S),Darwin)
BACNET_PORT = bsd
endif
ifeq ($(UNAME_S),FreeBSD)
BACNET_PORT = bsd
endif
ifeq ($(UNAME_S),OpenBSD)
BACNET_PORT = bsd
endif
endif
endif
# linux, win32, bsd
BACNET_PORT ?= linux
# build in uci integration - use UCI=1 when invoking make
ifeq (${UCI},1)
BACNET_DEFINES += -DBAC_UCI
UCI_LIB_DIR ?= /usr/local/lib
BACNET_LIB += -L$(UCI_LIB_DIR) -luci
endif
# OS specific builds
ifeq (${BACNET_PORT},linux)
PFLAGS = -pthread
TARGET_EXT =
SYSTEM_LIB=-lc,-lgcc,-lrt,-lm
endif
ifeq (${BACNET_PORT},bsd)
PFLAGS = -pthread
TARGET_EXT =
SYSTEM_LIB=-lc,-lm
CSTANDARD = -std=c99
endif
ifeq (${BACNET_PORT},win32)
# winget install --id=MSYS2.MSYS2 -e
# pacman -Syu mingw-w64-i686-toolchain
# add alias make=mingw32-make.exe to .bashrc
TARGET_EXT = .exe
SYSTEM_LIB=-lws2_32,-lgcc,-lm,-liphlpapi,-lwinmm
BACNET_DEFINES += -D_NO_OLDNAMES
endif
# source file locations
BACNET_PORT_DIR = $(realpath ../ports/$(BACNET_PORT))
BACNET_SRC_DIR = $(realpath ../src)
# Compiler flag to set the C Standard level.
# c89 - "ANSI" C - ISO C90
# gnu89 - c89 plus GNU extensions
# c90 - "ANSI" C - ISO C90
# gnu90 - C90 with GNU extensions
# c99 - ISO C99 standard
# gnu99 - C99 plus GNU extensions
# c11 - C11
# gnu11 - C11 plus GNU extensions
# c17 - C11 with corrections
# note: default is compiled as ANSI C for widest compiler compatibilty
# note: code that requires newer language features must use __STDC_VERSION__
CSTANDARD ?= -std=gnu89
#build for release (default) or debug
OPTIMIZATION ?= -Os
DEBUGGING ?=
# enable all relevant warnings that find bugs
WARNING_ALL := -Wall -Wextra -pedantic
WARNING_ALL += -Wfloat-equal -Wconversion
WARNING_ALL += -Wredundant-decls -Wswitch-default
WARNING_ALL += -Wunused-variable
# don't warn about conversion, sign, compares, long long and attributes
# since they are common in embedded
WARNING_ALL += -Wno-sign-conversion -Wno-conversion -Wno-sign-compare
WARNING_ALL += -Wno-long-long -Wno-attributes
# don't warn about implicit fallthrough since it's common in network protocols
WARNING_ALL += -Wno-implicit-fallthrough
#WARNING_ALL += -Werror
WARNINGS ?= $(WARNING_ALL)
# dead code removal
ifeq (${BUILD},debug)
OPTIMIZATION = -O0
DEBUGGING = -g -DDEBUG_ENABLED=1
ifeq (${BACDL_DEFINE},-DBACDL_BIP=1)
BACNET_DEFINES += -DBIP_DEBUG
endif
endif
ifeq (${LEGACY},true)
# disable deprecated function warnings for legacy builds
BACNET_DEFINES += -DBACNET_STACK_DEPRECATED_DISABLE
endif
BACNET_DEFINES += -DPRINT_ENABLED=1
BACNET_DEFINES += -DBACAPP_ALL
BACNET_DEFINES += -DBACFILE
BACNET_DEFINES += -DINTRINSIC_REPORTING
BACNET_DEFINES += -DBACNET_TIME_MASTER
BACNET_DEFINES += -DBACNET_PROPERTY_LISTS=1
BACNET_DEFINES += -DBACNET_PROPERTY_ARRAY_LISTS=1
BACNET_DEFINES += -DBACNET_PROTOCOL_REVISION=24
# put all the flags together
INCLUDES = -I$(BACNET_SRC_DIR) -I$(BACNET_PORT_DIR)
CFLAGS += $(WARNINGS) $(DEBUGGING) $(OPTIMIZATION) $(BACNET_DEFINES) $(INCLUDES)
CFLAGS += $(CSTANDARD)
ifneq (${BACNET_LIB},)
LFLAGS += $(BACNET_LIB)
endif
# BACnet library depends on system flags.
# System flags must go after BACnet library flags.
LFLAGS += -Wl,$(SYSTEM_LIB)
# GCC dead code removal
CFLAGS += -ffunction-sections -fdata-sections
ifeq ($(shell uname -s),Darwin)
LFLAGS += -Wl,-dead_strip
else
LFLAGS += -Wl,--gc-sections
endif
# Debug linker commands
# LFLAGS += -Wl,-v
.EXPORT_ALL_VARIABLES:
SUBDIRS = lib readprop writeprop readfile writefile reinit server dcc \
whohas whois iam ucov scov timesync epics readpropm readrange \
writepropm uptransfer getevent uevent abort error event ack-alarm \
server-client add-list-element remove-list-element create-object \
delete-object server-discover apdu
ifeq (${BACDL_DEFINE},-DBACDL_BIP=1)
SUBDIRS += whoisrouter iamrouter initrouter whatisnetnum netnumis
ifneq (${BBMD},none)
SUBDIRS += readbdt readfdt writebdt
endif
endif
ifeq (${BACNET_PORT},linux)
ifneq (${OSTYPE},cygwin)
SUBDIRS += mstpcap mstpcrc
endif
endif
ifeq (${BACNET_PORT},win32)
SUBDIRS += mstpcap mstpcrc
endif
ifeq (${BACNET_PORT},bsd)
SUBDIRS += mstpcap mstpcrc
endif
#####
# Define target-specific fuzzing flags
#####
# AFL
fuzz-afl: CC=afl-gcc
fuzz-afl: FUZZ_FLAGS=-DFUZZING=1
fuzz-afl: LFLAGS += $(FUZZ_FLAGS)
fuzz-afl: CFLAGS += $(FUZZ_FLAGS)
fuzz-afl: export AFL_USE_ASAN=1
# LIBFUZZER
fuzz-libfuzzer: CC=clang
fuzz-libfuzzer: FUZZ_FLAGS=-DFUZZING=1 -fsanitize=fuzzer,address -g3 -Og -fno-optimize-sibling-calls -fno-omit-frame-pointer
fuzz-libfuzzer: LFLAGS += $(FUZZ_FLAGS)
fuzz-libfuzzer: CFLAGS += $(FUZZ_FLAGS)
#####
# Fuzz setup end
#####
.PHONY: all clean
TARGETS = all clean
$(TARGETS): %: $(patsubst %, %.%, $(SUBDIRS))
$(foreach TGT, $(TARGETS), $(patsubst %, %.$(TGT), $(SUBDIRS))):
$(MAKE) -C $(subst ., , $@)
.PHONY: lib
lib: lib/Makefile Makefile $(BACNET_LIB_TARGET)
$(BACNET_LIB_TARGET):
$(MAKE) -B -C lib
clean:
$(MAKE) -C lib clean
.PHONY: gateway
gateway: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: abort
abort: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: ack-alarm
ack-alarm: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: add-list-element
add-list-element: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@ clean all
.PHONY: apdu
apdu: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: blinkt
blinkt:
$(MAKE) -C $@
.PHONY: create-object
create-object: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: dcc
dcc: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: delete-object
delete-object: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: epics
epics: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: error
error: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: event
event: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: getevent
getevent: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: iam
iam: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: iamrouter
iamrouter: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: initrouter
initrouter: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: whatisnetnum
whatisnetnum: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: netnumis
netnumis: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: mstpcap
mstpcap:
$(MAKE) -B -C $@
.PHONY: mstpcrc
mstpcrc:
$(MAKE) -B -C $@
.PHONY: piface
piface:
$(MAKE) -B -C $@
.PHONY: ptransfer
ptransfer: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: readprop
readprop: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: readpropm
readpropm: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: readbdt
readbdt: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: readfdt
readfdt: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: readfile
readfile: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: readrange
readrange: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: reinit
reinit: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: remove-list-element
remove-list-element: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@ clean all
.PHONY: scov
scov: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: server
server: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: server-client
server-client: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: server-discover
server-discover: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: timesync
timesync: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: uevent
uevent: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: uptransfer
uptransfer: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: whois
whois: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: writebdt
writebdt: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: writefile
writefile: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: router
router:
$(MAKE) -B -C $@
.PHONY: router-ipv6
router-ipv6: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: router-ipv6-clean
router-ipv6-clean:
$(MAKE) -C router-ipv6 clean
.PHONY: router-mstp
router-mstp: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: router-mstp-clean
router-mstp-clean:
$(MAKE) -C router-mstp clean
.PHONY: fuzz-libfuzzer
fuzz-libfuzzer: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: fuzz-afl
fuzz-afl: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: writepropm
writepropm: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@