# Makefile.modinc includes rules for building HAL realtime modules outside # the LinuxCNC source tree. It has three useful targets: # # modules # Actually build the modules # # clean # Cleans up files made by 'modules' # # install # Installs the modules # An example Makefile using Makefile.modinc to build one kernel module from a # single source file would read: # # obj-m += example.o # include .../Makefile.modinc # An example Makefile using Makefile.modinc to build one kernel module from # several source files would read: # # obj-m += complex.o # complex-objs := complex1.o complex2.o complex_main.o # include .../Makefile.modinc # Currently this Makefile is only suitable for 'kbuild' and 'sim' systems, but # there is no technical reason it cannot be extended to pre-kbuild systems. # When there is a single module and it consists of a single source file, an # easier way to build modules is to invoke 'comp': # comp --compile example.c # or # comp --install example.c cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \ > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;) BUILDSYS = @BUILD_SYS@ KERNELDIR := @KERNELDIR@ CC := @CC@ RTAI = @RTAI@ RTFLAGS = $(filter-out -ffast-math,@RTFLAGS@ @EXT_RTFLAGS@) -fno-fast-math $(call cc-option,-mieee-fp) -fno-unsafe-math-optimizations RTFLAGS := -Os -g -I. -I@RTDIR@/include $(RTFLAGS) -DRTAPI -D_GNU_SOURCE -Drealtime -D_FORTIFY_SOURCE=0 ifneq ($(KERNELRELEASE),) ifeq ($(RTARCH):$(RTAI):$(filter $(RTFLAGS),-msse),x86_64:3:) EXTRA_CFLAGS += -msse endif endif USE_RTLIBM = @USE_RTLIBM@ EMC2_HOME=@EMC2_HOME@ RUN_IN_PLACE=@RUN_IN_PLACE@ ifeq ($(RUN_IN_PLACE),yes) EXTRA_CFLAGS := $(RTFLAGS) -D__MODULE__ -I$(EMC2_HOME)/include RTLIBDIR := @EMC2_HOME@/rtlib LIBDIR := @EMC2_HOME@/lib else prefix := @prefix@ EXTRA_CFLAGS := $(RTFLAGS) -D__MODULE__ -I@includedir@/linuxcnc RTLIBDIR := @EMC2_RTLIB_DIR@ LIBDIR := @libdir@ endif EXTRA_CFLAGS += $(call cc-option,-Wframe-larger-than=2560) ifeq ($(BUILDSYS),kbuild) modules: $(MAKE) KBUILD_EXTRA_SYMBOLS=$(RTLIBDIR)/Module.symvers -C $(KERNELDIR) SUBDIRS=`pwd` CC=$(CC) V=0 modules clean: rm *.ko *.mod.c *.o install: cp $(patsubst %.o,%.ko,$(obj-m)) $(DESTDIR)$(RTLIBDIR)/ endif ifeq ($(BUILDSYS),sim) EXTRA_CFLAGS += -DSIM -fPIC allmodules = $(patsubst %.o,%.so,$(obj-m)) modules: $(allmodules) install: modules cp $(allmodules) $(DESTDIR)$(RTLIBDIR)/ getobjs = $(if $(filter undefined, $(origin $(1)-objs)), $(1).o, $($(1)-objs)) getsrcs = $(patsubst %.o,%.c,$(call getobjs,$(1))) maks := $(patsubst %.o,.%.modinc,$(obj-m)) .PHONY: %.so %.so: $(CC) -shared -o $@ $(EXTRA_CFLAGS) $(call getsrcs,$*) endif ifeq ($(BUILDSYS),normal) $(error Makefile.modinc is only suitable for 'kbuild' kernels and 'sim' systems) endif