sorry, here is my makefile. i just add 
         
obj-m += trivkinstest.o
trivkinstest-objs := emc/kinematics/trivkinstest.o
$(RTLIBDIR)/trivkinstest$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(trivkinstest-objs))

can you give more details how should i do to build a RIP or run idconfig 
mannually. Sorry, i 'm a new in linux and BBB, trying to learn them



Vào 22:39:17 UTC+7 Thứ Hai, ngày 14 tháng 8 năm 2017, Schooner đã viết:
>
>
> On 14/08/17 16:22, thangle wrote:
>
> Here is what i did: 
>
>     - 1st: i make a coppy trivkins.c then rename it become trivkinstest.c 
>  and changing line 88 to: static const char *name = "trivkinstest";
>
>     - 2nd: i follow this 
>          
> https://groups.google.com/forum/#!msg/machinekit/yrBnTxQL7_E/IrPHxKn3BQAJ;context-place=forum/machinekit
>
>
> I wrote that, so I am familiar with it
>
>          + i pass Submakefile
>          + just change something in Makefile 
>
>
> 'just change something in makefile' is not information
>
>     - 3rd: use terminal go to /home/machinekit/machinekit/src and "make" 
> then type command "sudo make setuid"
>
>     - 4th: i try to test if trivkinstest work. i open CRAMPS.hal, change 
>            loadrt trivkins -->loadrt trivkinstest 
>            loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD 
> num_joints=[TRAJ]AXES tp=tp kins=trivkins--->trivkinstest
>
>     - finally: i try run CRAMPS but it's bugged 
>      Debug file information:
>      stat: No such file or directory
>      CRAMPS.hal:18: insmod failed, returned -1:
>      do_load_cmd: dlopen: trivkinstest.so: cannot open shared object file: 
> No such file or directory
>
>
> The module appears to have built from your printout, but you also look to 
> be building a RIP and then executing a binary installation
> Look at the rpath
>
> You need to build the RIP, set the current terminal session environment 
> using . ./scripts/rip-environment  from the root of the RIP
> and then launch machinekit from *that *terminal session
>
> Either that or copy the new module to your binary install and run ldconfig 
> manually and check it is in the cache
>
>      rpath=/usr/lib/linuxcnc/xenomai
>      See /var/log/linuxcnc.log for more information.
>      10047
>      PID TTY      STAT   TIME COMMAND  
>      Stopping realtime threads
>      Unloading hal components
>
> i'm using BBB and machinekit. sorry for my trash English.
>
> Vào 15:41:12 UTC+7 Thứ Hai, ngày 14 tháng 8 năm 2017, Schooner đã viết: 
>>
>> Going to need a lot more info than that and to see the source.
>>
>> You basically need to know how to write Makefiles, to alter the existing 
>> ones to build your stuff too, assuming it is compatible.
>>
>> On 14/08/17 03:39, thangle wrote:
>>
>> Hi, 
>>
>> Does anyone know how to compile a new source? example, i coppy a new  C 
>> project from an old project in machinekit src and rename, what should i do 
>> to make it work. please help me. tks 
>> -- 
>> website: http://www.machinekit.io blog: http://blog.machinekit.io 
>> github: https://github.com/machinekit
>> --- 
>> You received this message because you are subscribed to the Google Groups 
>> "Machinekit" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to machinekit+...@googlegroups.com.
>> Visit this group at https://groups.google.com/group/machinekit.
>> For more options, visit https://groups.google.com/d/optout.
>>
>>
>> -- 
> website: http://www.machinekit.io blog: http://blog.machinekit.io github: 
> https://github.com/machinekit
> --- 
> You received this message because you are subscribed to the Google Groups 
> "Machinekit" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to machinekit+...@googlegroups.com <javascript:>.
> Visit this group at https://groups.google.com/group/machinekit.
> For more options, visit https://groups.google.com/d/optout.
>
>
>

-- 
website: http://www.machinekit.io blog: http://blog.machinekit.io github: 
https://github.com/machinekit
--- 
You received this message because you are subscribed to the Google Groups 
"Machinekit" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to machinekit+unsubscr...@googlegroups.com.
Visit this group at https://groups.google.com/group/machinekit.
For more options, visit https://groups.google.com/d/optout.
# 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 docclean 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 clean setuid install tags swish,$(MAKECMDGOALS)),)
TRIVIAL_BUILD=yes
else
TRIVIAL_BUILD=no
endif
endif

# asciidoctor frontmatter generation for comp/instcomp
# this assumes we're running inside a git repo.
# if not, override EDIT_REMOTE EDIT_REPO EDIT_BRANCH via the environment, eg
#  EDIT_REMOTE=machinekit  make manpages  i_docpages

EDIT_REMOTE ?= origin
EDIT_REPO  ?= $(shell git ls-remote --get-url $(EDIT_REMOTE)  |sed 's/.git$$//')
EDIT_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD)
# $(info EDIT_REMOTE=$(EDIT_REMOTE) EDIT_BRANCH=$(EDIT_BRANCH)  
EDIT_REPO=$(EDIT_REPO))

# 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,$(MAKEFLAGS))" ""
ECHO=@echo
VECHO=echo
else
ECHO=@true
VECHO=true
endif

ifeq ($(threads),)
# if $(threads) wasn't passed in on the command line, rerun make for
# each flavor/(optional)kernel-source combo
BUILD_ALL_FLAVORS = yes
BUILD_THREAD_MODULES = no
else
# $(threads) was passed in; build modules for this flavor and (if
# applicable) kernel-source
BUILD_ALL_FLAVORS = no
BUILD_THREAD_MODULES = yes
endif # $(threads)

# if KERNELRELEASE is non-empty, we're in kbuild
ifeq ($(KERNELRELEASE),)
BUILD_KBUILD = no
else
BUILD_KBUILD = yes
endif

# extract the version from the kernel source version.h
ifneq ($(KERNELDIR),)
KERNEL_VERS = $(shell $(BASEPWD)/../scripts/kernel-vers.sh $(KERNELDIR))
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 ($(BUILD_THREAD_FLAVORS),)
$(error Makefile.inc must specify 'BUILD_THREAD_FLAVORS' and other variables)
endif
# prevent typos
ifeq "$(filter $(threads),$(BUILD_THREAD_FLAVORS))" ""
$(error "$(threads)" is not a valid RTOS flavor; please pick one of:\
    $(BUILD_THREAD_FLAVORS))
endif

# default target:  put before everything else
default:

ifeq ($(BUILD_ALL_FLAVORS),yes)
# Top-level modules target
#
# Re-run 'make modules', once for each configured userland threads
# flavor, and once for each detected kernel for each configured kernel
# threads flavor.  Set 'threads' and where applicable 'KERNELDIR'.
#
# Following tradition, this incarnation of the modules recipe is
# placed far away from all others.
FLAVORUP = $(shell echo $(1) | tr a-z- A-Z_)
FLAVORVAR = $($(call FLAVORUP,$(1))_THREADS_$(2))
modules:  userspace
        @$(foreach f,$(BUILD_THREAD_FLAVORS),\
            echo "Making modules for flavor $(f)"; \
            $(if $(findstring kbuild,$(call FLAVORVAR,$(f),BUILD_SYS)),\
                $(foreach kd,$(call FLAVORVAR,$(f),KERNEL_DIRS),\
                    echo "    kernel source dir $(kd)"; \
                    $(MAKE) modules threads=$(f) KERNELDIR=$(kd);\
                    ),\
                $(MAKE) modules threads=$(f);\
            )\
        )

ifeq ($(HAVE_KERNEL_THREADS),yes)
    @test -f ../libexec/linuxcnc_module_helper -a \
        \( `stat -c %u ../libexec/linuxcnc_module_helper` -ne 0 -o \
            ! -u ../libexec/linuxcnc_module_helper \) \
        && need_setuid=1; 
endif

ifeq ($(RUN_IN_PLACE)+$(BUILD_DRIVERS),yes+yes)
        for f in $(filter-out %-kernel,$(BUILD_THREAD_FLAVORS)); do \
            test -f ../libexec/rtapi_app_$$f -a \
                    \( 0`stat -c %u ../libexec/rtapi_app_$$f 2>/dev/null` \
                        -ne 0 -o ! -u ../libexec/rtapi_app_$$f \) \
                && need_setuid=1; \
        done; \
        test "$$need_setuid" = 1 && \
            $(VECHO) -n "You now need to run 'sudo make setuid' " && \
            $(VECHO) "in order to run in place." || true
endif

endif # BUILD_ALL_FLAVORS


OBJDIR := objects/$(RTDIR_EXT)
DEPDIR := depends/$(RTDIR_EXT)
RTLIBDIR := ../rtlib/$(RTDIR_EXT)

DEP = $(1) $(CPPFLAGS) -MM -MG -MT "$(2)" $(4) -o $(3).tmp && \
        mv -f "$(3)".tmp "$(3)"

cc-option = $(shell \
    if $(CC) $(CPPFLAGS) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \
            > /dev/null 2>&1; then \
        echo "$(1)"; \
    else \
        echo "$(2)"; \
    fi ;)

ifeq ($(KERNELRELEASE),)
# When KERNELRELEASE is not defined, this is the userspace build.
# The "modules" target is the gateway to the kernel module build.
default: configs userspace modules

# Print 'entering' all the time
MAKEFLAGS += w

INCLUDE_PREFIX = .

# Create the variables with := so that subsequent += alterations keep it
# as a "substitute at assignment time" variable
TARGETS :=
PYTARGETS :=
# Add to this list directories to be created during 'make install'
INSTALL_DIRS :=

# Submakefiles from each of these directories will be included if they exist
SUBDIRS := \
        \
        ../man \
        machinetalk \
        machinetalk/support \
        machinetalk/messagebus \
        machinetalk/msgcomponents \
        machinetalk/lib \
        machinetalk/config-service \
        machinetalk/haltalk \
        machinetalk/mkwrapper \
        machinetalk/mklauncher \
        machinetalk/videoserver \
        \
        rtapi/rtapi_math \
        \
        libnml/linklist \
        libnml/cms \
        libnml/rcs \
        libnml/inifile \
        libnml/os_intf \
        libnml/nml \
        libnml/buffer \
        libnml/posemath libnml \
        \
        rtapi/examples/timer \
        rtapi/examples/shmem \
        rtapi/examples \
        rtapi \
        rtapi/shmdrv \
        rtapi/userpci \
        \
        hal/lib \
        hal/i_components \
        hal/components \
        hal/vtable-example \
        hal/userfunct-example \
        hal/drivers \
        hal/user_comps/devices \
        hal/user_comps/mb2hal \
        hal/user_comps \
        hal/user_comps/vismach \
        hal/user_comps/vfs11_vfd \
        hal/user_comps/vfdb_vfd \
        hal/user_comps/huanyang-vfd \
        hal/classicladder \
        hal/utils \
        hal \
        hal/support \
        hal/drivers/hal_pru_generic \
        hal/simdrivers \
        hal/cython \
        hal/accessor \
        \
        emc/usr_intf/axis \
        emc/usr_intf/touchy \
        emc/usr_intf/stepconf \
        emc/usr_intf/pncconf \
        emc/usr_intf/gremlin \
        emc/usr_intf/gscreen \
        emc/usr_intf/gmoccapy \
        emc/usr_intf \
        emc/nml_intf \
        emc/task \
        emc/iotask \
        emc/kinematics \
        emc/canterp \
        emc/motion \
        emc/tp \
        emc/ini \
        emc/rs274ngc \
        emc/sai \
        emc \
        emc/pythonplugin \
        \
        po \

