Files
bacnet_stack/apps/Makefile
T
Steve Karg da2dc9841a Feature/raspberry pi blinkt color objects (#503)
* fixed BACnetXYcolor and BACnetColorCommand encode and decoding and improved unit test coverage. Refactored BACnetXYcolor to/from ascii into lighting module.

* added to the color, color temperature, and lighting output objects a fade/ramp/step engine.  Added color and color command coercion into the channel object and enabled color temperature object coercion.  Added CreateObject and DeleteObject service handling to the color, color temperature, lighting output, and channel objects.

* added blinkt demo app for Raspberry Pi [WIP]

* updated gitignore to simplify handling of apps folder contents

* fixed piface demo build

* added RaspiOS to pipeline for piface and blinkt! demo builds

* added device object timer function for child object types into example Device object.  Refactored device object to increment database revision for create or delete object services.   Refactored example app/server to use mstimer library and device child object timers.

---------

Co-authored-by: Steve Karg <skarg@users.sourceforge.net>
2023-09-28 10:50:32 -05:00

418 lines
8.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},)
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=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 ?=
WARNING_ALL := -Wall -Wextra -Wfloat-equal -Wconversion -Wparentheses
WARNING_ALL += -pedantic -Wunused-parameter -Wunused-variable -Wreturn-type
WARNING_ALL += -Wunused-function -Wreturn-type -Wunused-value
WARNING_ALL += -Wswitch-default -Wuninitialized -Winit-self
WARNING_ALL += -Wno-sign-conversion -Wno-conversion -Wno-sign-compare
WARNING_ALL += -Wno-long-long -Wno-implicit-fallthrough -Wno-attributes
#WARNING_ALL += -Wredundant-decls
#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_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 += -Wl,$(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
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
#####
# 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
.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: blinkt
blinkt:
$(MAKE) -C $@
.PHONY: dcc
dcc: $(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: 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: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: router-ipv6
router-ipv6: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.PHONY: router-mstp
router-mstp: $(BACNET_LIB_TARGET)
$(MAKE) -B -C $@
.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 $@