#************************************************************************* # Copyright (c) 2006 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 the file LICENSE that is included with this distribution. #************************************************************************* # $Revision-Id$ # # Rules for making things specified in Makefile # # we are in O.$(T_A), but most sources are elsewhere # ifndef BASE_RULES_BUILD BASE_RULES_BUILD=1 vpath %.c $(USR_VPATH) $(ALL_SRC_DIRS) vpath %.cc $(USR_VPATH) $(ALL_SRC_DIRS) vpath %.cpp $(USR_VPATH) $(ALL_SRC_DIRS) vpath %.rc $(USR_VPATH) $(ALL_SRC_DIRS) vpath %.h $(USR_VPATH) $(ALL_SRC_DIRS) vpath %.html $(USR_VPATH) $(ALL_SRC_DIRS) vpath %.skel.static $(USR_VPATH) $(ALL_SRC_DIRS) vpath %.y $(USR_VPATH) $(ALL_SRC_DIRS) vpath %.l $(USR_VPATH) $(ALL_SRC_DIRS) vpath %.pl $(USR_VPATH) $(ALL_SRC_DIRS) #--------------------------------------------------------------- include $(CONFIG)/CONFIG_ADDONS #--------------------------------------------------------------- # Set PROD, TESTPROD, OBJS, and LIBRARY SCRIPTS_HOST += $(PERL_SCRIPTS) # PERL_SCRIPTS are installed into existing $(INSTALL_BIN) for Host systems ifeq ($(findstring Host,$(VALID_BUILDS)),Host) LIBRARY += $(LIBRARY_HOST) LOADABLE_LIBRARY += $(LOADABLE_LIBRARY_HOST) OBJS += $(OBJS_HOST) PROD += $(PROD_HOST) SCRIPTS += $(SCRIPTS_HOST) TESTLIBRARY += $(TESTLIBRARY_HOST) TESTSCRIPTS += $(TESTSCRIPTS_HOST) TESTPROD += $(TESTPROD_HOST) endif ifeq ($(findstring Ioc,$(VALID_BUILDS)),Ioc) LIBRARY += $(LIBRARY_IOC) LOADABLE_LIBRARY += $(LOADABLE_LIBRARY_IOC) OBJS += $(OBJS_IOC) PROD += $(PROD_IOC) SCRIPTS += $(SCRIPTS_IOC) TESTLIBRARY += $(TESTLIBRARY_IOC) TESTSCRIPTS += $(TESTSCRIPTS_IOC) TESTPROD += $(TESTPROD_IOC) endif #--------------------------------------------------------------- ifdef TEMPLATES_DIR INSTALL_TEMPLATES_SUBDIR = $(INSTALL_TEMPLATES)/$(TEMPLATES_DIR) else INSTALL_TEMPLATES_SUBDIR = $(INSTALL_TEMPLATES) endif #--------------------------------------------------------------- # First target all: install -include $(CONFIG)/RULES.Db ifneq (,$(strip $(HDEPENDS_FILES))) $(filter-out $(wildcard *$(DEP)), $(HDEPENDS_FILES)): $(COMMON_INC) -include $(HDEPENDS_FILES) endif #--------------------------------------------------------------- # Included defines and rules for prod,testprod, and library targets #ifneq (,$(strip $(PROD) $(TESTPROD) $(LIBRARY) $(TESTLIBRARY) $(LOADABLE_LIBRARY) )) include $(CONFIG)/RULES_TARGET #endif #--------------------------------------------------------------- # Products and Object libraries # PRODTARGETS += $(PRODNAME) $(MUNCHNAME) $(CTDT_SRCS) $(CTDT_OBJS) $(NMS) #--------------------------------------------------------------- # Generate a test specification if any tests are defined. # ifneq (,$(strip $(TESTS))) TARGETS += testspec endif #--------------------------------------------------------------- # Libraries # LIBTARGETS += $(LIBNAME) $(INSTALL_LIBS) $(TESTLIBNAME) \ $(SHRLIBNAME) $(INSTALL_SHRLIBS) $(TESTSHRLIBNAME) \ $(DLLSTUB_LIBNAME) $(INSTALL_DLLSTUB_LIBS) $(TESTDLLSTUB_LIBNAME) \ $(LOADABLE_SHRLIBNAME) $(INSTALL_LOADABLE_SHRLIBS) -include $(CONFIG)/RULES_FILE_TYPE # Main targets install: buildInstall buildInstall : build # Allows rebuild to work with parallel builds option, -j. install: $(patsubst rebuild,clean,$(filter rebuild,$(MAKECMDGOALS))) rebuild: clean install build : inc build: $(OBJSNAME) $(LIBTARGETS) $(PRODTARGETS) $(TESTPRODNAME) \ $(TARGETS) $(TESTSCRIPTS) $(INSTALL_LIB_INSTALLS) inc : $(COMMON_INC) $(INSTALL_INC) $(INSTALL_CONFIGS) buildInstall : \ $(INSTALL_SCRIPTS) $(INSTALL_PROD) $(INSTALL_MUNCHS) \ $(INSTALL_TCLLIBS) $(INSTALL_TCLINDEX) \ $(INSTALL_OBJS) \ $(INSTALL_DOCS) \ $(INSTALL_HTMLS) \ $(INSTALL_TEMPLATE) \ $(INSTALL_BIN_INSTALLS) clean: build_clean build_clean: $(ECHO) "Cleaning" @$(RM) *.i *$(OBJ) *.a $(TESTPRODNAME) \ $(LIBNAME) $(TESTLIBNAME) $(SHRLIBNAME) $(TESTSHRLIBNAME) \ $(DLLSTUB_LIBNAME) $(TESTDLLSTUB_LIBNAME) \ $(LOADABLE_SHRLIBNAME) \ $(INC) $(TARGETS) $(TDS) $(CLEANS) \ *.out MakefileInclude *.manifest *.exp \ $(COMMON_INC) $(HDEPENDS_FILES) $(PRODTARGETS) $(TESTSCRIPTS) ifdef RES @$(RM) *$(RES) endif ifdef BAF @$(RM) $(PROD_BAF) $(LIB_BAF) endif ifdef BOF @$(RM) *$(BOF) endif # WIN95/NT source browser #ifdef BAF browse: $(LIB_BAF) $(PROD_BAF) #endif $(DIRECTORY_TARGETS) : $(MKDIR) -p $@ $(PRODNAME): $(INSTALL_LIB_INSTALLS) # RELEASE file consistency checking checkRelease: $(CONVERTRELEASE) checkRelease warnRelease: -$(CONVERTRELEASE) checkRelease noCheckRelease: ifeq ($(EPICS_HOST_ARCH),$(T_A)) @echo "Warning: RELEASE file consistency checks have been disabled" endif #--------------------------------------------------------------- # The order of the following rules is # VERY IMPORTANT !!!! $(TESTPRODNAME) $(PRODNAME): $(PRODUCT_OBJS) $(PROD_RESS) $(PROD_DEPLIBS) $(TESTPRODNAME) $(PRODNAME):%$(EXE): @$(RM) $@ $(DEBUGCMD) $(LINK.cpp) $(MT_EXE_COMMAND) # object libs for R3.13 vxWorks compatibility only $(OBJLIBNAME): $(OBJLIB_LD_OBJS) $(OBJLIBNAME):%$(OBJ): @$(RM) $@ $(OBJLIB_LINK.cpp) %_ctdt$(OBJ) : %_ctdt.c @$(RM) $@ $(COMPILE.ctdt) $< %$(DEP):%.c @$(RM) $@ $(HDEPENDS.c) $< %$(DEP):%.cc @$(RM) $@ $(HDEPENDS.cpp) $< %$(DEP):%.cpp @$(RM) $@ $(HDEPENDS.cpp) $< %$(OBJ): %.c @$(RM) $@ $(COMPILE.c) -c $< %$(OBJ): %.cc @$(RM) $@ $(COMPILE.cpp) -c $< %$(OBJ): %.cpp @$(RM) $@ $(COMPILE.cpp) -c $< # WIN95/NT resource compiler %$(RES): %.rc @$(RM) $@ $(RCCMD) # WIN95/NT source browser %.bsc: %.sbr $(ECHO) "building source browser archive $@" @$(RM) $@ $(BAFCMD) $< YACCOPT ?= $($*_YACCOPT) # # rename the y.tab.h file only if we # are creating it # %.c: %.y @$(RM) $*.tab.c @$(RM) $*.tab.h $(YACC) -b$* $(YACCOPT) $< $(MV) $*.tab.c $*.c $(if $(findstring -d, $(YACCOPT)),$(MV) $*.tab.h $*.h,) # must be a seperate rule since when not using '-d' the # prefix for .h will be different then .c %.h : %.c %.y %.c: %.l @$(RM) $*.yy.c $(LEX) $(LEXOPT) -t $< > $*.yy.c @$(RM) $@ $(MV) $*.yy.c $@ # WIN95/NT source browser ifdef BAF $(LIB_BAF): $(addsuffix $(BOF),$(basename $(LIBRARY_LD_OBJS))) $(ECHO) "Building source browser archive $@" @$(RM) $@ $(BAFCMD) $^ endif #--------------------------------------------------------------- # Libraries, shared/DLL and stubs $(LIBNAME) $(TESTLIBNAME): $(LIBRARY_OBJS) $(LIBNAME) $(TESTLIBNAME): $(LIB_PREFIX)%$(LIB_SUFFIX): @$(RM) $@ $(ARCMD) ifneq ($(strip $(RANLIB)),) $(RANLIB) $@ endif # RANLIB $(SHRLIBNAME) $(DLLSTUB_LIBNAME) $(TESTSHRLIBNAME) $(TESTDLLSTUB_LIBNAME): \ $(LIBRARY_OBJS) $(LIBRARY_RESS) $(SHRLIB_DEPLIBS) $(SHRLIBNAME) $(TESTSHRLIBNAME): $(SHRLIB_PREFIX)%$(SHRLIB_SUFFIX): $(RM) $@ $(LINK.shrlib) $(MT_DLL_COMMAND) $(LOADABLE_SHRLIBNAME): $(LIBRARY_OBJS) $(LIBRARY_RESS) $(SHRLIB_DEPLIBS) $(LOADABLE_SHRLIBNAME): $(LOADABLE_SHRLIB_PREFIX)%$(LOADABLE_SHRLIB_SUFFIX): @$(RM) $@ $(LINK.shrlib) $(MT_DLL_COMMAND) #--------------------------------------------------------------- # C++ munching for VxWorks %.nm: %$(EXE) @$(RM) $@ $(NM) $< > $@ %.nm: %$(OBJ) @$(RM) $@ $(NM) $< > $@ %_ctdt.c: %.nm @$(RM) $@ $(PERL) $(TOOLS)/munch.pl -o $@ $< $(MUNCHNAME): %$(MUNCH_SUFFIX): $(MUNCH_DEPENDS) %$(EXE) @$(RM) $@ $(MUNCH_CMD) $(OBJLIB_MUNCHNAME): %.munch: %_ctdt$(OBJ) %$(OBJ) @$(RM) $@ $(MUNCH_CMD) #--------------------------------------------------------------- # Automated testing runtests: $(TESTSCRIPTS) -$(PERL) -MTest::Harness -e 'runtests @ARGV if @ARGV;' $^ testspec: $(TESTSCRIPTS) @$(RM) $@ @echo OS-class: $(OS_CLASS) > $@ @echo Target-arch: $(T_A) >> $@ $(if $^, @echo Tests: $^ >> $@) $(if $(TESTFILES), @echo Files: $(TESTFILES) >> $@) $(if $(TESTSPEC_$(OS_CLASS)), @echo "Harness: $(TESTSPEC_$(OS_CLASS))" >> $@) # If there's a perl test script (.plt) available, use it %.t: ../%.plt @$(RM) $@ @$(CP) $< $@ # Some versions of Test::Harness expect test programs in perl only. # Generate a perl program to exec the real test binary. %.t: %$(EXE) @$(RM) $@ @$(PERL) $(TOOLS)/makeTestfile.pl $@ $< #--------------------------------------------------------------- # Install rules for BIN_INSTALLS and LIB_INSTALLS define BIN_INSTALLS_template $$(INSTALL_BIN)/$$(notdir $(1)) : $(1) $(ECHO) "Installing $$(