ifeq ($(HAVE_KERNEL_THREADS),yes)
SUBDIRS += module_helper
endif

ifeq ($(BUILD_WEBTALK),yes)
SUBDIRS += machinetalk/webtalk
endif

# moved to src/rtapi/Submakefile
# 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/%$(2).o,$(patsubst %.c,objects/%$(2).o,$(1)))
TODEPS = $(patsubst %.cc,depends/%$(2).d,$(patsubst %.c,depends/%$(2).d,$(1)))
#-not sure, something fishy here -mah
#TODEPS = $(patsubst %.cc,objects/%.d,$(patsubst %.c,objects/%.d,$(1)))

TOOBJSDEPS = $(call TOOBJS,$(1),$(2)) $(call TODEPS, $(1),$(2))

SUBMAKEFILES := $(patsubst %,%/Submakefile,$(SUBDIRS))
#$(info SUBMAKEFILES=$(SUBMAKEFILES))
-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)"))
ifdef TARGET_PLATFORM_BEAGLEBONE
# the beaglebone port adds .p (PRU assembly) source files, see hal/components
$(call ASSERT_EMPTY,$(filter-out %.c %.cc %.p %.js  %.ph %.proto, $(USERSRCS)))
else
$(call ASSERT_EMPTY,$(filter-out %.c %.cc %.js %.proto, $(USERSRCS)))
endif
$(call ASSERT_EMPTY,$(filter-out %.c %.proto, $(RTSRCS)))

ifeq ($(BUILD_PYTHON),yes)
$(call TOOBJS,$(PYSRCS)) : EXTRAFLAGS += -fPIC $(call 
cc-option,-fno-strict-aliasing)
USERSRCS += $(PYSRCS)
endif

# 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))

# Find the list of build-arch object files for C sources
CUSERSRCS_BUILD := $(filter %.c,$(USERSRCS_BUILD))
CUSEROBJS_BUILD := $(call TOOBJS,$(CUSERSRCS_BUILD),_build)

ifeq ($(TRIVIAL_BUILD),no)

ifeq ($(USE_PROTOBUF),yes)
# force create of %.proto-dependent files and their deps
Makefile: $(GENERATED) $(PROTO_DEPS)
-include $(PROTO_DEPS)
endif

ifdef TARGET_PLATFORM_BEAGLEBONE
ifneq ($(PRU_DEPS),)
Makefile: $(PRU_DEPS)
READ_PRU_DEPS = $(wildcard $(PRU_DEPS))
$(shell echo 1>&2 Reading $(words $(READ_PRU_DEPS))/$(words $(PRU_DEPS)) PRU 
dependency files)
-include $(wildcard $(READ_PRU_DEPS))
endif
endif

# Find the dependency filenames, then include them all
DEPS := $(sort $(patsubst %.o,%.d,$(CUSEROBJS) $(CXXUSEROBJS) \
        $(CUSEROBJS_BUILD)))
READ_DEPS = $(wildcard $(DEPS))
$(shell echo 1>&2 Reading $(words $(READ_DEPS))/$(words $(DEPS)) dependency 
files)
-include $(READ_DEPS)
UNREAD_DEPS = $(filter-out $(READ_DEPS), $(DEPS))
LEGACY_DEPS = $(patsubst objects/%, depends/%, $(UNREAD_DEPS))
READ_LEGACY_DEPS = $(wildcard $(LEGACY_DEPS))
ifneq ($(READ_LEGACY_DEPS),)
$(shell echo 1>&2 Reading $(words $(READ_LEGACY_DEPS)) old-style dependency 
files)
-include $(READ_LEGACY_DEPS)
endif
$(shell echo 1>&2 Done reading dependencies)
endif

# Each directory in $(INCLUDES) is passed as a -I directory when compiling.
INCLUDE := $(patsubst %,-I%, $(INCLUDES))
ifeq ($(BUILD_PYTHON),yes)
INCLUDE += $(PYTHON_CPPFLAGS)
endif

# trap build errors by making it possible to compare configure SHA vs build SHA
# see configure.ac GIT_CONFIG_SHA for the configure-time string
GIT_BUILD_SHA := $(shell ../scripts/get-git-sha)

# complain if SHA's dont match
$(info $(shell  ../scripts/check-build-vs-configure-sha))

# Compilation options.  Perhaps some of these should come from Makefile.inc? 
(CXXFLAGS now does)
INTEGER_OVERFLOW_FLAGS := $(call cc-option,-fwrapv) $(call cc-option, 
-fno-strict-overflow)
OPT :=  $(INTEGER_OVERFLOW_FLAGS)
DEBUG := -g -Wall -funwind-tables
PROFILE_CFLAGS :=
PROFILE_LDFLAGS :=

CFLAGS := $(INCLUDE) $(OPT) $(DEBUG) $(PROFILE_CFLAGS) -DULAPI $(call 
cc-option,-std=gnu99 -fgnu89-inline)

# enable runtime comparison of GIT_CONFIG_SHA (config.h) and GIT_BUILD_SHA
CFLAGS += -DGIT_BUILD_SHA=\"'$(GIT_BUILD_SHA)'\"

# make ck_pr.h happy:
CFLAGS += $(CK_CFLAGS)

# if not initialised use innocuous switch to prevent errors
ifeq ($(ARCH_CFLAGS),@ARCH_CFLAGS@)
ARCH_CFLAGS := -Wunused
endif

BASE_CXXFLAGS:= $(INCLUDE) $(CXXFLAGS) \
                $(CK_CFLAGS) \
                $(DEBUG) $(OPT) \
                $(PROFILE_CFLAGS) \
                 -DGIT_BUILD_SHA=\"'$(GIT_BUILD_SHA)'\" \
                $(ARCH_CFLAGS)

CXXFLAGS :=   $(BASE_CXXFLAGS) -DULAPI
RT_CXXFLAGS :=   $(BASE_CXXFLAGS) 

ifeq ($(RUN_IN_PLACE),yes)
LDFLAGS += -L$(LIB_DIR) -Wl,-rpath,$(LIB_DIR)
else
LDFLAGS += -Wl,-rpath-link,../lib
endif
LDFLAGS += -Wl,--no-as-needed

# Rules to make .o (object) files
$(sort $(CUSEROBJS)) : objects/%.o: %.c
        $(ECHO) Compiling $<
        @mkdir -p $(dir $@)
        @rm -f $@
        $(Q)$(CC) -c $(CPPFLAGS) $(CFLAGS) $(EXTRAFLAGS) \
                -MP -MD -MF "${@:.o=.d}" -MT "$@" \
                $< -o $@

# Rules to make .o (object) files, build arch
$(sort $(CUSEROBJS_BUILD)) : objects/%_build.o: %.c
        $(ECHO) Compiling $<
        @mkdir -p $(dir $@)
        @rm -f $@
        $(Q)$(CC_FOR_BUILD) -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 $(CPPFLAGS) $(CXXFLAGS) $(EXTRAFLAGS) \
                -MP -MD -MF "${@:.o=.d}" -MT "$@" \
                $< -o $@

ifeq ($(TRIVIAL_BUILD),no)
configure config.h.in: configure.ac
        @echo "*** configure.ac has changed ***" >&2
        @echo "Not running autoconf to avoid tainting universal build" >&2
        @echo "Please investigate or start from scratch:" >&2
        @echo "./autogen.sh && ./configure --your-configure-args..." >&2
        @exit 1
        # AUTOGEN_TARGET=configure ./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/haltcl \
        ../scripts/gen-rtapi.ini.sh \
        Makefile.inc \
        Makefile.modinc \
        ../tcl/linuxcnc.tcl \
        ../scripts/halrun \
        ../scripts/rip-environment \
        ../scripts/linuxcncmkdesktop \
        ../lib/python/nf.py \
        ../share/desktop-directories/cnc.directory \
        ../share/menus/CNC.menu \
        ../share/applications/linuxcnc.desktop \
        ../scripts/linuxcnc_var \

