# buster gcc (Debian 8.3.0-6) emits many warnings # use at your own risk ifeq ($(origin SUPPRESS_WARNINGS), undefined) else QUIETFLAGS ?= QUIETFLAGS += -Wno-unused-label QUIETFLAGS += -Wno-format-overflow QUIETFLAGS += -Wno-format-truncation QUIETFLAGS += -Wno-stringop-truncation CXXQUIETFLAGS := $(QUIETFLAGS) CXXQUIETFLAGS += -Wno-catch-value endif ifeq ($(origin KERNELRELEASE), undefined) MAKEFLAGS += --warn-undefined-variables endif EXTRAFLAGS := EXTRA_DEBUG ?= ifndef DESTDIR DESTDIR := endif # see http://www.cmcrossroads.com/ask-mr-make/6535-tracing-rule-execution-in-gnu-make # to trace make execution of make in more detail: # make VV=1 ifeq ("$(origin VV)", "command line") OLD_SHELL := $(SHELL) SHELL = $(warning Building $@$(if $<, (from $<))$(if $?, ($? newer)))$(OLD_SHELL) endif # Delete the default suffix rules .SUFFIXES: .PHONY: default userspace modules clean modclean depclean install python pythonclean cscope cscopeclean # A "trivial build" is one which should not include dependency information # either because it should be usable before dependency information can be # generated or when it is invalid (clean, docclean) or when running as root # when the user must guarantee in advance that everything is built # (setuid, install) ifeq ($(MAKECMDGOALS),) TRIVIAL_BUILD=no else ifeq ($(filter-out docclean clean setuid install tags swish,$(MAKECMDGOALS)),) TRIVIAL_BUILD=yes else TRIVIAL_BUILD=no endif endif # Beautify output # --------------------------------------------------------------------------- # # A simple variant is to prefix commands with $(Q) - that's useful # for commands that shall be hidden in non-verbose mode. # # $(Q)ln $@ :< # # If BUILD_VERBOSE equals 0 then the above command will be hidden. # If BUILD_VERBOSE equals 1 then the above command is displayed. ifeq ("$(origin V)", "command line") BUILD_VERBOSE = $(V) endif ifndef BUILD_VERBOSE BUILD_VERBOSE = 0 endif ifeq ($(BUILD_VERBOSE),1) Q = else Q = @ endif ifeq "$(findstring s,$(filter-out --%, $(MAKEFLAGS)))" "" ECHO=@echo VECHO=echo else ECHO=@true VECHO=true endif ifeq ($(BASEPWD),) BASEPWD := $(shell pwd) export BASEPWD include Makefile.inc ifeq ($(origin PYTHONPATH),undefined) PYTHONPATH:=$(EMC2_HOME)/lib/python else PYTHONPATH:=$(EMC2_HOME)/lib/python:$(PYTHONPATH) endif export PYTHONPATH else include $(BASEPWD)/Makefile.inc endif ifeq ($(RTPREFIX),) $(error Makefile.inc must specify RTPREFIX and other variables) endif ifeq ($(TOOL_NML),yes) TOOL_NML_FLAG := -DTOOL_NML $(info TOOL_NML_FLAG =$(TOOL_NML_FLAG)) else endif cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \ > /dev/null 2>&1; then echo "$(1)"; fi ;) cxx-option = $(shell if $(CXX) $(CXXFLAGS) $(1) -S -o /dev/null -xc++ /dev/null \ > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;) ifeq ($(origin KERNELRELEASE),undefined) # When KERNELRELEASE is not defined, this is the userspace build. # The "modules" target is the gateway to the kernel module build. default: userspace modules ifeq ($(RUN_IN_PLACE),yes) ifneq ($(BUILD_SYS),uspace) @if [ -f ../bin/linuxcnc_module_helper ]; then if ! [ `id -u` = 0 -a -O ../bin/linuxcnc_module_helper -a -u ../bin/linuxcnc_module_helper ]; then $(VECHO) "You now need to run 'sudo make setuid' in order to run in place."; fi; fi else @if [ -f ../bin/rtapi_app ]; then if ! [ `id -u` = 0 -a -O ../bin/rtapi_app -a -u ../bin/rtapi_app ]; then $(VECHO) "You now need to run 'sudo make setuid' in order to run in place with access to hardware."; fi; fi endif endif # Print 'entering' all the time MAKEFLAGS += w # Create the variables with := so that subsequent += alterations keep it # as a "substitute at assignment time" variable TARGETS := PYTARGETS := GENERATED_MANPAGES := # Submakefiles from each of these directories will be included if they exist ######################## Here you can easy remove items from compiling : SUBDIRS := \ libnml/linklist \ libnml/cms \ libnml/rcs \ libnml/inifile \ libnml/os_intf \ libnml/nml \ libnml/buffer \ libnml/posemath \ libnml \ rtapi \ hal/components \ hal/utils \ hal \ module_helper \ ULAPISRCS := rtapi/$(RTPREFIX)_ulapi.c # Each item in INCLUDES is transformed into a -I directive later on # The top directory is always included INCLUDES := . USERSRCS := PROGRAMS := # When used like $(call TOxxx, ...) these turn a list of source files # into the corresponding list of object files, dependency files, # or both. When a source file has to be compiled with special flags, # TOOBJSDEPS is used. Confusingly, TOOBJSDEPS includes preprocessed source # file names, but this is what allows 'make src.i' to produce proper # preprocessed source when src.c needs a customized compile flag. # See Submakefile.skel for an example. TOOBJS = $(patsubst %.cc,objects/%.o,$(patsubst %.c,objects/%.o,$(1))) TODEPS = $(patsubst %.cc,objects/%.d,$(patsubst %.c,objects/%.d,$(1))) TOOBJSDEPS = $(call TOOBJS,$(1)) $(call TODEPS, $(1)) $(patsubst %.cc,%.ii,$(patsubst %.c,%.i,$(1))) SUBMAKEFILES := $(patsubst %,%/Submakefile,$(SUBDIRS)) -include $(wildcard $(SUBMAKEFILES)) # This checks that all the things listed in USERSRCS are either C files # or C++ files ASSERT_EMPTY = $(if $(1), $(error "Should be empty but is not: $(1)")) $(call ASSERT_EMPTY,$(filter-out %.c %.cc, $(USERSRCS))) $(call TOOBJS,$(PYSRCS)) : EXTRAFLAGS += -fPIC -fno-strict-aliasing USERSRCS += $(PYSRCS) # Find the list of object files for each type of source file CUSERSRCS := $(filter %.c,$(USERSRCS)) CXXUSERSRCS := $(filter %.cc,$(USERSRCS)) CUSEROBJS := $(call TOOBJS,$(CUSERSRCS)) CXXUSEROBJS += $(call TOOBJS,$(CXXUSERSRCS)) ifeq ($(TRIVIAL_BUILD),no) # Find the dependency filenames, then include them all DEPS := $(sort $(patsubst %.o,%.d,$(CUSEROBJS) $(CXXUSEROBJS))) READ_DEPS = $(wildcard $(DEPS)) $(shell $(VECHO) 1>&2 Reading $(words $(READ_DEPS))/$(words $(DEPS)) dependency files) -include $(READ_DEPS) UNREAD_DEPS = $(filter-out $(READ_DEPS), $(DEPS)) $(shell $(VECHO) 1>&2 Done reading dependencies) endif # Each directory in $(INCLUDES) is passed as a -I directory when compiling. INCLUDE := $(patsubst %,-I%, $(INCLUDES)) -I$(RTDIR)/include INCLUDE += -I$(INCLUDEPY) INCLUDE += $(LIBTIRPC_CFLAGS) # Compilation options. Perhaps some of these should come from Makefile.inc? (CXXFLAGS now does) INTEGER_OVERFLOW_FLAGS := -fwrapv OPT := -Os $(INTEGER_OVERFLOW_FLAGS) DEBUG := $(DEBUG) -g -Wall CFLAGS := $(INCLUDE) $(OPT) $(DEBUG) $(EXTRA_DEBUG) -DULAPI -std=gnu99 -fgnu89-inline -Werror=implicit-function-declaration $(CFLAGS) $(CPPFLAGS) CXXFLAGS := $(INCLUDE) $(EXTRA_DEBUG) -DULAPI $(DEBUG) $(OPT) -Woverloaded-virtual $(CXXFLAGS) $(CPPFLAGS) CXXFLAGS += $(call cxx-option, -Wno-psabi) CXXFLAGS += $(call cxx-option, -std=gnu++11, -std=gnu++0x) CFLAGS += $(TOOL_NML_FLAG) CXXFLAGS += $(TOOL_NML_FLAG) ifeq ($(RUN_IN_PLACE),yes) LDFLAGS := -L$(LIB_DIR) -Wl,-rpath,$(LIB_DIR) $(LIBTIRPC_LIBS) $(LDFLAGS) else LDFLAGS := -Wl,-rpath-link,../lib $(LIBTIRPC_LIBS) $(LDFLAGS) endif # Rules to make .o (object) files $(sort $(CUSEROBJS)) : objects/%.o: %.c $(ECHO) Compiling $< @mkdir -p $(dir $@) @rm -f $@ $(Q)$(CC) -c $(CFLAGS) $(EXTRAFLAGS) \ -MP -MD -MF "${@:.o=.d}" -MT "$@" \ $< -o $@ $(sort $(CXXUSEROBJS)) : objects/%.o: %.cc $(ECHO) Compiling $< @mkdir -p $(dir $@) @rm -f $@ $(Q)$(CXX) -c $(CXXFLAGS) $(EXTRAFLAGS) \ -MP -MD -MF "${@:.o=.d}" -MT "$@" \ $< -o $@ # Rules to make .i (preprocessed) files $(sort $(patsubst %.c,%.i,$(CUSERSRCS))): %.i: %.c $(ECHO) Preprocessing $< to $@ $(Q)$(CC) -dD $(CFLAGS) $(EXTRAFLAGS) -E $< -o $@ $(sort $(patsubst %.cc,%.ii,$(CXXUSERSRCS))): %.ii: %.cc $(ECHO) Preprocessing $< to $@ $(Q)$(CXX) -dD $(CXXFLAGS) $(EXTRAFLAGS) -E $< -o $@ ifeq ($(TRIVIAL_BUILD),no) configure: configure.ac AUTOGEN_TARGET=configure ./autogen.sh config.h.in: configure.ac AUTOGEN_TARGET=config.h.in ./autogen.sh config.status: configure if [ -f config.status ]; then ./config.status --recheck; else \ echo 1>&2 "*** linuxcnc is not configured. Run './configure' with appropriate flags."; \ exit 1; \ fi endif Makefile: config.h config.h: config.h.in config.status @./config.status -q --header=$@ INFILES = \ ../scripts/linuxcnc ../scripts/realtime \ #../scripts/linuxcnc-python \ ../scripts/linuxcnc_info \ ../scripts/haltcl ../scripts/rtapi.conf Makefile.inc Makefile.modinc \ ../share/applications/linuxcnc-latency.desktop \ $(INFILES): %: %.in config.status @./config.status --file=$@ default: $(INFILES) # For each file to be copied to ../include, its location in the source tree # is listed here. Note that due to $(INCLUDE), defined above, the include # files in the source tree are the ones used when building linuxcnc. The copy # in ../include is used when building external components of linuxcnc. HEADERS := \ hal/drivers/mesa-hostmot2/hostmot2-serial.h \ # the "headers" target installs all the header files in ../include .PHONY: headers HEADERS := $(patsubst %,../include/%,$(foreach h,$(HEADERS),$(notdir $h))) headers: $(HEADERS) # install header files as part of the build TARGETS += headers # Add converting of %.po files TARGETS += $(patsubst po/%.po, ../share/locale/%/LC_MESSAGES/linuxcnc.mo, $(wildcard po/*.po)) TARGETS += $(patsubst po/gmoccapy/%.po, ../share/locale/%/LC_MESSAGES/gmoccapy.mo, $(wildcard po/gmoccapy/*.po)) TARGETS += $(patsubst po/%.po, objects/%.msg, $(wildcard po/*.po)) # And make userspace depend on $(TARGETS) userspace: $(TARGETS) pythonclean: rm -f $(PYTARGETS) find ../lib/python -name '*.so' -exec rm {} + python: $(PYTARGETS) userspace: python clean: docclean pythonclean cscopeclean # This is the gateway into the crazy world of "kbuild", the linux 2.6 system # for building kernel modules. Other kernel module build styles need to be # accomodated here. ifeq ($(BUILD_SYS),kbuild) modules: MAKEFLAGS="$(filter-out --warn-undefined-variables,$(MAKEFLAGS))" \ $(PYTHON) modsilent.py $(MAKE) KBUILD_EXTRA_SYMBOLS=$(moduledir)/Module.symvers -C $(KERNELDIR) SUBDIRS=`pwd` CC=$(CC) V=$(BUILD_VERBOSE) modules -cp Module.symvers *$(MODULE_EXT) ../rtlib/ endif # These rules clean things up. 'modclean' cleans files generated by 'modules' # (except that it doesn't remove the modules that were copied to rtlib) # 'clean' cleans everything but dependency files, and 'depclean' cleans them # too. modclean: find -name '.*.cmd' -or -name '*.ko' -or -name '*.mod.c' -or -name '*.mod.o' | xargs rm -f -rm -rf .tmp_versions find . -name .tmp_versions |xargs rm -rf -rm -f ../rtlib/*.ko -rm -f ../rtlib/*.so depclean: -rm -rf depends clean: depclean modclean find . -name '*.o' |xargs rm -f -rm -rf objects -rm -f $(TARGETS) -rm -f $(GENERATED_MANPAGES) -rm -f ../rtlib/*.$(MODULE_EXT) -rm -f hal/components/conv_*.comp pycheck-python-files: @echo 'Checking *.py files for python2 and python3 compatibility...' @for d in ./hal; do \ filelist=$(shell mktemp) && \ find $$d -name '*.py' -type f > $$filelist && \ cat $$filelist | xargs /usr/bin/env python2 -m py_compile && \ cat $$filelist | xargs /usr/bin/env python3 -m py_compile && \ rm -f $$filelist; \ done pycheck-python-script: @echo 'Checking "text/x-python" (by MIME type) files for python2 and python3 compatibility...' @for d in ../tests; do \ filelist=$(shell mktemp) && \ find $$d -type f -exec file -F ':' -i {} \; | grep 'text/x-python' | awk -F ':' '{print $$1}' > $$filelist && \ cat $$filelist | xargs /usr/bin/env python2 -m py_compile && \ cat $$filelist | xargs /usr/bin/env python3 -m py_compile && \ rm -f $$filelist; \ done pycheck: pycheck-python-files pycheck-python-script # So that nothing is built as root, this rule does not depend on the touched # files (Note that files in depends/ might be rebuilt, and there's little that # can be done about it) setuid: ifeq ($(BUILD_SYS),uspace) chown root ../bin/rtapi_app chmod 4750 ../bin/rtapi_app else chown root ../bin/pci_write chmod 4750 ../bin/pci_write chown root ../bin/pci_read chmod 4750 ../bin/pci_read endif chown root ../bin/linuxcnc_module_helper chmod 4750 ../bin/linuxcnc_module_helper # These rules allows a header file from this directory to be installed into # ../include. A pair of rules like these will exist in the Submakefile # of each file that contains headers. $(patsubst %,../include/%,$(wildcard *.h)): ../include/%.h: %.h $(Q)-cp $^ $@ $(patsubst %,../include/%,$(wildcard *.hh)): ../include/%.hh: %.hh $(Q)-cp $^ $@ DIR=install -d -m 0755 -o root FILE=install -m 0644 -o root TREE=cp -dR CONFIGFILE=install -m 0644 EXE=install -m 0755 -o root SETUID=install -m 4755 -o root GLOB=$(wildcard $(1)) ifeq ($(RUN_IN_PLACE),yes) define ERROR_MESSAGE You configured run-in-place, but are trying to install. For an installable version, run configure without --enable-run-in-place and rebuild endef install: $(error $(ERROR_MESSAGE)) MENUS = ../share/menus/CNC.menu \ ../share/desktop-directories/cnc.directory \ ../share/applications/linuxcnc.desktop \ ../share/applications/linuxcnc-latency.desktop \ install-menus install-menu: $(MENUS) mkdir -p $(HOME)/.config/menus/applications-merged cp $< $(HOME)/.config/menus/applications-merged else DOCS=README AUTHORS DOCS_HELP=$(call GLOB,../docs/help/*) NC_FILES=$(filter-out %/butterfly.ngc,$(call GLOB,../nc_files/*)) TCL=$(call GLOB,../tcl/*.tcl) TCL_BIN=$(call GLOB,../tcl/bin/*.tcl) ../tcl/bin/popimage install: install-kernel-dep install-kernel-indep $(ECHO) "Installed in DESTDIR='$(DESTDIR)' with prefix $(prefix)" install-dirs: install-kernel-indep: install-dirs $(FILE) ../docs/man/man1/*.1 $(DESTDIR)$(mandir)/man1 $(FILE) $(filter-out %/skeleton.3hal, $(wildcard ../docs/man/man3/*.3hal)) $(DESTDIR)$(mandir)/man3 $(FILE) $(filter-out %/skeleton.3rtapi, $(wildcard ../docs/man/man3/*.3rtapi)) $(DESTDIR)$(mandir)/man3 $(FILE) $(filter-out %/skeleton.9, $(wildcard ../docs/man/man9/*.9)) $(DESTDIR)$(mandir)/man9 $(FILE) objects/*.msg $(DESTDIR)$(tcldir)/msgs $(EXE) ../scripts/realtime $(DESTDIR)$(initd_dir) $(EXE) ../scripts/halrun $(DESTDIR)$(bindir) $(EXE) ../scripts/halcmd_twopass $(DESTDIR)$(bindir) $(EXE) ../scripts/haltcl $(DESTDIR)$(bindir) $(EXE) ../scripts/linuxcnc-python $(DESTDIR)$(bindir) $(EXE) ../scripts/simulate_probe $(DESTDIR)$(bindir) $(EXE) ../scripts/sim_pin $(DESTDIR)$(bindir) $(FILE) ../*.png ../*.gif $(DESTDIR)$(datadir)/linuxcnc $(FILE) ../lib/hallib/* $(DESTDIR)$(datadir)/linuxcnc/hallib # install all the sample configs, including subdirs (tar is required on debian systems, and common on others) $(DIR) $(DESTDIR)$(sampleconfsdir) ((cd ../configs && tar --exclude CVS --exclude .cvsignore --exclude .gitignore -cf - .) | (cd $(DESTDIR)$(sampleconfsdir) && tar -xf -)) $(EXE) $(filter-out ../bin/rtapi_app ../bin/linuxcnc_module_helper ../bin/pci_write ../bin/pci_read ../bin/test_rtapi_vsnprintf, $(filter ../bin/%,$(TARGETS))) $(DESTDIR)$(bindir) $(FILE) $(filter ../lib/%.a ../lib/%.so.0,$(TARGETS)) $(DESTDIR)$(libdir) cp --no-dereference $(filter ../lib/%.so, $(TARGETS)) $(DESTDIR)$(libdir) -ldconfig $(DESTDIR)$(libdir) $(FILE) $(HEADERS) $(DESTDIR)$(includedir)/linuxcnc/ $(FILE) $(addprefix ../docs/,$(DOCS)) $(DESTDIR)$(docsdir) $(FILE) Makefile.modinc $(DESTDIR)$(datadir)/linuxcnc $(EXE) $(TCL) $(DESTDIR)$(tcldir) $(FILE) ../tcl/hal.so $(DESTDIR)$(tcldir) $(FILE) ../tcl/linuxcnc.so $(DESTDIR)$(tcldir) $(FILE) ../tcl/pkgIndex.tcl $(DESTDIR)$(tcldir) $(EXE) $(TCL_BIN) $(DESTDIR)$(tcldir)/bin install-kernel-indep: install-python install-python: install-dirs install-kernel-dep: $(DIR) $(DESTDIR)$(moduledir)/linuxcnc \ $(DESTDIR)$(bindir) \ $(DESTDIR)$(sysconfdir)/linuxcnc $(FILE) ../rtlib/*$(MODULE_EXT) $(DESTDIR)$(EMC2_RTLIB_DIR) $(SETUID) ../bin/linuxcnc_module_helper $(DESTDIR)$(bindir) ifneq "$(BUILD_SYS)" "uspace" $(FILE) Module.symvers $(DESTDIR)$(EMC2_RTLIB_DIR) $(SETUID) ../bin/pci_write $(DESTDIR)$(bindir) $(SETUID) ../bin/pci_read $(DESTDIR)$(bindir) else $(SETUID) ../bin/rtapi_app $(DESTDIR)$(bindir) endif $(FILE) ../scripts/rtapi.conf $(DESTDIR)$(sysconfdir)/linuxcnc endif # RUN_IN_PLACE CONF=../configs COMMON=$(CONF)/common CONFILES=$(addsuffix /$(1), $(filter-out $(COMMON) $(CONF),\ ${shell find ${CONF} -type d -print})) endif # userspace ifneq ($(KERNELRELEASE),) include $(BASEPWD)/hal/components/Submakefile endif # KERNELRELEASE is nonempty, therefore we are building modules using the # "kbuild" system. $(BASEPWD) is used here, instead of relative paths, because # that's what kbuild seems to require EXTRA_CFLAGS := $(filter-out -ffast-math,$(RTFLAGS)) -D__MODULE__ -I$(BASEPWD)/../include -I$(BASEPWD) -I$(BASEPWD)/libnml/linklist \ -I$(BASEPWD)/libnml/cms -I$(BASEPWD)/libnml/rcs -I$(BASEPWD)/libnml/inifile \ -I$(BASEPWD)/libnml/os_intf -I$(BASEPWD)/libnml/nml -I$(BASEPWD)/libnml/buffer \ -I$(BASEPWD)/libnml/posemath -I$(BASEPWD)/rtapi -I$(BASEPWD)/hal \ -I$(BASEPWD)/emc/nml_intf -I$(BASEPWD)/emc/kinematics -I$(BASEPWD)/emc/tp -I$(BASEPWD)/emc/motion \ -DSEQUENTIAL_SUPPORT -DHAL_SUPPORT -DDYNAMIC_PLCSIZE -DRT_SUPPORT -DOLD_TIMERS_MONOS_SUPPORT -DMODBUS_IO_MASTER \ -fno-fast-math $(call cc-option,-mieee-fp) -fno-unsafe-math-optimizations \ -Wframe-larger-than=2560 -Wno-declaration-after-statement \ $(INTEGER_OVERFLOW_FLAGS) ifneq ($(KERNELRELEASE),) ifeq ($(RTARCH):$(RTAI):$(filter $(RTFLAGS),-msse),x86_64:3:) EXTRA_CFLAGS += -msse EXTRA_CFLAGS += -g endif endif EXTRA_CFLAGS += -fno-builtin-sin -fno-builtin-cos -fno-builtin-sincos ifeq "$(USE_STUBS)" "1" MATHSTUB := rtapi/mathstubs.o endif ifdef SEQUENTIAL_SUPPORT EXTRA_CFLAGS += -DSEQUENTIAL_SUPPORT endif # For each module, there's an addition to obj-m or obj-$(CONFIG_foo) # plus a definition of foo-objs, which contains the full path to the # object file(s) that the module contains. Unfortunately, this setup pollutes # the source directory with object files and other temporaries, but I can't # find a way around it. # Subdirectory: rtapi ifneq ($(BUILD_SYS),uspace) obj-$(CONFIG_RTAPI) += rtapi.o rtapi-objs := rtapi/$(RTPREFIX)_rtapi.o endif # Subdirectory: rtapi/examples (unneeded?) # Subdirectory: hal/components obj-$(CONFIG_BOSS_PLC) += boss_plc.o boss_plc-objs := hal/components/boss_plc.o $(MATHSTUB) obj-$(CONFIG_DEBOUNCE) += debounce.o debounce-objs := hal/components/debounce.o $(MATHSTUB) obj-$(CONFIG_ENCODER) += encoder.o encoder-objs := hal/components/encoder.o $(MATHSTUB) obj-$(CONFIG_COUNTER) += counter.o counter-objs := hal/components/counter.o $(MATHSTUB) obj-$(CONFIG_ENCODER_RATIO) += encoder_ratio.o encoder_ratio-objs := hal/components/encoder_ratio.o $(MATHSTUB) obj-$(CONFIG_STEPGEN) += stepgen.o stepgen-objs := hal/components/stepgen.o $(MATHSTUB) obj-$(CONFIG_LCD) += lcd.o lcd-objs := hal/components/lcd.o $(MATHSTUB) obj-$(CONFIG_MATRIX_KB) += matrix_kb.o matrix_kb-objs := hal/components/matrix_kb.o $(MATHSTUB) obj-$(CONFIG_MUX_GENERIC) += mux_generic.o mux_generic-objs := hal/components/mux_generic.o $(MATHSTUB) obj-$(CONFIG_PWMGEN) += pwmgen.o pwmgen-objs := hal/components/pwmgen.o $(MATHSTUB) obj-$(CONFIG_SIGGEN) += siggen.o siggen-objs := hal/components/siggen.o $(MATHSTUB) obj-$(CONFIG_PID) += pid.o pid-objs := hal/components/pid.o $(MATHSTUB) obj-$(CONFIG_AT_PID) += at_pid.o at_pid-objs := hal/components/at_pid.o $(MATHSTUB) obj-$(CONFIG_PID) += threads.o threads-objs := hal/components/threads.o $(MATHSTUB) obj-$(CONFIG_SUPPLY) += supply.o supply-objs := hal/components/supply.o $(MATHSTUB) obj-$(CONFIG_SIM_ENCODER) += sim_encoder.o sim_encoder-objs := hal/components/sim_encoder.o $(MATHSTUB) obj-$(CONFIG_WEIGHTED_SUM) += weighted_sum.o weighted_sum-objs := hal/components/weighted_sum.o $(MATHSTUB) obj-$(CONFIG_WATCHDOG) += watchdog.o watchdog-objs := hal/components/watchdog.o $(MATHSTUB) obj-$(CONFIG_MODMATH) += modmath.o modmath-objs := hal/components/modmath.o $(MATHSTUB) obj-$(CONFIG_STREAMER) += streamer.o streamer-objs := hal/components/streamer.o $(MATHSTUB) obj-$(CONFIG_SAMPLER) += sampler.o sampler-objs := hal/components/sampler.o $(MATHSTUB) # Subdirectory: hal/drivers obj-$(CONFIG_HAL_PARPORT) += hal_parport.o hal_parport-objs := hal/drivers/hal_parport.o $(MATHSTUB) ifneq ($(BUILD_SYS),uspace) obj-$(CONFIG_PCI_8255) += pci_8255.o pci_8255-objs := hal/drivers/pci_8255.o obj-$(CONFIG_HAL_TIRO) += hal_tiro.o hal_tiro-objs := hal/drivers/hal_tiro.o $(MATHSTUB) obj-$(CONFIG_HAL_STG) += hal_stg.o hal_stg-objs := hal/drivers/hal_stg.o $(MATHSTUB) obj-$(CONFIG_HAL_VTI) += hal_vti.o hal_vti-objs := hal/drivers/hal_vti.o $(MATHSTUB) obj-$(CONFIG_HAL_EVOREG) += hal_evoreg.o hal_evoreg-objs := hal/drivers/hal_evoreg.o $(MATHSTUB) obj-$(CONFIG_HAL_MOTENC) += hal_motenc.o hal_motenc-objs := hal/drivers/hal_motenc.o $(MATHSTUB) obj-$(CONFIG_HAL_AX521H) += hal_ax5214h.o hal_ax5214h-objs := hal/drivers/hal_ax5214h.o $(MATHSTUB) obj-$(CONFIG_HAL_SPEAKER) += hal_speaker.o hal_speaker-objs := hal/drivers/hal_speaker.o $(MATHSTUB) obj-$(CONFIG_HAL_SKELETON) += hal_skeleton.o hal_skeleton-objs := hal/drivers/hal_skeleton.o $(MATHSTUB) obj-$(CONFIG_OPTO_AC5) += opto_ac5.o opto_ac5-objs := hal/drivers/opto_ac5.o $(MATHSTUB) endif obj-$(CONFIG_HAL_GM) += hal_gm.o hal_gm-objs := hal/drivers/hal_gm.o $(MATHSTUB) obj-$(CONFIG_HAL_PPMC) += hal_ppmc.o hal_ppmc-objs := hal/drivers/hal_ppmc.o $(MATHSTUB) #Don't attempt to build Pi / Beaglebone GPIO for RTAI ifeq ($(BUILD_SYS),uspace) obj-$(CONFIG_HAL_BB_GPIO) += hal_bb_gpio.o hal_bb_gpio-objs := \ hal/drivers/hal_bb_gpio.o \ $(MATHSTUB) obj-$(CONFIG_HAL_PI_GPIO) += hal_pi_gpio.o hal_pi_gpio-objs := \ hal/drivers/hal_pi_gpio.o \ hal/drivers/cpuinfo.o \ $(MATHSTUB) endif obj-$(CONFIG_HOSTMOT2) += hostmot2.o hm2_test.o hm2_pci.o hm2_7i43.o hm2_7i90.o setsserial.o ifeq ($(BUILD_SYS),uspace) obj-$(CONFIG_HOSTMOT2) += hm2_eth.o hm2_spi.o hm2_rpspi.o endif hostmot2-objs := \ hal/drivers/mesa-hostmot2/hostmot2.o \ hal/drivers/mesa-hostmot2/abs_encoder.o\ hal/drivers/mesa-hostmot2/bitfile.o \ hal/drivers/mesa-hostmot2/bspi.o \ hal/drivers/mesa-hostmot2/dpll.o \ hal/drivers/mesa-hostmot2/encoder.o \ hal/drivers/mesa-hostmot2/inm.o \ hal/drivers/mesa-hostmot2/inmux.o \ hal/drivers/mesa-hostmot2/ioport.o \ hal/drivers/mesa-hostmot2/led.o \ hal/drivers/mesa-hostmot2/pins.o \ hal/drivers/mesa-hostmot2/pktuart.o \ hal/drivers/mesa-hostmot2/pwmgen.o \ hal/drivers/mesa-hostmot2/raw.o \ hal/drivers/mesa-hostmot2/rcpwmgen.o \ hal/drivers/mesa-hostmot2/resolver.o \ hal/drivers/mesa-hostmot2/sserial.o \ hal/drivers/mesa-hostmot2/ssr.o \ hal/drivers/mesa-hostmot2/stepgen.o \ hal/drivers/mesa-hostmot2/tp_pwmgen.o \ hal/drivers/mesa-hostmot2/tram.o \ hal/drivers/mesa-hostmot2/uart.o \ hal/drivers/mesa-hostmot2/watchdog.o \ hal/drivers/mesa-hostmot2/xy2mod.o \ $(MATHSTUB) hm2_7i90-objs := \ hal/drivers/mesa-hostmot2/hm2_7i90.o \ hal/drivers/mesa-hostmot2/bitfile.o \ $(MATHSTUB) hm2_7i43-objs := \ hal/drivers/mesa-hostmot2/hm2_7i43.o \ hal/drivers/mesa-hostmot2/bitfile.o \ $(MATHSTUB) hm2_pci-objs := \ hal/drivers/mesa-hostmot2/hm2_pci.o \ hal/drivers/mesa-hostmot2/bitfile.o \ $(MATHSTUB) hm2_eth-objs := \ hal/drivers/mesa-hostmot2/hm2_eth.o \ $(MATHSTUB) hm2_spi-objs := \ hal/drivers/mesa-hostmot2/hm2_spi.o \ $(MATHSTUB) hm2_rpspi-objs := \ hal/drivers/mesa-hostmot2/hm2_rpspi.o \ $(MATHSTUB) hm2_test-objs := \ hal/drivers/mesa-hostmot2/hm2_test.o \ hal/drivers/mesa-hostmot2/bitfile.o \ $(MATHSTUB) setsserial-objs := \ hal/drivers/mesa-hostmot2/setsserial.o \ $(MATHSTUB) obj-m += scope_rt.o scope_rt-objs := hal/utils/scope_rt.o $(MATHSTUB) obj-m += hal_lib.o hal_lib-objs := hal/hal_lib.o $(MATHSTUB) TORTOBJS = $(foreach file,$($(patsubst %.o,%,$(1))-objs), objects/rt$(file)) ifeq ($(BUILD_SYS),uspace) EXTRA_CFLAGS += -fPIC -Os RTOBJS := $(sort $(foreach mod,$(obj-m),$(call TORTOBJS,$(mod)))) RTDEPS := $(sort $(RTOBJS:.o=.d)) modules: $(patsubst %.o,../rtlib/%.so,$(obj-m)) ../rtlib/%.so: $(ECHO) Linking $@ $(Q)ld -d -r -o objects/$*.tmp $^ $(Q)objcopy -j .rtapi_export -O binary objects/$*.tmp objects/$*.sym $(Q)(echo '{ global : '; tr -s '\0' < objects/$*.sym | xargs -r0 printf '%s;\n' | grep .; echo 'local : * ; };') > objects/$*.ver $(Q)$(CC) -shared -Bsymbolic $(LDFLAGS) -Wl,--version-script,objects/$*.ver -o $@ $^ -lm RTFLAGS += -fno-strict-aliasing -fwrapv # Rules to make .o (object) files $(sort $(RTOBJS)) : objects/rt%.o : %.c $(ECHO) Compiling realtime $< @rm -f $@ @mkdir -p $(dir $@) $(Q)$(CC) -c $(OPT) $(DEBUG) $(EXTRA_DEBUG) -DRTAPI \ $(EXTRA_CFLAGS) \ -MP -MD -MF "${@:.o=.d}" -MT "$@" \ $< -o $@ endif ifeq ($(BUILD_SYS),normal) modules: $(patsubst %,../rtlib/%,$(obj-m)) RTOBJS := $(sort $(foreach mod,$(obj-m),$(call TORTOBJS,$(mod)))) RTDEPS := $(sort $(patsubst objects/%.o,depends/%.d, $(RTOBJS))) # Rules to make .o (object) files $(sort $(RTOBJS)) : objects/rt%.o : %.c $(ECHO) Compiling realtime $< @rm -f $@ @mkdir -p $(dir $@) $(Q)$(CC) -c -DRTAPI -nostdinc -isystem $(shell $(CC) -print-file-name=include) -I$(KERNELDIR)/include $(EXTRA_CFLAGS) \ -MP -MD -MF "${@:.o=.d}" -MT "$@" \ $< -o $@ endif ifneq "$(filter normal uspace,$(BUILD_SYS))" "" ifneq "$(BUILD_SYS)" "uspace" ../rtlib/rtapi$(MODULE_EXT): $(addprefix objects/rt,$(rtapi-objs)) endif ../rtlib/classicladder_rt$(MODULE_EXT): $(addprefix objects/rt,$(classicladder_rt-objs)) ../rtlib/boss_plc$(MODULE_EXT): $(addprefix objects/rt,$(boss_plc-objs)) ../rtlib/debounce$(MODULE_EXT): $(addprefix objects/rt,$(debounce-objs)) ../rtlib/encoder$(MODULE_EXT): $(addprefix objects/rt,$(encoder-objs)) ../rtlib/counter$(MODULE_EXT): $(addprefix objects/rt,$(counter-objs)) ../rtlib/encoder_ratio$(MODULE_EXT): $(addprefix objects/rt,$(encoder_ratio-objs)) ../rtlib/stepgen$(MODULE_EXT): $(addprefix objects/rt,$(stepgen-objs)) ../rtlib/lcd$(MODULE_EXT): $(addprefix objects/rt,$(lcd-objs)) ../rtlib/matrix_kb$(MODULE_EXT): $(addprefix objects/rt,$(matrix_kb-objs)) ../rtlib/mux_generic$(MODULE_EXT): $(addprefix objects/rt,$(mux_generic-objs)) ../rtlib/pwmgen$(MODULE_EXT): $(addprefix objects/rt,$(pwmgen-objs)) ../rtlib/siggen$(MODULE_EXT): $(addprefix objects/rt,$(siggen-objs)) ../rtlib/at_pid$(MODULE_EXT): $(addprefix objects/rt,$(at_pid-objs)) ../rtlib/pid$(MODULE_EXT): $(addprefix objects/rt,$(pid-objs)) ../rtlib/threads$(MODULE_EXT): $(addprefix objects/rt,$(threads-objs)) ../rtlib/supply$(MODULE_EXT): $(addprefix objects/rt,$(supply-objs)) ../rtlib/sim_encoder$(MODULE_EXT): $(addprefix objects/rt,$(sim_encoder-objs)) ../rtlib/weighted_sum$(MODULE_EXT): $(addprefix objects/rt,$(weighted_sum-objs)) ../rtlib/watchdog$(MODULE_EXT): $(addprefix objects/rt,$(watchdog-objs)) ../rtlib/modmath$(MODULE_EXT): $(addprefix objects/rt,$(modmath-objs)) ../rtlib/streamer$(MODULE_EXT): $(addprefix objects/rt,$(streamer-objs)) ../rtlib/sampler$(MODULE_EXT): $(addprefix objects/rt,$(sampler-objs)) ../rtlib/hal_parport$(MODULE_EXT): $(addprefix objects/rt,$(hal_parport-objs)) ../rtlib/pci_8255$(MODULE_EXT): $(addprefix objects/rt,$(pci_8255-objs)) ../rtlib/hal_tiro$(MODULE_EXT): $(addprefix objects/rt,$(hal_tiro-objs)) ../rtlib/hal_stg$(MODULE_EXT): $(addprefix objects/rt,$(hal_stg-objs)) ../rtlib/hal_vti$(MODULE_EXT): $(addprefix objects/rt,$(hal_vti-objs)) ../rtlib/hal_evoreg$(MODULE_EXT): $(addprefix objects/rt,$(hal_evoreg-objs)) ../rtlib/hal_motenc$(MODULE_EXT): $(addprefix objects/rt,$(hal_motenc-objs)) ../rtlib/hal_ax5214h$(MODULE_EXT): $(addprefix objects/rt,$(hal_ax5214h-objs)) ../rtlib/hal_ppmc$(MODULE_EXT): $(addprefix objects/rt,$(hal_ppmc-objs)) ../rtlib/hal_skeleton$(MODULE_EXT): $(addprefix objects/rt,$(hal_skeleton-objs)) ../rtlib/hal_speaker$(MODULE_EXT): $(addprefix objects/rt,$(hal_speaker-objs)) ../rtlib/opto_ac5$(MODULE_EXT): $(addprefix objects/rt,$(opto_ac5-objs)) ../rtlib/scope_rt$(MODULE_EXT): $(addprefix objects/rt,$(scope_rt-objs)) ../rtlib/hal_lib$(MODULE_EXT): $(addprefix objects/rt,$(hal_lib-objs)) ../rtlib/motmod$(MODULE_EXT): $(addprefix objects/rt,$(motmod-objs)) ../rtlib/hal_gm$(MODULE_EXT): $(addprefix objects/rt,$(hal_gm-objs)) ../rtlib/hostmot2$(MODULE_EXT): $(addprefix objects/rt,$(hostmot2-objs)) ../rtlib/hm2_test$(MODULE_EXT): $(addprefix objects/rt,$(hm2_test-objs)) ../rtlib/hm2_pci$(MODULE_EXT): $(addprefix objects/rt,$(hm2_pci-objs)) ../rtlib/hm2_7i43$(MODULE_EXT): $(addprefix objects/rt,$(hm2_7i43-objs)) ../rtlib/hm2_7i90$(MODULE_EXT): $(addprefix objects/rt,$(hm2_7i90-objs)) ../rtlib/setsserial$(MODULE_EXT): $(addprefix objects/rt,$(setsserial-objs)) ../rtlib/hal_parport$(MODULE_EXT): $(addprefix objects/rt,$(hal_parport-objs)) ../rtlib/hal_ppmc$(MODULE_EXT): $(addprefix objects/rt,$(hal_ppmc-objs)) ../rtlib/hm2_eth$(MODULE_EXT): $(addprefix objects/rt,$(hm2_eth-objs)) ../rtlib/hm2_spi$(MODULE_EXT): $(addprefix objects/rt,$(hm2_spi-objs)) ../rtlib/hm2_rpspi$(MODULE_EXT): $(addprefix objects/rt,$(hm2_rpspi-objs)) ../rtlib/hal_bb_gpio$(MODULE_EXT): $(addprefix objects/rt,$(hal_bb_gpio-objs)) ../rtlib/hal_pi_gpio$(MODULE_EXT): $(addprefix objects/rt,$(hal_pi_gpio-objs)) ifeq ($(TRIVIAL_BUILD),no) READ_RTDEPS = $(wildcard $(RTDEPS)) $(shell $(VECHO) 1>&2 Reading $(words $(READ_RTDEPS))/$(words $(RTDEPS)) realtime dependency files) -include $(READ_RTDEPS) $(shell $(VECHO) 1>&2 Done reading realtime dependencies) endif endif # Phony so that it is always rebuilt when requested, not because it # shouldn't exist as a file .PHONY: tags tags: ctags-exuberant \ --extra=+fq \ --exclude=depends --exclude=objects --exclude=.mod.c \ '--langmap=make:+(Submakefile),make:+(Makefile.inc),c:+.comp' \ -I EXPORT_SYMBOL+,RTAPI_MP_INT+,RTAPI_MP_LONG+,RTAPI_MP_STRING+ \ -I RTAPI_MP_ARRAY_INT+,RTAPI_MP_ARRAY_LONG+,RTAPI_MP_ARRAY_STRING+ \ -I MODULE_AUTHOR+,MODULE_DESCRIPTION+,MODULE_LICENSE+ \ -R . ../tcl ../scripts ../share/axis/tcl rm -f TAGS find . -type f -name '*.[ch]' -printf '%P\0' |xargs -0 etags -l c --append find . -type f -name '*.cc' -printf '%P\0' |xargs -0 etags -l c++ --append find . -type f -name '*.hh' -printf '%P\0' |xargs -0 etags -l c++ --append etags: etags --extra=+fq \ --exclude=depends --exclude=objects --exclude=.mod.c \ '--langmap=make:+(Submakefile),make:+(Makefile.inc),c:+.comp' \ -I EXPORT_SYMBOL+,RTAPI_MP_INT+,RTAPI_MP_LONG+,RTAPI_MP_STRING+ \ -I RTAPI_MP_ARRAY_INT+,RTAPI_MP_ARRAY_LONG+,RTAPI_MP_ARRAY_STRING+ \ -I MODULE_AUTHOR+,MODULE_DESCRIPTION+,MODULE_LICENSE+ \ -R . ../tcl ../scripts ../share/axis/tcl find . -type f -name '*.[ch]' |xargs etags --language-force=C --append find . -type f -name '*.cc' |xargs etags --language-force=C++ --append find . -type f -name '*.hh' |xargs etags --language-force=C++ --append .PHONY: swish swish: swish-e -c .swish_config -v 0 -i $(BASEPWD) \ $(dir $(BASEPWD))tcl \ $(dir $(BASEPWD))share/axis/tcl \ $(dir $(BASEPWD))lib/python \ $(dir $(BASEPWD))scripts \ $(dir $(BASEPWD))configs \ $(dir $(BASEPWD))docs/src \ $(dir $(BASEPWD))docs/man/man1 # When you depend on objects/var-ZZZ you are depending on the contents of the # variable ZZZ, which is assumed to depend on a Makefile, a Submakefile, or # Makefile.inc objects/var-%: Makefile $(wildcard $(SUBMAKEFILES)) Makefile.inc @mkdir -p $(dir $@) @echo $($*) > $@.tmp @sh move-if-change $@.tmp $@ ../lib/%.so: ../lib/%.so.0 ln -sf $(notdir $<) $@ cscope: cscope -Rb cscopeclean: bash -c 'for f in `find ./ -name "cscope.*out"`;do rm $$f;done' # vim:ts=8:sts=8:sw=8:noet: