# Makefile for Raspberry Pi LPC1114 I/O Processor Expansion Board # SPI Agent services transport library # Copyright (C)2013-2024, Philip Munts dba Munts Technologies. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # Override the following macro to build out of tree RASPBERRYPI_LPC1114_SRC ?= $(HOME)/rpi-mcu/expansion/LPC1114/src # Detect native Raspbian on Raspberry Pi RASPBIAN := $(shell if grep -q -s -i raspbian /etc/os-release ; then echo yes ; else echo no ; fi) # Cygwin needs a shared libarary file with .dll suffix instead .so ifeq ($(findstring CYGWIN, $(shell uname)), CYGWIN) SOSUFFIX := dll else SOSUFFIX := so endif # Definitions common to all platforms HOST_CC = $(CROSS_COMPILE)gcc HOST_AR = $(CROSS_COMPILE)ar HOST_CFLAGS += -Wall -I. -I$(RASPBERRYPI_LPC1114_SRC)/c/include $(DEBUGFLAGS) HOST_LDFLAGS += -shared DESTDIR = /usr/local OBJECTS = spi_agent_services.o resolve.o OBJECTS += adc.o gpio.o legorc.o pwm.o sfr.o timer.o # Definitions for MuntsOS client/server extension packages ifneq ($(BOARDNAME),) MUNTSOS ?= /usr/local/share/muntsos include $(MUNTSOS)/include/$(BOARDNAME).mk HOST_CFLAGS += -fPIC -I$(GCCSYSROOT)/usr/include/tirpc HOST_LDFLAGS += -Wl,-soname,libspiagent.$(SOSUFFIX) -lm -ltirpc RPCGEN_FLAGS += -C -M -N TRANSPORTS ?= ioctl,http,oncrpc,xmlrpc BUILDNUM ?= 1 PKGNAME := gcc-$(TOOLCHAIN_NAME)-libspiagent PKGVER := $(GCCVER)-$(shell date +%Y.%j).$(BUILDNUM) PKGARCH := all PKGDIR := $(PKGNAME)-$(PKGVER)-$(PKGARCH) PKGFILE := $(PKGDIR).deb ifeq ($(BOARDBASE), BeagleBone) HOST_CFLAGS += -DBeagleBone endif ifneq ($(findstring RaspberryPi, $(BOARDNAME)),) HOST_CFLAGS += -DRaspberryPi endif else # Definitions for Cygwin native client ifeq ($(findstring CYGWIN, $(shell uname)), CYGWIN) HOST_LDFLAGS += -Wl,-soname,libspiagent.$(SOSUFFIX) -ltirpc RPCGEN_FLAGS += -C -M -N TRANSPORTS ?= http,oncrpc,xmlrpc endif # Definitions for Linux native client/server ifeq ($(shell uname), Linux) HOST_CFLAGS += -fPIC -I/usr/include/tirpc HOST_LDFLAGS += -ltirpc -Wl,-soname,libspiagent.$(SOSUFFIX) -lm RPCGEN_FLAGS += -C -M -N ifeq ($(RASPBIAN), yes) HOST_CFLAGS += -DRaspberryPi TRANSPORTS ?= ioctl,http,oncrpc,xmlrpc else TRANSPORTS ?= http,oncrpc,xmlrpc endif endif # Definitions for MacOS native client ifeq ($(shell uname), Darwin) HOST_CFLAGS += -D__unix__ -DONCRPCTHREADUNSAFE -fPIC RPCGEN_FLAGS += -C -N FINKPREFIX ?= /sw MACPORTSPREFIX ?= /opt/local ifneq ("$(wildcard $(FINKPREFIX))", "") HOST_CFLAGS += -I$(FINKPREFIX)/include HOST_LDFLAGS += -L$(FINKPREFIX)/lib endif ifneq ("$(wildcard $(MACPORTSPREFIX))", "") HOST_CFLAGS += -I$(MACPORTSPREFIX)/include HOST_LDFLAGS += -L$(MACPORTSPREFIX)/lib endif TRANSPORTS ?= http,oncrpc,xmlrpc endif # Definitions for OpenBSD native client ifeq ($(shell uname), OpenBSD) HOST_CFLAGS += -DONCRPCTHREADUNSAFE -fPIC -I/usr/local/include HOST_LDFLAGS += -L/usr/local/lib -Wl,-soname,libspiagent.$(SOSUFFIX) -lm HOST_LDFLAGS += -lpthread -lxmlrpc_xmlparse -lxmlrpc_xmltok RPCGEN_FLAGS += -C -N TRANSPORTS ?= http,oncrpc,xmlrpc endif endif # Definitions for ioctl() transport services ifeq ($(findstring ioctl, $(TRANSPORTS)), ioctl) HOST_CFLAGS += -DENABLE_IOCTL HOST_LDFLAGS += -lsimpleio OBJECTS += spi_agent_services_ioctl.o OBJECTS += spi_agent_services_i2c.o OBJECTS += spi_agent_services_spi.o OBJECTS += config.o OBJECTS += interrupt.o endif # Definitions for HTTP transport services ifeq ($(findstring http, $(TRANSPORTS)), http) HOST_CFLAGS += -DENABLE_HTTP HOST_LDFLAGS += -lcurl OBJECTS += spi_agent_services_http.o endif # Definitions for ONC-RPC transport services ifeq ($(findstring oncrpc, $(TRANSPORTS)), oncrpc) HOST_CFLAGS += -DENABLE_ONCRPC OBJECTS += spi_agent_oncrpc_clnt.o OBJECTS += spi_agent_oncrpc_xdr.o OBJECTS += spi_agent_services_oncrpc.o endif # Definitions for XML-RPC transport services ifeq ($(findstring xmlrpc, $(TRANSPORTS)), xmlrpc) HOST_CFLAGS += -DENABLE_XMLRPC HOST_LDFLAGS += -lxmlrpc -lxmlrpc_client -lxmlrpc_util OBJECTS += spi_agent_services_xmlrpc.o endif # Default target ifneq ($(BOARDNAME),) # For MuntsOS, build a cross-toolchain extension package default: package.deb else # For all other targets, just build the libraries default: libspiagent.$(SOSUFFIX) libspiagent.a endif GAINROOT ?= fakeroot # Define a pattern rule for compiling C source programs %.o: %.c $(HOST_CC) $(HOST_CFLAGS) -c -o $@ $^ # Generate ONC-RPC intermediate files spi_agent_oncrpc.h: cp $(RASPBERRYPI_LPC1114_SRC)/spi-agent-oncrpc/spi_agent_oncrpc.x . rpcgen $(RPCGEN_FLAGS) spi_agent_oncrpc.x spi_agent_oncrpc_clnt.c: spi_agent_oncrpc.h spi_agent_oncrpc_xdr.c: spi_agent_oncrpc.h # Build the shared library libspiagent.$(SOSUFFIX): $(OBJECTS) $(HOST_CC) -o $@ $(OBJECTS) $(HOST_LDFLAGS) # Build the static library libspiagent.a: $(OBJECTS) $(HOST_AR) crs $@ $^ # Install the library and header files install: libspiagent.a libspiagent.so mkdir -p $(DESTDIR)/lib install -cm 0555 libspiagent.so $(DESTDIR)/lib $(RASPBERRYPI_LPC1114_SRC)/scripts/update_services # Unnstall the library and header files uninstall: rm -f $(DESTDIR)/lib/libspiagent.so # Build cross-compiled library package for MuntsOS ifneq ($(BOARDNAME),) package.deb: libspiagent.a libspiagent.so mkdir -p $(PKGDIR)/DEBIAN install -cm 0644 control $(PKGDIR)/DEBIAN sed -i s/@@NAME@@/$(PKGNAME)/g $(PKGDIR)/DEBIAN/control sed -i s/@@ARCH@@/$(PKGARCH)/g $(PKGDIR)/DEBIAN/control sed -i s/@@VERSION@@/$(PKGVER)/g $(PKGDIR)/DEBIAN/control sed -i s/@@BOARDNAME@@/$(BOARDBASE)/g $(PKGDIR)/DEBIAN/control sed -i s/@@TOOLCHAIN@@/$(TOOLCHAIN_NAME)/g $(PKGDIR)/DEBIAN/control mkdir -p $(PKGDIR)$(LIBSLIBDIR) install -cm 0644 libspiagent.a $(PKGDIR)$(LIBSLIBDIR) install -cm 0755 libspiagent.so $(PKGDIR)$(LIBSLIBDIR) $(GAINROOT) chown -R root.root $(PKGDIR) $(GAINROOT) dpkg-deb -Zgzip --build $(PKGDIR) $(GAINROOT) chown -R --reference=Makefile *.deb $(PKGDIR) endif # Clean out working files clean: -rm -f libspiagent.* -rm -f $(OBJECTS) ifeq ($(findstring oncrpc, $(TRANSPORTS)), oncrpc) -rm -f spi_agent_oncrpc.h -rm -f spi_agent_oncrpc.x -rm -f spi_agent_oncrpc_clnt.c -rm -f spi_agent_oncrpc_svc.c -rm -f spi_agent_oncrpc_xdr.c endif ifneq ($(BOARDNAME),) -rm -rf $(PKGDIR) *.deb endif reallyclean: clean distclean: reallyclean