$(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 := \
    config.h \
    emc/ini/emcIniFile.hh \
    emc/ini/iniaxis.hh \
    emc/ini/initool.hh \
    emc/ini/initraj.hh \
    emc/ini/inihal.hh \
    emc/kinematics/cubic.h \
    emc/kinematics/kinematics.h \
    emc/kinematics/genhexkins.h \
    emc/kinematics/genserkins.h \
    emc/kinematics/pumakins.h \
    emc/tp/tc.h \
    emc/tp/tc_types.h \
    emc/tp/tcq.h \
    emc/tp/tp.h \
    emc/tp/tp_types.h \
    emc/tp/spherical_arc.h \
    emc/tp/blendmath.h \
    emc/tp/tp_shared.h \
    emc/tp/tp_private.h \
    emc/motion/emcmotcfg.h \
    emc/motion/emcmotglb.h \
    emc/motion/motion.h \
    emc/motion/motion_id.h \
    emc/motion/usrmotintf.h \
    emc/motion/state_tag.h \
    emc/nml_intf/canon.hh \
    emc/nml_intf/canon_position.hh \
    emc/nml_intf/emctool.h \
    emc/nml_intf/emc.hh \
    emc/nml_intf/emc_nml.hh \
    emc/nml_intf/emccfg.h \
    emc/nml_intf/emcglb.h \
    emc/nml_intf/emcpos.h \
    emc/nml_intf/emcpose.h \
    emc/nml_intf/interp_return.hh \
    emc/nml_intf/interpl.hh \
    emc/nml_intf/motion_types.h \
    emc/nml_intf/debugflags.h \
    emc/rs274ngc/interp_internal.hh \
    emc/rs274ngc/interp_base.hh \
    emc/rs274ngc/modal_state.hh \
    emc/rs274ngc/rs274ngc.hh \
    hal/lib/hal_accessor.h \
    hal/lib/hal_accessor_macros.h \
    hal/lib/config_module.h \
    hal/lib/hal_group.h \
    hal/lib/hal.h \
    hal/lib/hal_iring.h \
    hal/lib/hal_internal.h \
    hal/lib/hal_iter.h \
    hal/lib/hal_list.h \
    hal/lib/hal_logging.h \
    hal/lib/hal_object.h \
    hal/lib/hal_object_selectors.h \
    hal/lib/hal_parport.h \
    hal/lib/hal_priv.h \
    hal/lib/hal_rcomp.h \
    hal/lib/hal_ring.h \
    hal/lib/hal_types.h \
    hal/lib/vtable.h \
    hal/drivers/hal_spi.h \
    libnml/buffer/locmem.hh \
    libnml/buffer/memsem.hh \
    libnml/buffer/phantom.hh \
    libnml/buffer/physmem.hh \
    libnml/buffer/recvn.h \
    libnml/buffer/rem_msg.hh \
    libnml/buffer/sendn.h \
    libnml/buffer/shmem.hh \
    libnml/buffer/tcpmem.hh \
    libnml/cms/cms.hh \
    libnml/cms/cms_aup.hh \
    libnml/cms/cms_cfg.hh \
    libnml/cms/cms_dup.hh \
    libnml/cms/cms_srv.hh \
    libnml/cms/cms_up.hh \
    libnml/cms/cms_user.hh \
    libnml/cms/cms_xup.hh \
    libnml/cms/cmsdiag.hh \
    libnml/cms/tcp_opts.hh \
    libnml/cms/tcp_srv.hh \
    libnml/inifile/inifile.h \
    libnml/inifile/inifile.hh \
    libnml/linklist/linklist.hh \
    libnml/nml/cmd_msg.hh \
    libnml/nml/nml.hh \
    libnml/nml/nml_mod.hh \
    libnml/nml/nml_oi.hh \
    libnml/nml/nml_srv.hh \
    libnml/nml/nml_type.hh \
    libnml/nml/nmldiag.hh \
    libnml/nml/nmlmsg.hh \
    libnml/nml/stat_msg.hh \
    libnml/os_intf/_sem.h \
    libnml/os_intf/sem.hh \
    libnml/os_intf/_shm.h \
    libnml/os_intf/shm.hh \
    libnml/os_intf/_timer.h \
    libnml/os_intf/timer.hh \
    libnml/posemath/posemath.h \
    libnml/posemath/gotypes.h \
    libnml/posemath/gomath.h \
    libnml/posemath/sincos.h \
    libnml/rcs/rcs.hh \
    libnml/rcs/rcs_exit.hh \
    libnml/rcs/rcs_print.hh \
    libnml/rcs/rcsversion.h \
    machinetalk/build/machinetalk/protobuf/message.pb.h \
    machinetalk/build/machinetalk/protobuf/types.pb.h \
    machinetalk/build/machinetalk/protobuf/canon.npb.h \
    machinetalk/build/machinetalk/protobuf/config.pb.h \
    machinetalk/build/machinetalk/protobuf/firmware.npb.h \
    machinetalk/build/machinetalk/protobuf/jplan.pb.h \
    machinetalk/build/machinetalk/protobuf/message.npb.h \
    machinetalk/build/machinetalk/protobuf/motcmds.pb.h \
    machinetalk/build/machinetalk/protobuf/object.npb.h \
    machinetalk/build/machinetalk/protobuf/preview.pb.h \
    machinetalk/build/machinetalk/protobuf/rtapicommand.npb.h \
    machinetalk/build/machinetalk/protobuf/rtapi_message.pb.h \
    machinetalk/build/machinetalk/protobuf/task.npb.h \
    machinetalk/build/machinetalk/protobuf/test.pb.h \
    machinetalk/build/machinetalk/protobuf/value.npb.h \
    machinetalk/build/machinetalk/protobuf/canon.pb.h \
    machinetalk/build/machinetalk/protobuf/emcclass.npb.h \
    machinetalk/build/machinetalk/protobuf/firmware.pb.h \
    machinetalk/build/machinetalk/protobuf/log.npb.h \
    machinetalk/build/machinetalk/protobuf/nanopb.npb.h \
    machinetalk/build/machinetalk/protobuf/object.pb.h \
    machinetalk/build/machinetalk/protobuf/ros.npb.h \
    machinetalk/build/machinetalk/protobuf/rtapicommand.pb.h \
    machinetalk/build/machinetalk/protobuf/status.npb.h \
    machinetalk/build/machinetalk/protobuf/task.pb.h \
    machinetalk/build/machinetalk/protobuf/types.npb.h \
    machinetalk/build/machinetalk/protobuf/value.pb.h \
    machinetalk/build/machinetalk/protobuf/config.npb.h \
    machinetalk/build/machinetalk/protobuf/emcclass.pb.h \
    machinetalk/build/machinetalk/protobuf/jplan.npb.h \
    machinetalk/build/machinetalk/protobuf/log.pb.h \
    machinetalk/build/machinetalk/protobuf/motcmds.npb.h \
    machinetalk/build/machinetalk/protobuf/nanopb.pb.h \
    machinetalk/build/machinetalk/protobuf/preview.npb.h \
    machinetalk/build/machinetalk/protobuf/ros.pb.h \
    machinetalk/build/machinetalk/protobuf/rtapi_message.npb.h \
    machinetalk/build/machinetalk/protobuf/status.pb.h \
    machinetalk/build/machinetalk/protobuf/test.npb.h \
    machinetalk/nanopb/pb.h \
    machinetalk/nanopb/pb_common.h \
    machinetalk/nanopb/pb_encode.h \
    machinetalk/nanopb/pb_decode.h \
    rtapi/multiframe_flag.h \
    rtapi/rtapi.h \
    rtapi/rtapi_app.h \
    rtapi/rtapi_atomics.h \
    rtapi/rtapi_bitops.h \
    rtapi/rtapi_byteorder.h \
    rtapi/rtapi_export.h \
    rtapi/rtapi_compat.h \
    rtapi/rtapi_hexdump.h \
    rtapi/rtapi_int.h \
    rtapi/rtapi_kdetect.h \
    rtapi/rtapi_limits.h \
    rtapi/rtapi_math.h \
    rtapi/rtapi_math64.h \
    rtapi/rtapi_common.h \
    rtapi/rtapi_exception.h \
    rtapi/rtapi_global.h \
    rtapi/rtapi_shmkeys.h \
    rtapi/rtapi_io.h \
    rtapi/rtapi_ctype.h \
    rtapi/rtapi_errno.h \
    rtapi/rtapi_string.h \
    rtapi/rtapi_pci.h \
    rtapi/rtapi_proc.h \
    rtapi/rtapi_heap.h \
    rtapi/rtapi_heap_private.h \
    rtapi/ring.h \
    rtapi/triple-buffer.h \
    rtapi/multiframe.h \
    rtapi/rtapi_mbarrier.h \
    rtapi/$(THREADS_SOURCE).h \
    rtapi/shmdrv/shmdrv.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 headers to this list that need to go into subdirectories; their
# respective Submakefiles will need to provide rules to copy them into
# ../install.
headers: $(SUBDIRECTORY_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))

# tooledit as standalone app:
TARGETS += ../bin/tooledit
../bin/tooledit: Makefile
        $(Q)rm -f $@
        $(Q)(echo "#!$(TCLSH)")>|$@
        $(Q)(echo "source $(EMC2_TCL_LIB_DIR)/tooledit.tcl")>>$@
        $(Q)(echo "standalone_tooledit")>>$@
        $(Q)chmod +x $@

# ngcgui as standalone app:
TARGETS += ../bin/ngcgui
../bin/ngcgui: Makefile
        $(Q)rm -f $@
        $(Q)(echo "#!$(TCLSH)")>|$@
        $(Q)(echo "source $(EMC2_TCL_LIB_DIR)/ngcgui.tcl")>>$@
        $(Q)(echo "::ngcgui::standalone_ngcgui")>>$@
        $(Q)chmod +x $@

# pyngcgui as standalone app:
TARGETS += ../bin/pyngcgui
../bin/pyngcgui: Makefile
        $(Q)rm -f $@
        $(Q)(echo "#!$(PYTHON)")>|$@
        $(Q)(echo "import pyngcgui")>>$@
        $(Q)(echo "pyngcgui.standalone_pyngcgui()")>>$@
        $(Q)chmod +x $@

# gremlin_view as standalone app:
TARGETS += ../bin/gremlin_view
../bin/gremlin_view: Makefile
        $(Q)rm -f $@
        $(Q)(echo "#!$(PYTHON)")>|$@
        $(Q)(echo "import gremlin_view")>>$@
        $(Q)(echo "gremlin_view.standalone_gremlin_view()")>>$@
        $(Q)chmod +x $@

# halshow as standalone app:
TARGETS += ../bin/halshow
../bin/halshow: Makefile
        $(Q)rm -f $@
        $(Q)(echo "#!$(TCLSH)")>|$@
        $(Q)(echo "source $(EMC2_TCL_LIB_DIR)/bin/halshow.tcl")>>$@
        $(Q)chmod +x $@

# And make userspace depend on $(TARGETS)
userspace: $(TARGETS)

ifeq ($(BUILD_PYTHON),yes)
pythonclean:
        rm -f $(PYTARGETS)
        find ../lib/python -name '*.so' -exec rm {} +
python: $(PYTARGETS)
userspace: python
clean: pythonclean cscopeclean
endif

