This separates out the rules for %.d files from the rules that create the related target file (%.o etc). Doing this can reduce the amount of work to be done when rebuilding applications after making source changes. For files in O.Common which can be built by any target architecture this can solve problems when parallel builds (-j) are used.
412 lines
13 KiB
Plaintext
412 lines
13 KiB
Plaintext
#*************************************************************************
|
|
# Copyright (c) 2011 UChicago Argonne LLC, as Operator of Argonne
|
|
# National Laboratory.
|
|
# Copyright (c) 2002 The Regents of the University of California, as
|
|
# Operator of Los Alamos National Laboratory.
|
|
# EPICS BASE is distributed subject to a Software License Agreement found
|
|
# in file LICENSE that is included with this distribution.
|
|
#*************************************************************************
|
|
#RULES.Db
|
|
|
|
##################################################### vpath
|
|
|
|
vpath %.dbd $(USR_VPATH) $(GENERIC_SRC_DIRS) $(dir $(DBD))
|
|
vpath %.db $(USR_VPATH) $(GENERIC_SRC_DIRS) $(dir $(DB))
|
|
vpath %.vdb $(USR_VPATH) $(GENERIC_SRC_DIRS) $(dir $(DB))
|
|
vpath %.substitutions $(USR_VPATH) $(GENERIC_SRC_DIRS) $(COMMON_DIR)
|
|
vpath %.template $(USR_VPATH) $(GENERIC_SRC_DIRS) $(COMMON_DIR)
|
|
vpath bpt%.data $(USR_VPATH) $(GENERIC_SRC_DIRS) $(COMMON_DIR)
|
|
vpath %.acf $(USR_VPATH) $(GENERIC_SRC_DIRS) $(COMMON_DIR)
|
|
vpath %.acs $(USR_VPATH) $(GENERIC_SRC_DIRS) $(COMMON_DIR)
|
|
|
|
##################################################### dbdflags
|
|
|
|
# dbExpand
|
|
INSTALL_DBDFLAGS += -I $(INSTALL_DBD)
|
|
INSTALL_DBFLAGS += -I $(INSTALL_DB)
|
|
DBDFLAGS = $(USR_DBDFLAGS) $(addprefix -I,. .. $(COMMON_DIR) $(SRC_DIRS)) $(INSTALL_DBDFLAGS) $(RELEASE_DBDFLAGS)
|
|
DBFLAGS = $($*_DBFLAGS) $(USR_DBFLAGS) -I. -I.. -I$(COMMON_DIR) $(INSTALL_DBFLAGS) $(RELEASE_DBFLAGS)
|
|
|
|
#####################################################
|
|
# To allow os specific dbd files AND have the -j option work properly,
|
|
# add the following lines to your ioc application Makefile
|
|
#
|
|
# # These lines may be committed to RULES.Db for a future base release.
|
|
# CROSS_TARGET_OS_TYPES = $(sort $(foreach target, \
|
|
# $(CROSS_COMPILER_TARGET_ARCHS),$(firstword $(subst -, ,$(target)))))
|
|
# DBD += $(foreach type, $(CROSS_TARGET_OS_TYPES), $(DBD_$(type)))
|
|
#
|
|
# and then add something like the following os specific lines
|
|
#
|
|
# DBD_vxWorks += abcVx.dbd
|
|
# DBD_RTEMS += abcRTEMS.dbd
|
|
# DBD_solaris += abcSolaris.dbd
|
|
#
|
|
##################################################### Targets
|
|
|
|
# Following line added for backward compatibilty
|
|
DBD += $(DBDNAME)
|
|
|
|
DBDINC_NAME = $(patsubst %.h,%,$(patsubst %.dbd,%,$(DBDINC)))
|
|
DBD += $(addsuffix .dbd,$(DBDINC_NAME))
|
|
INC += $(addsuffix .h,$(DBDINC_NAME))
|
|
|
|
INSTALL_DBDS += $(addprefix $(INSTALL_DBD)/,$(notdir $(DBD)))
|
|
|
|
COMMON_DBDS += $(filter $(COMMON_DIR)/%, $(foreach file, $(DBD), \
|
|
$(firstword $(SOURCE_DBD) $(COMMON_DIR)/$(file) ) ) )
|
|
SOURCE_DBD = $(wildcard $(file) $(SOURCE_DBD_bbb) )
|
|
SOURCE_DBD_bbb = $(foreach dir, $(GENERIC_SRC_DIRS), $(SOURCE_DBD_aaa) )
|
|
SOURCE_DBD_aaa = $(addsuffix /$(file), $(dir) )
|
|
|
|
INSTALL_DBS += $(addprefix $(INSTALL_DB)/,$(notdir $(DB)))
|
|
|
|
COMMON_DBS += $(filter $(COMMON_DIR)/%, $(foreach file, $(DB), \
|
|
$(firstword $(SOURCE_DB) $(COMMON_DIR)/$(file) ) ) )
|
|
SOURCE_DB = $(wildcard $(file) $(SOURCE_DB_bbb) )
|
|
SOURCE_DB_bbb = $(foreach dir, $(GENERIC_SRC_DIRS), $(SOURCE_DB_aaa) )
|
|
SOURCE_DB_aaa = $(addsuffix /$(file), $(dir) )
|
|
|
|
COMMONS = $(COMMON_DIR)/*.dbd $(COMMON_DIR)/*.db $(COMMON_DIR)/*.h \
|
|
$(COMMON_DIR)/*.substitutions $(COMMON_DIR)/*.template
|
|
|
|
# Remove trailing numbers (to 99) on stem
|
|
TEMPLATE1=$(patsubst %0,%,$(patsubst %1,%,$(patsubst %2,%,$(patsubst %3,%,$(patsubst %4,%, \
|
|
$(patsubst %5,%,$(patsubst %6,%,$(patsubst %7,%,$(patsubst %8,%,$(patsubst %9,%, \
|
|
$*))))))))))
|
|
TEMPLATE2=$(patsubst %0,%,$(patsubst %1,%,$(patsubst %2,%,$(patsubst %3,%,$(patsubst %4,%, \
|
|
$(patsubst %5,%,$(patsubst %6,%,$(patsubst %7,%,$(patsubst %8,%,$(patsubst %9,%, \
|
|
$(TEMPLATE1)))))))))))
|
|
TEMPLATE3=$(addsuffix .template,$(addprefix ../,$(TEMPLATE2)))
|
|
TEMPLATE_FILENAME=$(firstword $(wildcard $($*_TEMPLATE) $(addprefix ../,$($*_TEMPLATE)) ../$*.template $(TEMPLATE3) ../template))
|
|
|
|
# dbst based database optimization
|
|
ifeq '$(DB_OPT)' 'YES'
|
|
RAW=.raw
|
|
DBS = $(filter %.db,$(DB)) $(addsuffix $(RAW),$(filter %.db,$(DB)))
|
|
COMMON_DBS = $(addprefix $(COMMON_DIR)/,$(DBS))
|
|
endif
|
|
|
|
INSTALL_DB_INSTALLS = $(addprefix $(INSTALL_DB)/,$(notdir $(DB_INSTALLS)))
|
|
INSTALL_DBD_INSTALLS = $(addprefix $(INSTALL_DBD)/,$(notdir $(DBD_INSTALLS)))
|
|
|
|
COMMONDEP_TARGET = $(COMMON_DIR)/$(basename $@)
|
|
|
|
##################################################### acf files
|
|
# An access security configuration file, *.acf, can be created from
|
|
# an *.acs file (has format of acf file plus #include "filename" lines)
|
|
|
|
# flags for GNU compiler
|
|
ACF_CPPFLAGS_YES = -undef -nostdinc
|
|
ACF_CPPFLAGS = $(ACF_CPPFLAGS_$(GNU))
|
|
|
|
ACF_INCLUDES = -I. $(TARGET_INCLUDES) $(USR_INCLUDES)\
|
|
$(SRC_INCLUDES) -I$(INSTALL_DB)
|
|
ACFDEPENDS_CMD = $(MKMF) -m $@ $(subst -I,,$(ACF_INCLUDES)) $(COMMONDEP_TARGET) $<
|
|
ACF_CMD = $(CPP) $(ACF_CPPFLAGS) $(ACF_INCLUDES) $< > $@
|
|
|
|
##################################################### dependancies
|
|
|
|
HINC += $(addsuffix .h,$(DBDINC_NAME))
|
|
COMMON_DBDINC += $(addprefix $(COMMON_DIR)/,$(HINC))
|
|
|
|
DBDDEPENDS_FILES += $(addsuffix $(DEP),$(HINC) \
|
|
$(patsubst $(COMMON_DIR)/%,%,$(COMMON_DBS)) \
|
|
$(patsubst $(COMMON_DIR)/%,%, \
|
|
$(filter-out $(COMMON_DIR)/bpt%.dbd,$(COMMON_DBDS))))
|
|
|
|
MAKEDBDEPENDS = $(PERL) $(TOOLS)/makeDbDepends.pl
|
|
|
|
#####################################################
|
|
|
|
ifndef T_A
|
|
|
|
ECHO := $(if $(findstring s,$(MAKEFLAGS)),$(COMMENT),@echo)
|
|
COMMON_DIR = .
|
|
INSTALL_DBDS =
|
|
INSTALL_DBS =
|
|
COMMON_DBDS = $(DBD)
|
|
COMMON_DBS = $(DB)
|
|
COMMONS = $(DBD) $(DB)
|
|
|
|
ACTIONS = inc
|
|
ACTIONS += build
|
|
ACTIONS += install
|
|
ACTIONS += buildInstall
|
|
ACTIONS += browse
|
|
ACTIONS += runtests
|
|
|
|
actionArchTargets = $(foreach x, $(ACTIONS),\ $(foreach arch,$(BUILD_ARCHS), $(x)$(DIVIDER)$(arch)))
|
|
|
|
cleanArchTargets = $(foreach arch,$(BUILD_ARCHS), clean$(DIVIDER)$(arch))
|
|
-include $(TOP)/configure/CONFIG_APP_INCLUDE
|
|
|
|
all: install
|
|
|
|
install: buildInstall
|
|
|
|
buildInstall : build
|
|
|
|
rebuild: clean install
|
|
|
|
.PHONY: all inc build install clean rebuild buildInstall
|
|
|
|
$(actionArchTargets) $(BUILD_ARCHS):install
|
|
$(cleanArchTargets):clean
|
|
|
|
.PHONY: $(BUILD_ARCHS) $(actionArchTargets) $(cleanArchTargets)
|
|
|
|
endif # T_A defined
|
|
|
|
ifneq (,$(strip $(DBDDEPENDS_FILES)))
|
|
-include $(DBDDEPENDS_FILES)
|
|
endif
|
|
|
|
##################################################### build dependancies, clean rule
|
|
|
|
inc : $(COMMON_INC) $(INSTALL_INC)
|
|
|
|
build : $(COMMON_DBDS) $(COMMON_DBS) \
|
|
$(INSTALL_DBDS) $(INSTALL_DBS) \
|
|
$(DBDDEPENDS_FILES) $(TARGETS) \
|
|
$(INSTALL_DB_INSTALLS) $(INSTALL_DBD_INSTALLS)
|
|
|
|
clean: db_clean
|
|
|
|
db_clean :
|
|
@$(RM) $(COMMONS) $(DBDDEPENDS_FILES)
|
|
@$(RM) *_registerRecordDeviceDriver.cpp
|
|
@$(RM) $(TARGETS)
|
|
|
|
.PHONY : db_clean
|
|
|
|
realclean: clean
|
|
|
|
##################################################### Dependency files
|
|
|
|
%Record.h$(DEP): $(COMMON_DIR)/%Record.dbd
|
|
@$(RM) $@
|
|
@$(DBTORECORDTYPEH) -D $(DBDFLAGS) -o $(COMMONDEP_TARGET) $< > $@
|
|
@echo "$(COMMONDEP_TARGET): ../Makefile" >> $@
|
|
|
|
%Record.h$(DEP): %Record.dbd
|
|
@$(RM) $@
|
|
@$(DBTORECORDTYPEH) -D $(DBDFLAGS) -o $(COMMONDEP_TARGET) $< > $@
|
|
@echo "$(COMMONDEP_TARGET): ../Makefile" >> $@
|
|
|
|
menu%.h$(DEP): $(COMMON_DIR)/menu%.dbd
|
|
@$(RM) $@
|
|
@$(DBTOMENUH) -D $(DBDFLAGS) -o $(COMMONDEP_TARGET) $< > $@
|
|
@echo "$(COMMONDEP_TARGET): ../Makefile" >> $@
|
|
|
|
menu%.h$(DEP): menu%.dbd
|
|
@$(RM) $@
|
|
@$(DBTOMENUH) -D $(DBDFLAGS) -o $(COMMONDEP_TARGET) $< > $@
|
|
@echo "$(COMMONDEP_TARGET): ../Makefile" >> $@
|
|
|
|
%.dbd$(DEP): $(COMMON_DIR)/%Include.dbd
|
|
@$(RM) $@
|
|
@$(DBEXPAND) -D $(DBDFLAGS) -o $(COMMONDEP_TARGET) $< > $@
|
|
@echo "$(COMMONDEP_TARGET): ../Makefile" >> $@
|
|
|
|
%.dbd$(DEP): %Include.dbd
|
|
@$(RM) $@
|
|
@$(DBEXPAND) -D $(DBDFLAGS) -o $(COMMONDEP_TARGET) $< > $@
|
|
@echo "$(COMMONDEP_TARGET): ../Makefile" >> $@
|
|
|
|
%.db$(RAW)$(DEP): %.substitutions
|
|
@$(RM) $@
|
|
$(MAKEDBDEPENDS) $(COMMONDEP_TARGET) $< $(TEMPLATE_FILENAME) > $@
|
|
@echo "$(COMMONDEP_TARGET): $(TEMPLATE_FILENAME)" >> $@
|
|
|
|
%.db$(RAW)$(DEP): %.template
|
|
@$(RM) $@
|
|
@$(MAKEDBDEPENDS) $(COMMONDEP_TARGET) $< > $@
|
|
|
|
%.acf$(DEP): %.acs
|
|
@$(RM) $@
|
|
@$(ACFDEPENDS_CMD)
|
|
|
|
##################################################### CapFast filter
|
|
|
|
$(COMMON_DIR)/%.edf: ../%.sch $(DEPSCHS)
|
|
@$(RM) $@
|
|
@if [ ! -f cad.rc -a -r ../cad.rc ] ; then ln -s ../cad.rc ; fi
|
|
$(SCH2EDIF) $(SCH2EDIF_SYSFLAGS) $(SCH2EDIF_FLAGS) -o $@ $<
|
|
|
|
##################################################### Substitution files
|
|
|
|
# WARNING: CREATESUBSTITUTIONS script needs output dir on command line
|
|
|
|
ifdef CREATESUBSTITUTIONS
|
|
$(COMMON_DIR)/%.substitutions:
|
|
$(ECHO) "Create substitutions"
|
|
@$(RM) $@
|
|
$(CREATESUBSTITUTIONS) $@
|
|
endif
|
|
|
|
$(INSTALL_DB)/%.substitutions: %.substitutions
|
|
$(ECHO) "Installing db file $@"
|
|
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(@D)
|
|
|
|
.PRECIOUS: $(COMMON_DIR)/%.substitutions
|
|
|
|
##################################################### Template files
|
|
|
|
$(COMMON_DIR)/%.template: $(COMMON_DIR)/%.edf
|
|
@$(RM) $@
|
|
$(E2DB) $(E2DB_SYSFLAGS) $(E2DB_FLAGS) -n $@.VAR $<
|
|
@$(REPLACEVAR) < $@.VAR > $@
|
|
@$(RM) $@.VAR
|
|
|
|
$(INSTALL_DB)/%.template: %.template
|
|
$(ECHO) "Installing db file $@"
|
|
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(@D)
|
|
|
|
.PRECIOUS: $(COMMON_DIR)/%.template
|
|
|
|
##################################################### INC files
|
|
|
|
$(COMMON_DIR)/%Record.h: $(COMMON_DIR)/%Record.dbd
|
|
@$(RM) $(notdir $@)
|
|
$(DBTORECORDTYPEH) $(DBDFLAGS) -o $(notdir $@) $<
|
|
@$(MV) $(notdir $@) $@
|
|
|
|
$(COMMON_DIR)/%Record.h: %Record.dbd
|
|
@$(RM) $(notdir $@)
|
|
$(DBTORECORDTYPEH) $(DBDFLAGS) -o $(notdir $@) $<
|
|
@$(MV) $(notdir $@) $@
|
|
|
|
$(COMMON_DIR)/menu%.h: $(COMMON_DIR)/menu%.dbd
|
|
@$(RM) $(notdir $@)
|
|
$(DBTOMENUH) $(DBDFLAGS) -o $(notdir $@) $<
|
|
@$(MV) $(notdir $@) $@
|
|
|
|
$(COMMON_DIR)/menu%.h: menu%.dbd
|
|
@$(RM) $(notdir $@)
|
|
$(DBTOMENUH) $(DBDFLAGS) -o $(notdir $@) $<
|
|
@$(MV) $(notdir $@) $@
|
|
|
|
.PRECIOUS: $(COMMON_DIR)/%.h
|
|
|
|
##################################################### DBD files
|
|
|
|
$(COMMON_DIR)/bpt%.dbd: bpt%.data
|
|
@$(RM) $(notdir $@)
|
|
$(MAKEBPT) $< $(notdir $@)
|
|
@$(MV) $(notdir $@) $@
|
|
|
|
$(COMMON_DIR)/%.dbd: $(COMMON_DIR)/%Include.dbd
|
|
$(ECHO) "Expanding created dbd file $(notdir $<)"
|
|
@$(RM) $(notdir $@)
|
|
$(DBEXPAND) $(DBDFLAGS) -o $(notdir $@) $<
|
|
@$(MV) $(notdir $@) $@
|
|
|
|
$(COMMON_DIR)/%.dbd: %Include.dbd
|
|
$(ECHO) "Expanding dbd file $<"
|
|
@$(RM) $(notdir $@)
|
|
$(DBEXPAND) $(DBDFLAGS) -o $(notdir $@) $<
|
|
@$(MV) $(notdir $@) $@
|
|
|
|
$(COMMON_DIR)/%Include.dbd:
|
|
@$(RM) $(notdir $@)
|
|
$(PERL) $(TOOLS)/makeIncludeDbd.pl $($*_DBD) $(notdir $@)
|
|
@$(MV) $(notdir $@) $@
|
|
|
|
$(INSTALL_DBD)/%: $(COMMON_DIR)/%
|
|
$(ECHO) "Installing created dbd file $@"
|
|
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(@D)
|
|
|
|
$(INSTALL_DBD)/%: %
|
|
$(ECHO) "Installing dbd file $@"
|
|
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(@D)
|
|
|
|
define DBD_INSTALLS_template
|
|
$$(INSTALL_DBD)/$$(notdir $(1)) : $(1)
|
|
$(ECHO) "Installing $$@"
|
|
@$$(INSTALL) -d -m $$(INSTALL_PERMISSIONS) $$^ $$(INSTALL_DBD)
|
|
endef
|
|
$(foreach file, $(DBD_INSTALLS), $(eval $(call DBD_INSTALLS_template, $(file))))
|
|
|
|
.PRECIOUS: $(COMMON_DBDS) $(COMMON_DIR)/%Include.dbd
|
|
|
|
##################################################### DB files
|
|
|
|
$(COMMON_DIR)/%.db$(RAW): $(COMMON_DIR)/%.edf
|
|
$(E2DB) $(E2DB_SYSFLAGS) $(E2DB_FLAGS) -n $*.VAR $<
|
|
@$(REPLACEVAR) < $*.VAR > $@
|
|
@$(RM) $*.VAR
|
|
|
|
$(COMMON_DIR)/%.db$(RAW): %.substitutions
|
|
$(ECHO) "Inflating database from $< $(TEMPLATE_FILENAME)"
|
|
@$(RM) $@ $*.tmp
|
|
$(MSI) $(DBFLAGS) -S$< $(TEMPLATE_FILENAME) > $*.tmp
|
|
$(MV) $*.tmp $@
|
|
|
|
$(COMMON_DIR)/%.db$(RAW): %.template
|
|
$(ECHO) "Inflating database from $<"
|
|
@$(RM) $@ $*.tmp
|
|
$(MSI) $(DBFLAGS) $< > $*.tmp
|
|
$(MV) $*.tmp $@
|
|
|
|
$(COMMON_DIR)/%.acf: %.acs
|
|
$(ECHO) "Creating acf file $@"
|
|
@$(RM) $@
|
|
$(ACF_CMD)
|
|
|
|
.PRECIOUS: $(COMMON_DIR)/%.acf
|
|
|
|
# dbst based database optimization
|
|
ifeq '$(DB_OPT)' 'YES'
|
|
|
|
$(COMMON_DIR)/%.db$(RAW): ../%.db
|
|
@$(RM) $@
|
|
$(CP) $< $@
|
|
|
|
$(COMMON_DIR)/%.db: $(COMMON_DIR)/%.db$(RAW)
|
|
$(ECHO) "Optimizing database $@"
|
|
@$(RM) $@
|
|
$(DBST) . $< -d > $@
|
|
|
|
.PRECIOUS: $(COMMON_DIR)/%.db
|
|
.PRECIOUS: $(DB:%=$(COMMON_DIR)/%$(RAW))
|
|
else
|
|
|
|
$(INSTALL_DB)/%: %
|
|
$(ECHO) "Installing db file $@"
|
|
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(@D)
|
|
endif
|
|
|
|
$(INSTALL_DB)/%.db: $(COMMON_DIR)/%.db
|
|
$(ECHO) "Installing created db file $@"
|
|
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(@D)
|
|
|
|
define DB_INSTALLS_template
|
|
$$(INSTALL_DB)/$$(notdir $(1)) : $(1)
|
|
$(ECHO) "Installing $$@"
|
|
@$$(INSTALL) -d -m $$(INSTALL_PERMISSIONS) $$^ $$(INSTALL_DB)
|
|
endef
|
|
$(foreach file, $(DB_INSTALLS), $(eval $(call DB_INSTALLS_template, $(file))))
|
|
|
|
.PRECIOUS: $(COMMON_DIR)/%.edf
|
|
.PRECIOUS: $(COMMON_DBS)
|
|
|
|
##################################################### register record,device,driver support
|
|
|
|
IOC_INST_TOP := $(firstword $(IOCS_APPL_TOP) \
|
|
$(shell $(PERL) $(TOOLS)/fullPathName.pl $(INSTALL_LOCATION) ) )
|
|
|
|
%_registerRecordDeviceDriver.cpp: $(COMMON_DIR)/%.dbd
|
|
@$(RM) $@ $*.tmp
|
|
$(REGISTERRECORDDEVICEDRIVER) $< $(basename $@) $(IOC_INST_TOP) > $*.tmp
|
|
$(MV) $*.tmp $@
|
|
|
|
%_registerRecordDeviceDriver.cpp: %.dbd
|
|
@$(RM) $@ $*.tmp
|
|
$(REGISTERRECORDDEVICEDRIVER) $< $(basename $@) $(IOC_INST_TOP) > $*.tmp
|
|
$(MV) $*.tmp $@
|
|
|
|
.PRECIOUS: %_registerRecordDeviceDriver.cpp
|
|
|
|
##################################################### END OF FILE
|