# 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.
#
# (don't build when 'BUILD_ALL_FLAVORS' or 'BUILD_THREADS_MODULES' are set;
# these are intermediate make runs)
ifeq ($(BUILD_SYS)+$(BUILD_THREAD_MODULES),kbuild+yes)
modules:  $(OBJDIR)/.separate-kbuild-artifacts-hack.stamp
        mkdir -p $(RTLIBDIR)
        $(PYTHON) modsilent.py $(MAKE) \
            -C $(KERNELDIR) \
            SUBDIRS=$(BASEPWD)/$(OBJDIR) \
            CC="$(CC)" KBUILD_VERBOSE=$(BUILD_VERBOSE) modules
        cp $(OBJDIR)/Module.symvers $(OBJDIR)/*$(MODULE_EXT) $(RTLIBDIR)
endif  # BUILD_SYS == 'kbuild'

# It looks almost impossible to coerce kbuild into putting build
# artifacts outside the source tree.  The universal build needs to
# keep these artifacts separate for each kthread flavor.  To solve
# this, create a link tree in objects/rtapi-<flavor> with everything
# needed to build kernel modules.
#
# Then in the above 'modules:' target, cd to the link tree and call
# kbuild.
MODULE_SOURCE_DIRS = emc hal libnml rtapi workaround machinetalk
MODULE_SOURCES = Makefile* config* modsilent.py
$(OBJDIR)/.separate-kbuild-artifacts-hack.stamp:
        mkdir -p $(OBJDIR)
        # hard-link contents of $(MODULE_SOURCE_DIRS) to # $(OBJDIR)
        # never follow symbolic links
        cp -rlfd $(MODULE_SOURCE_DIRS) $(OBJDIR)
        cp -lf $(MODULE_SOURCES) $(OBJDIR)
ifeq ($(BUILD_SYS),kbuild)
        # kbuild needs a full copy of this tree with
        cp -rlf halcomp-srcs $(OBJDIR)
endif
        ln -sf $(BASEPWD)/../bin $(OBJDIR)/..
        ln -sf $(BASEPWD)/../scripts $(OBJDIR)/..
        touch $@

# 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
        -rm -rf halcomp-srcs
        find . -name .tmp_versions |xargs rm -rf
        -rm -f $(RTLIBDIR)/*.ko
        -rm -f $(RTLIBDIR)/*.so

depclean:
        -rm -rf depends

docclean:
        -rm -f ../man/man9/*.9icomp
        -rm -f ../man/doc/man9/*.asciidoc

clean: depclean modclean docclean
        find . -name '*.o' |xargs rm -f
        -rm -rf objects
        -rm -f $(TARGETS)
        for flav in $(BUILD_THREAD_FLAVORS); do \
            rm -rf ../lib/$$flav; \
        done
        -rm -rf ../rtlib ../libexec
        rm -f ../etc/linuxcnc/rtapi.ini
        -rm -f $(COPY_CONFIGS)
        -rm -f $(RTLIBDIR)/*.$(MODULE_EXT)
        -rm -f hal/components/conv_*.comp
        -rm -f hal/components/*_bin.h   # generated by pasm for bb platform
        rm -rf ../share/linuxcnc/stepconf
        -rm -rf ../libexec

# 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)
fix_perms = test -f $(1) && chown root $(1) && chmod 4750 $(1) || true

ifeq ($(BUILD_DRIVERS),yes)
ifeq ($(HAVE_KERNEL_THREADS),yes)
CHECK_KFLAV_SWITCH=-k
endif
setuid:
ifeq ($(HAVE_KERNEL_THREADS),yes)
        $(call fix_perms,../libexec/linuxcnc_module_helper)
endif
        $(call fix_perms,../libexec/pci_read)
        $(call fix_perms,../libexec/pci_write)
        $(foreach f,$(BUILD_THREAD_FLAVORS),\
            $(call fix_perms,../libexec/rtapi_app_$(f));)
# check system configuration:  logging, ulimits, udev
        @-../scripts/check-system-configuration.sh $(CHECK_KFLAV_SWITCH)
else
setuid:
        @echo "'make setuid' is not needed if hardware drivers are not used"
endif

# 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.
../include/%.h: %.h
        @mkdir -p $(dir $@)
        $(Q)-cp $^ $@
../include/%.hh: %.hh
        @mkdir -p $(dir $@)
        $(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 \

install-menus install-menu: $(MENUS)
        mkdir -p $(HOME)/.config/menus/applications-merged
        cp $< $(HOME)/.config/menus/applications-merged
else

DOCS_HELP=$(call GLOB,../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-test:
        @if type -path dpkg-query > /dev/null 2>&1 ; then  \
                if dpkg-query -S $(DESTDIR)/usr/bin/linuxcnc > /dev/null 2>&1 
|| dpkg-query -S $(DESTDIR)/usr/bin/emc > /dev/null 2>&1 ; then \
                        echo "*** Error: Package version installed in 
$(DESTDIR)/usr"; \
                        echo "Use './configure --enable-run-in-place' or 
uninstall the linuxcnc package"; \
                        echo "before installing."; \
                        exit 1; \
                fi \
        fi

install: install-test install-kernel-dep install-kernel-indep
        $(ECHO) "Installed in $(DESTDIR) with prefix $(prefix)"

install-dirs:
        $(DIR)  $(DESTDIR)$(EMC2_RTLIB_DIR) \
                $(DESTDIR)$(sysconfdir)/linuxcnc $(DESTDIR)$(bindir) \
                $(DESTDIR)$(includedir)/linuxcnc \
                $(DESTDIR)$(docdir) $(DESTDIR)$(ncfilesdir) \
                $(DESTDIR)$(EMC2_LIBEXEC_DIR) \
                $(DESTDIR)/etc/X11/app-defaults $(DESTDIR)$(tcldir)/bin \
                $(DESTDIR)$(tcldir)/scripts \
                $(DESTDIR)$(mandir)/man1 \
                $(DESTDIR)$(mandir)/man3 \
                $(DESTDIR)$(mandir)/man9 \
                $(DESTDIR)$(tcldir)/msgs \
                $(DESTDIR)$(localedir)/de/LC_MESSAGES \
                $(DESTDIR)$(datadir)/axis/images \
                $(DESTDIR)$(datadir)/axis/tcl \
                $(DESTDIR)$(datadir)/gscreen/images \
                $(DESTDIR)$(datadir)/gscreen/skins \
                $(DESTDIR)$(datadir)/gmoccapy/images \
                $(DESTDIR)$(datadir)/glade3/catalogs \
                $(DESTDIR)$(datadir)/glade3/pixmaps \
                $(DESTDIR)$(datadir)/gtksourceview-2.0/language-specs \
                $(DESTDIR)$(datadir)/linuxcnc/stepconf \
                $(DESTDIR)$(datadir)/linuxcnc/pncconf/pncconf-help \
                $(DESTDIR)$(sysconfdir)/rsyslog.d \
                $(DESTDIR)$(sysconfdir)/security/limits.d \
                $(DESTDIR)$(sysconfdir)/udev/rules.d \
                $(DESTDIR)$(sampleconfsdir) \
                $(addprefix $(DESTDIR), $(INSTALL_DIRS))
ifeq ($(BUILD_EMCWEB),yes)
        $(DIR)  $(DESTDIR)$(datadir)/linuxcnc/doc-root/css/images \
                $(DESTDIR)$(datadir)/linuxcnc/doc-root/js \
                $(DESTDIR)$(datadir)/linuxcnc/doc-root/res
endif
ifeq ($(USERMODE_PCI),yes)
        $(DIR)  $(DESTDIR)$(includedir)/linuxcnc/userpci
endif

install-kernel-indep: install-dirs
        $(FILE) objects/*.msg $(DESTDIR)$(tcldir)/msgs
        $(EXE) ../scripts/realtime $(DESTDIR)$(bindir)
        $(EXE) ../scripts/halrun $(DESTDIR)$(bindir)
        $(EXE) ../scripts/haltcl $(DESTDIR)$(bindir)
        $(EXE) ../scripts/simulate_probe $(DESTDIR)$(bindir)
        $(EXE) ../scripts/sim_pin $(DESTDIR)$(bindir)
        $(FILE) ../*.png ../*.gif $(DESTDIR)$(datadir)/linuxcnc

        # install all the sample configs, including subdirs (tar is required on 
debian systems, and common on others)
        ((cd ../configs && tar --exclude CVS --exclude .cvsignore --exclude 
.gitignore -cf - .) | (cd $(DESTDIR)$(sampleconfsdir) && tar -xf -))

        $(EXE) $(filter ../bin/%,$(TARGETS)) $(DESTDIR)$(bindir)
        $(EXE) ../scripts/linuxcnc $(DESTDIR)$(bindir)
        $(EXE) ../scripts/machinekit $(DESTDIR)$(bindir)
        $(EXE) ../scripts/linuxcnc_info $(DESTDIR)$(bindir)
        $(EXE) ../scripts/linuxcnc_var $(DESTDIR)$(bindir)
        $(EXE) ../scripts/latency-test $(DESTDIR)$(bindir)
ifeq ($(HAVE_WORKING_BLT),yes)
        $(EXE) ../scripts/latency-plot $(DESTDIR)$(bindir)
        $(EXE) ../scripts/latency-histogram $(DESTDIR)$(bindir)
endif
        $(EXE) ../scripts/pyvcp_demo $(DESTDIR)$(bindir)
        $(EXE) ../scripts/gladevcp_demo $(DESTDIR)$(bindir)
        $(EXE) ../scripts/linuxcncmkdesktop $(DESTDIR)$(bindir)
        $(FILE) $(filter ../lib/%.a ../lib/%.so.0,$(TARGETS)) 
$(DESTDIR)$(libdir)
        cp --no-dereference $(filter ../lib/%.so, $(TARGETS)) 
$(DESTDIR)$(libdir)
        $(FILE) ../rtlib/ulapi-*.so $(DESTDIR)$(EMC2_RTLIB_BASE_DIR)
        -ldconfig $(DESTDIR)$(libdir)
        $(FILE) $(HEADERS) $(DESTDIR)$(includedir)/linuxcnc/
ifeq ($(USERMODE_PCI),yes)
        $(FILE) $(USERPCI_HEADERS) $(DESTDIR)$(includedir)/linuxcnc/userpci
endif
        $(FILE) $(DOCS_HELP) $(DESTDIR)$(docdir)
        $(TREE) $(NC_FILES) $(DESTDIR)$(ncfilesdir)
        $(EXE) ../nc_files/M101 $(DESTDIR)$(ncfilesdir)
        $(FILE) ../tcl/TkLinuxCNC $(DESTDIR)/etc/X11/app-defaults
        $(FILE) ../app-defaults/XEmc $(DESTDIR)/etc/X11/app-defaults
        $(FILE) Makefile.modinc $(DESTDIR)$(datadir)/linuxcnc
        $(FILE) Makefile.inc $(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
        $(FILE) ../tcl/scripts/balloon.tcl ../tcl/scripts/emchelp.tcl 
$(DESTDIR)$(tcldir)/scripts
        $(EXE) ../tcl/scripts/Set_Coordinates.tcl $(DESTDIR)$(tcldir)/scripts
        $(FILE) ../share/linuxcnc/*.glade $(DESTDIR)$(prefix)/share/linuxcnc
        $(FILE) ../share/linuxcnc/stepconf/*.glade 
$(DESTDIR)$(prefix)/share/linuxcnc/stepconf
        $(FILE) ../share/linuxcnc/touchy.glade 
$(DESTDIR)$(prefix)/share/linuxcnc
        $(FILE) ../share/linuxcnc/gscreen.glade 
$(DESTDIR)$(prefix)/share/linuxcnc
        $(FILE) ../share/linuxcnc/gscreen2.glade 
$(DESTDIR)$(prefix)/share/linuxcnc
        $(FILE) ../share/gmoccapy/gmoccapy.glade 
$(DESTDIR)$(prefix)/share/gmoccapy
        $(FILE) ../share/linuxcnc/pncconf.glade 
$(DESTDIR)$(prefix)/share/linuxcnc
        $(FILE) ../share/linuxcnc/gremlin_view.ui 
$(DESTDIR)$(prefix)/share/linuxcnc
        $(FILE) ../share/linuxcnc/popupkeyboard.ui 
$(DESTDIR)$(prefix)/share/linuxcnc
        $(FILE) ../configs/common/linuxcnc.nml 
$(DESTDIR)$(prefix)/share/linuxcnc
        $(FILE) ../src/emc/usr_intf/pncconf/pncconf-help/*.txt 
$(DESTDIR)$(prefix)/share/linuxcnc/pncconf/pncconf-help
        $(FILE) ../src/emc/usr_intf/pncconf/pncconf-help/*.png 
$(DESTDIR)$(prefix)/share/linuxcnc/pncconf/pncconf-help

        $(FILE) ../lib/python/gladevcp/hal_python.xml 
$(DESTDIR)$(datadir)/glade3/catalogs/
        $(FILE) ../lib/python/gladevcp/widget*.png  
$(DESTDIR)$(datadir)/glade3/pixmaps/

        $(FILE) ../share/gtksourceview-2.0/language-specs/*.lang  
$(DESTDIR)$(datadir)/gtksourceview-2.0/language-specs/
        $(FILE) rtapi/rsyslogd-linuxcnc.conf 
$(DESTDIR)$(sysconfdir)/rsyslog.d/linuxcnc.conf
        $(FILE) rtapi/shmdrv/limits.d-machinekit.conf \
                $(DESTDIR)$(sysconfdir)/security/limits.d/machinekit.conf
        $(FILE) rtapi/shmdrv/shmdrv.rules \
                $(DESTDIR)$(sysconfdir)/udev/rules.d/50-shmdrv.rules
ifeq ($(BUILD_EMCWEB),yes)
        $(FILE) ../www/css/images/* 
$(DESTDIR)$(datadir)/linuxcnc/doc-root/css/images
        $(FILE) ../www/css/*css $(DESTDIR)$(datadir)/linuxcnc/doc-root/css
        $(FILE) ../www/js/*js $(DESTDIR)$(datadir)/linuxcnc/doc-root/js
        $(FILE) ../www/res/* $(DESTDIR)$(datadir)/linuxcnc/doc-root/res
        $(FILE) ../www/*html $(DESTDIR)$(datadir)/linuxcnc/doc-root/
endif
        $(FILE) ../etc/linuxcnc/machinekit.ini $(DESTDIR)$(sysconfdir)/linuxcnc
        $(EXE) ../bin/profile_axis $(DESTDIR)$(bindir)
        $(EXE) ../bin/mank $(DESTDIR)$(bindir)

ifeq ($(BUILD_PYTHON),yes)
install-kernel-indep: install-python
install-python: install-dirs
        $(DIR) $(DESTDIR)$(SITEPY) $(DESTDIR)$(SITEPY)/rs274
        $(DIR) $(DESTDIR)$(SITEPY)/touchy
        $(DIR) $(DESTDIR)$(SITEPY)/gscreen
        $(DIR) $(DESTDIR)$(SITEPY)/gmoccapy
        $(DIR) $(DESTDIR)$(SITEPY)/gladevcp
        $(DIR) $(DESTDIR)$(SITEPY)/stepconf
        $(DIR) $(DESTDIR)$(SITEPY)/machinekit
        $(DIR) $(DESTDIR)$(SITEPY)/machinekit/nosetests
        $(DIR) $(DESTDIR)$(SITEPY)/machinetalk
        $(DIR) $(DESTDIR)$(SITEPY)/machinetalk/protobuf
        $(DIR) $(DESTDIR)$(SITEPY)/fdm
        $(DIR) $(DESTDIR)$(SITEPY)/fdm/config
        $(DIR) $(DESTDIR)$(datadir)/fdm/thermistor_tables
        $(DIR) $(DESTDIR)$(SITEPY)/drivers
        $(FILE) ../lib/python/*.py ../lib/python/*.so $(DESTDIR)$(SITEPY)
        $(FILE) ../lib/python/rs274/*.py $(DESTDIR)$(SITEPY)/rs274
        $(FILE) ../lib/python/touchy/*.py $(DESTDIR)$(SITEPY)/touchy
        $(FILE) ../lib/python/gscreen/*.py $(DESTDIR)$(SITEPY)/gscreen
        $(FILE) ../lib/python/gmoccapy/*.py $(DESTDIR)$(SITEPY)/gmoccapy
        $(FILE) ../lib/python/gladevcp/*.py $(DESTDIR)$(SITEPY)/gladevcp
        $(FILE) ../lib/python/gladevcp/*.glade $(DESTDIR)$(SITEPY)/gladevcp
        $(FILE) ../lib/python/stepconf/*.py $(DESTDIR)$(SITEPY)/stepconf
        $(FILE) ../lib/python/machinekit/*.py $(DESTDIR)$(SITEPY)/machinekit/
        $(FILE) ../lib/python/machinekit/nosetests/*.py 
$(DESTDIR)$(SITEPY)/machinekit/nosetests
        $(FILE) ../lib/python/machinekit/*.so $(DESTDIR)$(SITEPY)/machinekit/
        $(FILE) ../lib/python/machinetalk/*.py $(DESTDIR)$(SITEPY)/machinetalk/
        $(FILE) ../lib/python/machinetalk/protobuf/*.py 
$(DESTDIR)$(SITEPY)/machinetalk/protobuf/
        $(FILE) ../lib/python/fdm/*.py $(DESTDIR)$(SITEPY)/fdm
        $(FILE) ../lib/python/fdm/config/*.py $(DESTDIR)$(SITEPY)/fdm/config
        $(FILE) ../lib/python/drivers/*.py $(DESTDIR)$(SITEPY)/drivers
        $(EXE) ../bin/stepconf $(DESTDIR)$(bindir)
        $(EXE) ../bin/pncconf $(DESTDIR)$(bindir)
        $(EXE) ../bin/hal_input $(DESTDIR)$(bindir)
        $(EXE) ../bin/hal_gpio_mcp23017 $(DESTDIR)$(bindir)
        $(EXE) ../bin/hal_pwm_pca9685 $(DESTDIR)$(bindir)
        $(EXE) ../bin/hal_storage $(DESTDIR)$(bindir)
        $(EXE) ../bin/hal_temp_ads7828 $(DESTDIR)$(bindir)
        $(EXE) ../bin/hal_temp_bbb $(DESTDIR)$(bindir)
        $(EXE) ../bin/pyvcp $(DESTDIR)$(bindir)
        $(EXE) ../bin/gladevcp $(DESTDIR)$(bindir)
        $(EXE) ../bin/axis $(DESTDIR)$(bindir)
        $(EXE) ../bin/axis-remote $(DESTDIR)$(bindir)
        $(EXE) ../bin/debuglevel $(DESTDIR)$(bindir)
        $(EXE) ../bin/linuxcnctop $(DESTDIR)$(bindir)
        $(EXE) ../bin/mdi $(DESTDIR)$(bindir)
        $(EXE) ../bin/hal_manualtoolchange $(DESTDIR)$(bindir)
        $(EXE) ../bin/image-to-gcode $(DESTDIR)$(bindir)
        $(EXE) ../bin/touchy $(DESTDIR)$(bindir)
        $(EXE) ../bin/gscreen $(DESTDIR)$(bindir)
        $(EXE) ../bin/gmoccapy $(DESTDIR)$(bindir)
        $(EXE) $(patsubst %.py,../bin/%,$(VISMACH_PY)) $(DESTDIR)$(bindir)
        $(FILE) ../share/linuxcnc/machinekit-wizard.gif 
$(DESTDIR)$(prefix)/share/linuxcnc
        $(FILE) emc/usr_intf/axis/etc/axis_light_background $(DESTDIR)$(docdir)
        $(FILE) emc/usr_intf/axis/README $(DESTDIR)$(docdir)/README.axis
        $(FILE) ../share/axis/images/*.png ../share/axis/images/*.gif 
../share/axis/images/*.xbm ../share/axis/images/*.ngc 
$(DESTDIR)$(datadir)/axis/images
        $(FILE) ../share/axis/tcl/*.tcl $(DESTDIR)$(datadir)/axis/tcl
        $(FILE) ../share/gscreen/images/*.gif 
$(DESTDIR)$(datadir)/gscreen/images
        $(TREE) ../share/gscreen/skins/* $(DESTDIR)$(datadir)/gscreen/skins
        $(FILE) ../share/gmoccapy/images/*.png ../share/gmoccapy/images/*.gif 
../share/gmoccapy/images/*.svg $(DESTDIR)$(datadir)/gmoccapy/images
        $(FILE) ../share/fdm/thermistor_tables/*.txt 
$(DESTDIR)$(datadir)/fdm/thermistor_tables
        $(EXE) ../bin/configserver $(DESTDIR)$(bindir)
        $(EXE) ../bin/videoserver $(DESTDIR)$(bindir)
        $(EXE) ../bin/mkwrapper $(DESTDIR)$(bindir)
        $(EXE) ../bin/mklauncher $(DESTDIR)$(bindir)
        $(EXE) ../bin/gremlin $(DESTDIR)$(bindir)
        $(EXE) ../bin/lintini $(DESTDIR)$(bindir)
        $(EXE) ../bin/teach-in $(DESTDIR)$(bindir)
        $(EXE) ../bin/tracking-test $(DESTDIR)$(bindir)
        $(EXE) ../bin/yapps $(DESTDIR)$(bindir)
        $(EXE) ../scripts/gcode-to-ngc $(DESTDIR)$(bindir)
        $(EXE) ../scripts/g1-to-g23 $(DESTDIR)$(bindir)
        $(EXE) ../scripts/hal-graph $(DESTDIR)$(bindir)
endif

install-kernel-dep: install-dirs
        $(SETUID) ../libexec/rtapi_app_* $(DESTDIR)$(EMC2_LIBEXEC_DIR)
ifeq ($(HAVE_KERNEL_THREADS),yes)
        $(SETUID) ../libexec/linuxcnc_module_helper 
$(DESTDIR)$(EMC2_LIBEXEC_DIR)
endif
ifeq ($(BUILD_DRIVERS),yes)
        $(SETUID) ../libexec/pci_write $(DESTDIR)$(EMC2_LIBEXEC_DIR)
        $(SETUID) ../libexec/pci_read $(DESTDIR)$(EMC2_LIBEXEC_DIR)
endif
        $(EXE) ../libexec/inivar $(DESTDIR)$(EMC2_LIBEXEC_DIR)
        $(EXE) ../libexec/rtapi_msgd $(DESTDIR)$(EMC2_LIBEXEC_DIR)
        $(EXE) ../libexec/flavor $(DESTDIR)$(EMC2_LIBEXEC_DIR)
        $(FILE) ../etc/linuxcnc/rtapi.ini $(DESTDIR)$(sysconfdir)/linuxcnc

        # RTAPI modules:  install userland flavor .so modules into
        # e.g. /usr/lib/linuxcnc/modules and kthread flavor .ko
        # modules for each kver into e.g. /lib/modules/<kver>/linuxcnc
        for flavor in $(BUILD_THREAD_FLAVORS); do \
            if test $${flavor%-kernel} = $${flavor}; then \
                echo Installing modules for userland flavor $$flavor; \
                $(DIR) $(DESTDIR)$(EMC2_RTLIB_BASE_DIR)/$$flavor; \
                $(FILE) ../rtlib/$$flavor/* \
                    $(DESTDIR)$(EMC2_RTLIB_BASE_DIR)/$$flavor; \
            else \
                echo Installing modules for kthreads flavor $$flavor; \
                for srcdir in ../rtlib/$$flavor/*; do \
                    kver=`basename $$srcdir`; \
                    echo Installing modules for flavor $$flavor, kver $$kver; \
                    $(DIR) $(DESTDIR)/lib/modules/$$kver/linuxcnc; \
                    $(FILE) $$srcdir/* $(DESTDIR)/lib/modules/$$kver/linuxcnc; \
                done; \
            fi; \
        done
ifeq ($(USE_SHMDRV),yes)
        for srcdir in ../rtlib/shmdrv/*; do \
            kver=`basename $$srcdir`; \
            echo Installing shmdrv.ko module for kernel version $$kver; \
            $(DIR) $(DESTDIR)/lib/modules/$$kver/linuxcnc; \
            $(FILE) $$srcdir/* $(DESTDIR)/lib/modules/$$kver/linuxcnc; \
        done;
endif
endif # ! RUN_IN_PLACE

CONF=../configs
COMMON=$(CONF)/common
CONFILES=$(addsuffix /$(1), $(filter-out $(COMMON) $(CONF),\
                                         ${shell find ${CONF} -type d -print}))

.PHONY: configs
COPY_CONFIGS = $(patsubst %,../configs/%/core_stepper.hal, \
                sim \
                by_interface/parport/stepper \
                by_machine/sherline/Sherline3Axis \
                by_machine/sherline/SherlineLathe \
                by_machine/cooltool \
                by_interface/parport/classicladder/demo_step_cl)

COPY_CONFIGS += $(patsubst %,../configs/%/core_servo.hal, \
                sim \
                by_interface/vitalsystems \
                by_interface/servotogo \
                by_interface/vigilant)

COPY_CONFIGS += $(patsubst %,../configs/%/core_sim.hal, \
                sim)

COPY_CONFIGS += $(patsubst %,../configs/%/core_sim9.hal, \
                sim)

COPY_CONFIGS += $(patsubst %,../configs/%/axis_manualtoolchange.hal, \
                sim \
                by_interface/pluto/lathe-pluto\
                by_interface/parport/plasma-thc-sim)

show_configs_copy_stuff:
        @echo CONFILES=$(CONFILES)
        @echo CALL:$(call CONFILES,axis_manualtoolchange.hal)
        @echo CALL:$(call CONFILES,core_stepper.hal)
        @echo CALL:$(call CONFILES,core_servo.hal)
        @echo CALL:$(call CONFILES,core_sim.hal)
        @echo CALL:$(call CONFILES,core_sim9.hal)
        @echo COPY_CONFIGS=$(COPY_CONFIGS)

configs: $(COPY_CONFIGS)

$(call CONFILES,axis_manualtoolchange.hal): %/axis_manualtoolchange.hal: 
../configs/common/axis_manualtoolchange.hal
        $(Q)-cp $< $@
$(call CONFILES,core_stepper.hal): %/core_stepper.hal: 
../configs/common/core_stepper.hal
        $(Q)-cp $< $@
$(call CONFILES,core_servo.hal): %/core_servo.hal: 
../configs/common/core_servo.hal
        $(Q)-cp $< $@
$(call CONFILES,core_sim.hal): %/core_sim.hal: ../configs/common/core_sim.hal
        $(Q)-cp $< $@
$(call CONFILES,core_sim9.hal): %/core_sim9.hal: ../configs/common/core_sim9.hal
        $(Q)-cp $< $@

endif # userspace

ifneq ($(KERNELRELEASE),)
# KERNELRELEASE is non-empty, therefore we are building modules using
# the "kbuild" system.
#
INCLUDE_PREFIX = $(BASEPWD)


# When the Submakefile is included in the kbuild Makefile, the
# module's obj-m and foo-objs definitions may remain in the Submakefile
include $(BASEPWD)/hal/lib/Submakefile
include $(BASEPWD)/machinetalk/Submakefile
include $(BASEPWD)/hal/i_components/Submakefile
include $(BASEPWD)/hal/components/Submakefile
include $(BASEPWD)/hal/vtable-example/Submakefile
include $(BASEPWD)/hal/userfunct-example/Submakefile
include $(BASEPWD)/machinetalk/msgcomponents/Submakefile
include $(BASEPWD)/rtapi/Submakefile
include $(BASEPWD)/rtapi/shmdrv/Submakefile
include $(BASEPWD)/rtapi/rtapi_math/Submakefile
endif # KERNELRELEASE non-empty

# $(BASEPWD) is used here, instead of relative paths, because that's
# what kbuild seems to require

EXTRA_CFLAGS = $(RTFLAGS) \
        $(ARCH_CFLAGS) \
        -D__MODULE__ \
        -I$(INCLUDE_PREFIX) \
        -I$(INCLUDE_PREFIX)/libnml/linklist \
        -I$(INCLUDE_PREFIX)/libnml/cms \
        -I$(INCLUDE_PREFIX)/libnml/rcs \
        -I$(INCLUDE_PREFIX)/libnml/inifile \
        -I$(INCLUDE_PREFIX)/libnml/os_intf \
        -I$(INCLUDE_PREFIX)/libnml/nml \
        -I$(INCLUDE_PREFIX)/libnml/buffer \
        -I$(INCLUDE_PREFIX)/libnml/posemath \
        -I$(INCLUDE_PREFIX)/rtapi \
        -I$(INCLUDE_PREFIX)/hal/lib \
        -I$(INCLUDE_PREFIX)/emc/nml_intf \
        -I$(INCLUDE_PREFIX)/emc/kinematics \
        -I$(INCLUDE_PREFIX)/emc/motion \
        -I$(INCLUDE_PREFIX)/emc/tp \
        -I$(INCLUDE_PREFIX)/machinetalk/nanopb \
        -I$(INCLUDE_PREFIX)/machinetalk/build \
        -DSEQUENTIAL_SUPPORT -DHAL_SUPPORT -DDYNAMIC_PLCSIZE -DRT_SUPPORT \
        -DOLD_TIMERS_MONOS_SUPPORT -DMODBUS_IO_MASTER \
        $(call cc-option,-mieee-fp) \
        $(KERNEL_MATH_CFLAGS)

ifdef TARGET_PLATFORM_BEAGLEBONE
EXTRA_CFLAGS += -I$(INCLUDE_PREFIX)/hal/support/pru
endif
ifeq ($(BUILD_SYS),kbuild)
EXTRA_CFLAGS += $(call cc-option,-Wframe-larger-than=2560) $(call 
cc-option,-Wno-declaration-after-statement)
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.

# These lists would be best moved to their respective subdirectories'
# Submakefiles to make this more modular and avoid maintaining
# multiple lists of the same things.  This won't work as-is right now
# because the Submakefiles are included in a conditional block that is
# not evaluated during kernel module build.

# Subdirectory:  rtapi

# obj-$(CONFIG_RTAPI) += rtapi.o

# # Sources for all thread systems
# rtapi-objs := \
#       rtapi/instance.o \
#       rtapi/rtapi_support.o \
#       rtapi/rtapi_common.o \
#       rtapi/rtapi_task.o \
#       rtapi/rtapi_shmem.o \
#       rtapi/rtapi_ring.o \
#       rtapi/rtapi_time.o \
#       rtapi/rtapi_io.o \
#       rtapi/$(THREADS_SOURCE).o
# # Kernel threads need rtapi_module.c
# ifeq ($(BUILD_SYS),kbuild)
# rtapi-objs += rtapi/rtapi_module.o
# endif
# # User threads need rtapi_pci.c
# ifeq ($(BUILD_SYS),user-dso)
# rtapi-objs += rtapi/rtapi_pci.o
# rtapi-objs += rtapi/shmdrv/shmdrvapi.o
# # and rtapi_app_main/exit stubs
# rtapi-objs += rtapi/rtapi_main.o
# # and autodetect/compat checks
# rtapi-objs += rtapi/rtapi_compat.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_ENCODER) += encoder.o
encoder-objs := hal/components/encoder.o $(MATHSTUB)

obj-$(CONFIG_ENCODER) += encoderv2.o
encoderv2-objs := hal/components/encoderv2.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_ENCODER_RATIO) += encoder_ratiov2.o
encoder_ratiov2-objs := hal/components/encoder_ratiov2.o $(MATHSTUB)
obj-$(CONFIG_STEPGEN) += stepgen.o
stepgen-objs := hal/components/stepgen.o $(MATHSTUB)
obj-$(CONFIG_STEPGEN) += stepgenv2.o
stepgenv2-objs := hal/components/stepgenv2.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_PWMGEN) += pwmgenv2.o
pwmgenv2-objs := hal/components/pwmgenv2.o $(MATHSTUB)
obj-$(CONFIG_SIGGEN) += siggen.o
siggen-objs := hal/components/siggen.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_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/support
ifdef TARGET_PLATFORM_BEAGLEBONE
ifeq ($(BUILD_SYS),user-dso)
obj-m += hal_pru.o
hal_pru-objs := hal/components/hal_pru.o hal/support/pru/prussdrv.o 
$(LIBPTHREAD)
obj-m += hal_prudebug.o
hal_prudebug-objs := hal/components/hal_prudebug.o hal/support/pru/prussdrv.o 
$(LIBPTHREAD)
endif
endif

# Subdirectory: hal/drivers
ifeq ($(BUILD_DRIVERS),yes)
#ifeq ($(BUILD_SYS),kbuild)
obj-$(CONFIG_HAL_PARPORT) += hal_parport.o
hal_parport-objs := hal/drivers/hal_parport.o $(MATHSTUB)
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)

ifdef TARGET_PLATFORM_RASPBERRY
obj-$(CONFIG_HAL_GPIO) += hal_gpio.o
hal_gpio-objs := hal/drivers/hal_gpio.o hal/drivers/cpuinfo.o
obj-$(CONFIG_HAL_SPI) += hal_spi.o
hal_spi-objs := hal/drivers/hal_spi.o
endif

ifdef TARGET_PLATFORM_SOCFPGA
ifeq ($(BUILD_SYS),user-dso)
obj-$(CONFIG_HM2_SOC_OL) += hm2_soc_ol.o
hm2_soc_ol-objs := hal/drivers/mesa-hostmot2/hm2_soc_ol.o
endif
endif

ifdef TARGET_PLATFORM_BEAGLEBONE
ifeq ($(BUILD_SYS),user-dso)
obj-$(CONFIG_HAL_GPIO) += hal_bb_gpio.o
hal_bb_gpio-objs := hal/drivers/hal_bb_gpio.o
obj-$(CONFIG_PEPPER) += pepper.o
pepper-objs := hal/components/pepper.o $(MATHSTUB)
endif

obj-m += hal_arm335xQEP.o
hal_arm335xQEP-objs := hal/drivers/hal_arm335xQEP.o $(MATHSTUB)
endif

ifdef TARGET_PLATFORM_CHIP
obj-$(CONFIG_HAL_GPIO) += hal_chip_gpio.o
hal_chip_gpio-objs := hal/drivers/hal_chip_gpio.o hal/drivers/chip/mmap_gpio.o
endif

ifdef TARGET_PLATFORM_ZEDBOARD
obj-$(CONFIG_HAL_GPIO) += hal_zed_gpio.o
hal_zed_gpio-objs := hal/drivers/hal_zed_gpio.o
obj-$(CONFIG_HAL_CAN) += hal_zed_can.o
hal_zed_can-objs := hal/drivers/hal_zed_can.o
endif

# hal_pru_generic driver
ifdef TARGET_PLATFORM_BEAGLEBONE
ifeq ($(BUILD_SYS),user-dso)
obj-m += hal_pru_generic.o
hal_pru_generic-objs :=                           \
    hal/drivers/hal_pru_generic/hal_pru_generic.o \
    hal/drivers/hal_pru_generic/pwmgen.o          \
    hal/drivers/hal_pru_generic/stepgen.o         \
    hal/drivers/hal_pru_generic/encoder.o         \
    hal/support/pru/prussdrv.o                    \
    $(LIBPTHREAD)
endif
endif

# these won't compile as-is with userland threading

ifneq ($(BUILD_SYS),user-dso)
obj-$(CONFIG_HAL_M5I20) += hal_m5i20.o
hal_m5i20-objs := hal/drivers/hal_m5i20.o $(MATHSTUB)
obj-$(CONFIG_HAL_PPMC) += hal_ppmc.o
hal_ppmc-objs := hal/drivers/hal_ppmc.o $(MATHSTUB)
obj-$(CONFIG_OPTO_AC5) += opto_ac5.o
opto_ac5-objs := hal/drivers/opto_ac5.o $(MATHSTUB)
obj-$(CONFIG_HAL_GM) += hal_gm.o
hal_gm-objs := hal/drivers/hal_gm.o $(MATHSTUB)
endif

# Gnu make 'expression' syntax is pathetic. What were these guys smoking?
# turn on by default
BUILD_HOSTMOT2=yes
ifeq ($(USERMODE_PCI),yes)
# reconfirm our intent..
BUILD_HOSTMOT2=yes
else
#except if userland and USERMODE_PCI isnt set
ifeq ($(BUILD_SYS),user-dso)
BUILD_HOSTMOT2=no
endif
endif

ifeq ($(BUILD_HOSTMOT2),yes)
obj-$(CONFIG_HOSTMOT2) += hostmot2.o hm2_7i43.o hm2_7i90.o hm2_pci.o hm2_test.o
ifeq ($(BUILD_SYS),user-dso)
obj-$(CONFIG_HOSTMOT2) += hm2_eth.o
hm2_eth-objs  :=                          \
    hal/drivers/mesa-hostmot2/hm2_eth.o   \
    $(MATHSTUB)
endif
#obj-$(CONFIG_HOSTMOT2) += hostmot2.o hm2_pci.o hm2_7i43.o
hostmot2-objs +=                          \
    hal/drivers/mesa-hostmot2/hostmot2.o  \
    hal/drivers/mesa-hostmot2/backported-strings.o  \
    hal/drivers/mesa-hostmot2/ioport.o    \
    hal/drivers/mesa-hostmot2/encoder.o   \
    hal/drivers/mesa-hostmot2/abs_encoder.o\
        hal/drivers/mesa-hostmot2/resolver.o  \
    hal/drivers/mesa-hostmot2/pwmgen.o    \
    hal/drivers/mesa-hostmot2/tp_pwmgen.o \
        hal/drivers/mesa-hostmot2/sserial.o   \
    hal/drivers/mesa-hostmot2/stepgen.o   \
    hal/drivers/mesa-hostmot2/bspi.o  \
    hal/drivers/mesa-hostmot2/uart.o  \
    hal/drivers/mesa-hostmot2/pktuart.o  \
    hal/drivers/mesa-hostmot2/watchdog.o  \
    hal/drivers/mesa-hostmot2/pins.o      \
    hal/drivers/mesa-hostmot2/dpll.o  \
    hal/drivers/mesa-hostmot2/irq.o  \
    hal/drivers/mesa-hostmot2/led.o       \
    hal/drivers/mesa-hostmot2/fwid.o      \
    hal/drivers/mesa-hostmot2/tram.o      \
    hal/drivers/mesa-hostmot2/raw.o       \
    hal/drivers/mesa-hostmot2/bitfile.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_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)
endif

ifeq ($(BUILD_HOSTMOT2),yes)
obj-$(CONFIG_HOSTMOT2) += hm2_pci.o
hm2_pci-objs  :=                          \
    hal/drivers/mesa-hostmot2/hm2_pci.o   \
    hal/drivers/mesa-hostmot2/bitfile.o   \
    $(MATHSTUB)
endif

obj-$(CONFIG_PROBE_PARPORT) += probe_parport.o
probe_parport-objs := hal/drivers/probe_parport.o $(MATHSTUB)
endif

obj-$(CONFIG_CLASSICLADDER_RT) += classicladder_rt.o
classicladder_rt-objs := hal/classicladder/module_hal.o $(MATHSTUB)
classicladder_rt-objs += hal/classicladder/arithm_eval.o
classicladder_rt-objs += hal/classicladder/arrays.o
classicladder_rt-objs += hal/classicladder/calc.o
classicladder_rt-objs += hal/classicladder/calc_sequential.o
classicladder_rt-objs += hal/classicladder/manager.o
classicladder_rt-objs += hal/classicladder/symbols.o
classicladder_rt-objs += hal/classicladder/vars_access.o

ifdef SEQUENTIAL_SUPPORT
classicladder_rt-objs += hal/classicladder/calc_sequential_rt.o
endif

obj-m += scope_rt.o
scope_rt-objs := hal/utils/scope_rt.o $(MATHSTUB)


obj-m += trivkins.o
trivkins-objs := emc/kinematics/trivkins.o

obj-m += trivkinstest.o
trivkinstest-objs := emc/kinematics/trivkinstest.o

obj-m += XYZACkins.o
XYZACkins-objs := emc/kinematics/XYZACkins.o

obj-m += 5axiskins.o
5axiskins-objs := emc/kinematics/5axiskins.o

obj-m += maxkins.o
maxkins-objs := emc/kinematics/maxkins.o

obj-m += gantrykins.o
gantrykins-objs := emc/kinematics/gantrykins.o

obj-m += rotatekins.o
rotatekins-objs := emc/kinematics/rotatekins.o

obj-m += tripodkins.o
tripodkins-objs := emc/kinematics/tripodkins.o

obj-m += lineardeltakins.o
lineardeltakins-objs := emc/kinematics/lineardeltakins.o

obj-m += genhexkins.o
genhexkins-objs := emc/kinematics/genhexkins.o
genhexkins-objs += libnml/posemath/_posemath.o
genhexkins-objs += libnml/posemath/sincos.o $(MATHSTUB)

obj-m += genserkins.o
genserkins-objs := emc/kinematics/genserkins.o
genserkins-objs += libnml/posemath/gomath.o
genserkins-objs += libnml/posemath/sincos.o $(MATHSTUB)

obj-m += drawbotkins.o
drawbotkins-objs := emc/kinematics/drawbotkins.o
drawbotkins-objs += libnml/posemath/gomath.o
drawbotkins-objs += libnml/posemath/sincos.o $(MATHSTUB)

obj-m += pumakins.o
pumakins-objs := emc/kinematics/pumakins.o
pumakins-objs += libnml/posemath/_posemath.o
pumakins-objs += libnml/posemath/sincos.o $(MATHSTUB)

obj-m += scarakins.o
scarakins-objs := emc/kinematics/scarakins.o
scarakins-objs += libnml/posemath/_posemath.o
scarakins-objs += libnml/posemath/sincos.o $(MATHSTUB)

obj-$(CONFIG_MOTMOD) += motmod.o
motmod-objs := emc/kinematics/cubic.o
motmod-objs += emc/motion/motion.o
motmod-objs += emc/motion/command.o
motmod-objs += emc/motion/control.o
motmod-objs += emc/motion/homing.o
motmod-objs += emc/motion/emcmotglb.o
motmod-objs += emc/motion/emcmotutil.o
motmod-objs += emc/motion/stashf.o
motmod-objs += emc/motion/dbuf.o
motmod-objs += libnml/posemath/_posemath.o
motmod-objs += libnml/posemath/sincos.o $(MATHSTUB)

# obj-m += vtexport.o
# vtexport-objs := hal/vtable-example/vtexport.o
# vtexport-objs += hal/vtable-example/vcode.o

obj-m += jplan.o
jplan-objs := hal/jplanner/jplan.o

obj-m += interpolate.o
interpolate-objs := hal/interpolator/interpolate.o

obj-m += icomp.o
icomp-objs := hal/icomp-example/icomp.o

# clashes with component in i_components
obj-m += lutn-demo.o
lutn-demo-objs := hal/icomp-example/lutn-demo.o

obj-m += ufdemo.o
ufdemo-objs := hal/userfunct-example/ufdemo.o

obj-m += tp.o
tp-objs := $(addprefix emc/tp/, \
        tc.o            \
        tcq.o           \
        tp.o            \
        tpmain.o        \
        blendmath.o     \
        spherical_arc.o         \
        )               \
        emc/nml_intf/emcpose.o \
        libnml/posemath/_posemath.o \
        libnml/posemath/sincos.o $(MATHSTUB)


TORTOBJS = $(foreach file,$($(patsubst %.o,%,$(1))-objs), $(OBJDIR)/$(file))


# USER_DSO module building
# (don't build when 'BUILD_ALL_FLAVORS' or 'BUILD_THREADS_MODULES' are set;
# these are intermediate make runs)
ifeq ($(BUILD_SYS)+$(BUILD_THREAD_MODULES),user-dso+yes)
EXTRA_CFLAGS += -fPIC

RTOBJS := $(sort $(foreach mod,$(obj-m),$(call TORTOBJS,$(mod))))

RTDEPS := $(sort $(patsubst $(OBJDIR)/%.o,$(DEPDIR)/%.d, $(RTOBJS)))

# this arcane step warrants some explanation.

# this is about linking userland RT modules to be loaded by rtapi_app
# Those modules are supposed to behave the same as kernel RT modules as far as
# symbol visibility goes. Other than in plain C, in-kernel symbol
# export is explicitly controlled by the EXPORT_SYMBOL(sym) macro.
# only variables and functions tagged such will be visible to the rest of the 
kernel
# and other modules.
# See 
http://stackoverflow.com/questions/9836467/whats-meaning-of-export-symbol-in-linux-kernel-code
# for an explanation and use.
#
# userland RT modules need to follow the same visibility rules as kernel modules
# to prevent accidential spillover of symbols between components (which does 
not happen
# in kernel space).
#
# The kernel behavior of EXPORT_SYMBOL is emulated as follows:
# rtapi_export.h defines
# #define EXPORT_SYMBOL(x) __attribute__((section(".rtapi_export"))) \
#    char rtapi_exported_##x[] = #x;
#
# This means any symbol 'foo' exported as EXPORT_SYMBOL(foo) will:
# - have a variable defined which looks like so:
#   char rtapi_exported_foo = "foo";
# - have put this variable put in the .rtapi_export section of the object file.
#   (see http://wiki.osdev.org/ELF_Tutorial#The_String_Table)
# - this string table is different from the default string table named .srtab.
#
# Hence, the .rtapi_export section of a RT module is a pure string table; no 
other
# variables live there. The strings in this table is the set of symbols 
exported by
# this module.
#
# Now, during linking, all symbols which are NOT in this set need to be removed.
#
# to do so, first the .rtapi_export section (the string table) is extracted and 
stored
# in a file - one can reproduce with:
#
# objcopy -j .rtapi_export -O binary objects/posix/hal_lib.tmp /dev/stdout | 
strings
# rtapi_info_author
# rtapi_info_description
# rtapi_info_license
# rtapi_app_main
# rtapi_app_exit
# hal_init
# hal_xinit
# hal_xinitf
# hal_ready
# ....
#
# In the second objcopy step, all symbols not in this set are removed. This is 
done
# by determining the list of symbols to be kept, and generating a list of lines 
like
# -G <symbol>
# which is the objcopy option for removing all other symbols not in this list:
# -G symbolname
# --keep-global-symbol=symbolname
#   Keep only symbol symbolname global.  Make all other symbols local to the 
file, so that they are not
#   visible externally.  This option may be given more than once.
# This objcopy step is in-place, i.e. overwriting the .tmp file.
#
# The final linking step uses the -Bsymbolic flag - what this does is:
#
# This element's presence in a shared object library alters the dynamic 
linker's symbol resolution
# algorithm for references within the library. Instead of starting a symbol 
search with the
# executable file, the dynamic linker starts from the shared object itself. If 
the shared object
# fails to supply the referenced symbol, the dynamic linker then searches the 
executable
# file and other shared objects as usual.
# (from https://www.technovelty.org/c/what-exactly-does-bsymblic-do.html)
#
# this is important for symbol resolution when the .so is loaded within 
rtapi_app:
# it means that symbols referenced are resolved within the object first, 
instead of looking
# at any symbols exported (maybe by accident) by rtap_app proper.
#
modules: $(patsubst %.o,$(RTLIBDIR)/%.so,$(obj-m))
$(RTLIBDIR)/%.so:
        $(ECHO) Linking $@
        @mkdir -p $(dir $@)
        @# link all objects files into a single .so
        $(Q)$(LD) -d -r -o $(OBJDIR)/$*.tmp $^
        @# use the .rtapi_export string table to generate a ld version script
        @# explicitly defining the EXPORT_SYMBOL syms as global, and everything 
else as local:
        $(Q)$(OBJCOPY) -j .rtapi_export -O binary $(OBJDIR)/$*.tmp 
$(OBJDIR)/$*.exported
        $(Q)(echo '{ global : ';  tr -s '\0' <$(OBJDIR)/$*.exported | xargs -r0 
printf '%s;\n' | grep .; echo 'local : * ; };') > $(OBJDIR)/$*.ver
        @# link the final object using this version script:
        $(Q)$(CC) -shared -Bsymbolic $(LDFLAGS) 
-Wl,--version-script,$(OBJDIR)/$*.ver -o $@ $^ $(EXTRA_LDFLAGS)

$(sort $(RTDEPS)): $(DEPDIR)/%.d: %.c
        @mkdir -p $(dir $@)
        $(ECHO) Depending $<
        $(Q)$(call DEP,$(CC),$@ \
                $(patsubst depends/%.d,objects/%.o,$@),$@,$(OPT) \
                $(DEBUG) $(CPPFLAGS) $(EXTRA_CFLAGS) $<)

# Rules to make .o (object) files
$(sort $(RTOBJS)) : $(OBJDIR)/%.o : %.c $(DEPDIR)/%.d
        $(ECHO) Compiling realtime $<
        @rm -f $@
        @mkdir -p $(dir $@)
        $(Q)$(CC) -c $(OPT) $(DEBUG) $(EXTRA_CFLAGS) $< -o $@

# Rules to make .o (object) files from .cc
$(sort $(CXXRTOBJS)) : $(OBJDIR)/%.o : %.cc $(DEPDIR)/%.d
        $(ECHO) Compiling realtime++ $<
        @rm -f $@
        @mkdir -p $(dir $@)
        $(Q)$(CXX) -c $(OPT) $(DEBUG) $(RT_CXXFLAGS) $(EXTRA_CFLAGS) $< -o $@

endif # end BUILD_SYS=user-dso

# # ------ not used anymore -------------
# ifeq ($(BUILD_SYS),normal)
# modules: $(patsubst %,$(RTLIBDIR)/%,$(obj-m))
# RTOBJS := $(sort $(foreach mod,$(obj-m),$(call TORTOBJS,$(mod))))
# RTDEPS := $(sort $(patsubst objects/%.o,depends/%.d, $(RTOBJS)))

# $(sort $(RTDEPS)): $(DEPDIR)/%.d: %.c
#       @mkdir -p $(dir $@)
#       $(ECHO) Depending $<
#       $(Q)$(call DEP,$(CC),$@ $(patsubst 
depends/%.d,objects/%.o,$@),$@,$(EXTRA_CFLAGS) $<)


# # Rules to make .o (object) files
# $(sort $(RTOBJS)) : $(OBJDIR)/%.o : %.c
#       $(ECHO) Compiling realtime $<
#       @mkdir -p $(dir $@)
#       $(Q)$(CC) -c -DRTAPI -nostdinc -isystem $(shell $(CC) 
-print-file-name=include) -I$(KERNELDIR)/include $(EXTRA_CFLAGS) $< -o $@

# $(RTLIBDIR)/%.o:
#       $(ECHO) Linking $@
#       $(Q)ld -r -static -S  $(LDFLAGS) -o $@ $^ $(EXTRALINK)
# endif # end 'normal'

# build kernel RTAPI modules
ifneq "$(filter normal user-dso,$(BUILD_SYS))" ""
#$(RTLIBDIR)/instance$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(instance-objs))
#$(RTLIBDIR)/rtapi$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(rtapi-objs))
$(RTLIBDIR)/classicladder_rt$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(classicladder_rt-objs))
$(RTLIBDIR)/boss_plc$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(boss_plc-objs))
$(RTLIBDIR)/encoder$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(encoder-objs))
$(RTLIBDIR)/encoderv2$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(encoderv2-objs))
$(RTLIBDIR)/counter$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(counter-objs))
$(RTLIBDIR)/encoder_ratio$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(encoder_ratio-objs))
$(RTLIBDIR)/encoder_ratiov2$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(encoder_ratiov2-objs))
$(RTLIBDIR)/stepgen$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(stepgen-objs))
$(RTLIBDIR)/stepgenv2$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(stepgenv2-objs))
$(RTLIBDIR)/lcd$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(lcd-objs))
$(RTLIBDIR)/matrix_kb$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(matrix_kb-objs))
$(RTLIBDIR)/mux_generic$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(mux_generic-objs))
$(RTLIBDIR)/freqgen$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(freqgen-objs))
$(RTLIBDIR)/pwmgen$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(pwmgen-objs))
$(RTLIBDIR)/pwmgenv2$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(pwmgenv2-objs))
$(RTLIBDIR)/siggen$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(siggen-objs))
$(RTLIBDIR)/at_pid$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(at_pid-objs))
$(RTLIBDIR)/threads$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(threads-objs))
$(RTLIBDIR)/supply$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(supply-objs))
$(RTLIBDIR)/sim_encoder$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(sim_encoder-objs))
$(RTLIBDIR)/watchdog$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(watchdog-objs))
$(RTLIBDIR)/modmath$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(modmath-objs))
$(RTLIBDIR)/streamer$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(streamer-objs))
$(RTLIBDIR)/sampler$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(sampler-objs))
$(RTLIBDIR)/hal_parport$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(hal_parport-objs))
$(RTLIBDIR)/probe_parport$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(probe_parport-objs))


ifeq ($(BUILD_SYS),user-dso)
$(RTLIBDIR)/probe_parport$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(probe_parport-objs))
endif

ifeq ($(USERMODE_PCI),yes)
$(RTLIBDIR)/hostmot2$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hostmot2-objs))
$(RTLIBDIR)/hm2_7i43$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hm2_7i43-objs))
$(RTLIBDIR)/hm2_7i90$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hm2_7i90-objs))
$(RTLIBDIR)/hm2_pci$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hm2_pci-objs))
ifeq ($(BUILD_SYS),user-dso)
$(RTLIBDIR)/hm2_eth$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hm2_eth-objs))
endif
$(RTLIBDIR)/hm2_test$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hm2_test-objs))
endif

ifdef TARGET_PLATFORM_SOCFPGA
ifeq ($(BUILD_SYS),user-dso)
$(RTLIBDIR)/hostmot2$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hostmot2-objs))
$(RTLIBDIR)/hm2_soc_ol$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hm2_soc_ol-objs))
endif
endif

ifdef TARGET_PLATFORM_BEAGLEBONE
ifeq ($(BUILD_SYS),user-dso)
$(RTLIBDIR)/hal_pru$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hal_pru-objs))
$(RTLIBDIR)/hal_pru_generic$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(hal_pru_generic-objs))
$(RTLIBDIR)/hal_prudebug$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(hal_prudebug-objs))
$(RTLIBDIR)/hal_gpio$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hal_gpio-objs))
$(RTLIBDIR)/hal_bb_gpio$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(hal_bb_gpio-objs))
$(RTLIBDIR)/pepper$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(pepper-objs))
$(RTLIBDIR)/hal_arm335xQEP$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(hal_arm335xQEP-objs))
endif
endif

ifdef TARGET_PLATFORM_CHIP
$(RTLIBDIR)/hal_chip_gpio$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(hal_chip_gpio-objs))
endif

ifdef TARGET_PLATFORM_RASPBERRY
$(RTLIBDIR)/hal_gpio$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hal_gpio-objs))
$(RTLIBDIR)/hal_spi$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hal_spi-objs))
endif

ifdef TARGET_PLATFORM_ZEDBOARD
$(RTLIBDIR)/hal_zed_gpio$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(hal_zed_gpio-objs))
$(RTLIBDIR)/hal_zed_can$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(hal_zed_can-objs))
endif

$(RTLIBDIR)/pci_8255$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(pci_8255-objs))
$(RTLIBDIR)/hal_tiro$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hal_tiro-objs))
$(RTLIBDIR)/hal_stg$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hal_stg-objs))
$(RTLIBDIR)/hal_vti$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hal_vti-objs))
#$(RTLIBDIR)/hal_evoreg$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hal_evoreg-objs))
$(RTLIBDIR)/hal_motenc$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hal_motenc-objs))
$(RTLIBDIR)/hal_ax5214h$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(hal_ax5214h-objs))
$(RTLIBDIR)/hal_ppmc$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hal_ppmc-objs))
$(RTLIBDIR)/hal_skeleton$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(hal_skeleton-objs))
$(RTLIBDIR)/hal_speaker$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(hal_speaker-objs))
$(RTLIBDIR)/opto_ac5$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(opto_ac5-objs))
$(RTLIBDIR)/scope_rt$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(scope_rt-objs))
$(RTLIBDIR)/motmod$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(motmod-objs))
$(RTLIBDIR)/trivkins$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(trivkins-objs))
$(RTLIBDIR)/trivkinstest$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(trivkinstest-objs))
$(RTLIBDIR)/XYZACkins$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(XYZACkins-objs))
$(RTLIBDIR)/5axiskins$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(5axiskins-objs))
$(RTLIBDIR)/maxkins$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(maxkins-objs))
$(RTLIBDIR)/gantrykins$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(gantrykins-objs))
$(RTLIBDIR)/rotatekins$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(rotatekins-objs))
$(RTLIBDIR)/tripodkins$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(tripodkins-objs))
$(RTLIBDIR)/lineardeltakins$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(lineardeltakins-objs))
$(RTLIBDIR)/genhexkins$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(genhexkins-objs))
$(RTLIBDIR)/genserkins$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(genserkins-objs))
$(RTLIBDIR)/drawbotkins$(MODULE_EXT): $(addprefix 
$(OBJDIR)/,$(drawbotkins-objs))
$(RTLIBDIR)/pumakins$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(pumakins-objs))
$(RTLIBDIR)/scarakins$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(scarakins-objs))
$(RTLIBDIR)/hal_gm$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(hal_gm-objs))

$(RTLIBDIR)/tp$(MODULE_EXT): $(addprefix $(OBJDIR)/,$(tp-objs))
$(RTLIBDIR)/ufdemo$(MODULE_EXT):        $(addprefix $(OBJDIR)/,$(ufdemo-objs))
$(RTLIBDIR)/jplan$(MODULE_EXT):         $(addprefix $(OBJDIR)/,$(jplan-objs))
$(RTLIBDIR)/interpolate$(MODULE_EXT):   $(addprefix 
$(OBJDIR)/,$(interpolate-objs))
$(RTLIBDIR)/icomp$(MODULE_EXT):         $(addprefix $(OBJDIR)/,$(icomp-objs))
$(RTLIBDIR)/lutn-demo$(MODULE_EXT):     $(addprefix 
$(OBJDIR)/,$(lutn-demo-objs))


ifeq ($(TRIVIAL_BUILD),no)
READ_RTDEPS = $(wildcard $(RTDEPS))
$(shell echo 1>&2 Reading $(words $(READ_RTDEPS))/$(words $(RTDEPS)) realtime 
dependency files)
-include $(READ_RTDEPS)
$(shell echo 1>&2 Done reading realtime dependencies)
endif
endif  # build kernel RTAPI modules

# Phony so that it is always rebuilt when requested, not because it
# shouldn't exist as a file
.PHONY: tags

# dont create tags from these directories
NOTAGSIN := \
        depends \
        objects \
        machinetalk/build \
        machinetalk/nanopb

CTAGOPTS := $(addprefix --exclude=,$(NOTAGSIN))
ETAGOPTS := $(CTAGOPTS)
FINDOPTS :=  -not \( $(patsubst %,-path ./% -prune -o,$(NOTAGSIN)) -type d \)

tags:
        ctags-exuberant --extra=+fq \
                $(CTAGOPTS) \
                '--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]' $(FINDOPTS) | xargs  etags -l c --append
        find . -type f -name '*.cc'  $(FINDOPTS) | xargs  etags -l c++ --append
        find . -type f -name '*.hh'  $(FINDOPTS) | xargs  etags -l c++ --append
        find . -type f -name '*.proto'  $(FINDOPTS) | xargs  etags -l c++ 
--append

# etags from exuberant-ctags package
etags:
        etags --extra=+fq \
                $(ETAGOPTS) \
                '--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]' $(FINDOPTS) |xargs etags 
--language-force=C --append
        find . -type f -name '*.cc'  $(FINDOPTS) |xargs etags 
--language-force=C++ --append
        find . -type f -name '*.hh'  $(FINDOPTS) |xargs etags 
--language-force=C++ --append
        find . -type f -name '*.proto'  $(FINDOPTS) |xargs etags 
--language-force=C++ --append

# emacs etags; does not support tcl
eetags:
        @rm -f TAGS
        @find .  $(FINDOPTS) -type f -name '*.[ch]'  |xargs etags --language=c  
 --append
        @find .  $(FINDOPTS) -type f -name '*.cc'    |xargs etags 
--language=c++ --append
        @find .  $(FINDOPTS) -type f -name '*.hh'    |xargs etags 
--language=c++ --append
        @find .  $(FINDOPTS) -type f -name '*.proto' |xargs etags 
--language=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

# 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

cscope/man/:
        bash -c 'for f in `find ./ -name "cscope.*out"`;do rm $$f;done'

NOSETESTS := $(wildcard ../nosetests/*.py)
nosetest:
        $(foreach var,$(NOSETESTS),nosetests -v $(var);)

Reply via email to