⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 makefile.new

📁 早期freebsd实现
💻 NEW
字号:
#******************************************************************************#  This GNUmakefile is useful for large and complex projects which involve# both G++ library prototypes, and prototypes added by the user(s).  It # is assumed that certain conventions are followed.## 1) each object has its own source and header files.  For example class W #    would have W.h and W.cc## 2) each prototype object has its own source and header files (W.hP and W.ccP)## 3) object header files are contained in directory $(IDIR) (for Include#    DIRectory)## 4) object source files are contained in the current directory## 5) prototype instantiations are contained in $(PC) (for Prototype C++#    directory)## 6) user prototype files (both header and source) are contained in $(IPP)## 7) non-class code is contained in .h and .cc files, which live in $(IDIR)#    and the current directory respectively## *) as an extra, I have added the convention that whenever a W.cc file#    is being compiled, the macro _W_cc is defined.  This is useful#    particularly for conditional parts of header files (for example,#    W.h could have ifdef _W_cc ...## The makefile works in the following manner: the source dependencies are# contained in .Makefile.S_DEP, while the (machine generated) object # dependencies are contained in .Makefile.O_DEP.  The types needed by# the program are defined by several variables, and the makefile generates# the necessary dependencies (both source and object) from those variables.# The prototype lists are contained in .Makefile.TYPES.# # NOTE: in order to create the machine generated files .Makefile.TYPES,#  .Makefile.S_DEP, and .Makefile.O_DEP, empty versions of these#  file must exist.  They can be easily created using "touch <file>".##  -- Carl Staelin#     staelin@princeton.edu#******************************************************************************#******************************************************************************# standard Makefile definitionscomma := ,space := $(empty) $(empty)tab := $(empty)	$(empty)#******************************************************************************# definitions from environment variables# the CPATH include directories cpath-include-directories := $(addprefix -I, $(subst :,$(space),$(CPATH)))# the LPATH load directories lpath-load-directories := $(addprefix -L, $(subst :,$(space),$(LPATH)))#******************************************************************************# Basic definitionsHOST := $(shell hostname)BASE := # CMU DirectoriesUSR  := $(BASE)/usrMACH := $(BASE)/usr/machCS   := $(BASE)/usr/cs# GNU directoriesGNULIBDIR := $(BASE)/usr/local/libGNUIDIR := $(GNULIBDIR)/g++-include# the g++ library prototypes...LPP := $(GNUIDIR)PC := ../libg++# the user's library prototypes...IPP := ../proto# the include directoryIDIR := ../include# the include directories needed...IDIRS := -I$(IDIR) -I$(PC) -I$(GNUIDIR) $(cpath-include-directories) # the directories where the libraries live...LDIRS := $(lpath-load-directories)#******************************************************************************# standard function (and associated variables) definitionsC++ = g++C++FLAGS = -pipe -O $(IDIRS) 		-Dc_plusplus \		-DDEBUG \		-D$(strip $(subst .,_, _$(basename $(@F))_cc)) GENCLASS = ../bin/genclass.extnsnPREPEND  = ../bin/prependHIERARCHY	= ../bin/hierarchyMAKE_TYPES	= ../bin/make-typesPROTOTYPE	= ../bin/prototype#******************************************************************************# implicit rules%.o : %.cc	$(C++)	$(C++FLAGS) \		-c -o $@ $(@D)$(basename $(@F)).cc#******************************************************************************# User typesBASIC_TYPES = \	int \	u_int \	l_int \	l_u_int # generated by this make file (initially create an empty .Makefile.TYPES# so that "make dependencies" can create the real file)include .Makefile.TYPES#******************************************************************************# User types (with sample values filled in) # # NOTE: do NOT add .h to the end of these, MAKE does it for you!HEADER_FILES = \	disk_set \	file_types \	include \	inode \	inode_t \	lib \	main \	nfs_functions \	nfs_mount \	nfs_params \	nfs_prot \	system SOURCE_FILES = \	disk_set \	lib \	nfs_auxil \	nfs_dirent \	nfs_fh \	nfs_ipcress \	nfs_links \	nfs_main \	nfs_mnt_serv \	nfs_mount_xdr \	nfs_prot_xdr \	nfs_serv1 \	nfs_serv2 \	nfs_serv3 \	nfs_serv4 \#******************************************************************************# some sample machine generated user-file stuff#../include/file_types.h : ../include/file_types.type.h \			  ../include/file_types.operation.h../include/Substrate_file.h : ../include/file_types.includes.h../include/file_types.type.h : ../include/file_types.hierarchy	$(HIERARCHY) -voutput_type=type ../include/file_types.hierarchy > $@../include/file_types.includes.h : ../include/file_types.hierarchy	$(HIERARCHY) -voutput_type=general -vpreamble='#include "' \	 -vpostamble='.h"' -vprint_first=1 ../include/file_types.hierarchy > $@../include/file_types.operation.h : ../include/file_types.hierarchy	(echo '#define FILE_TYPES_OPERATION(OPERATION)  \' ; \	 $(HIERARCHY) -voutput_type=general -vpreamble='OPERATION(' \	  -vpostamble=') \' -vprint_first=1 ../include/file_types.hierarchy ; \	  echo ; ) | sed 's/\.//g' > $@ ;#******************************************************************************# source files...HEADERS := $(wildcard $(addprefix $(IDIR)/, $(addsuffix .h, \	                                      $(USER_TYPES) $(HEADER_FILES))))SOURCES := $(wildcard $(addsuffix .cc, $(USER_TYPES) $(SOURCE_FILES)))OBJECTS := $(patsubst %.cc,%.o,$(SOURCES))#******************************************************************************# User prototype instantiationsUSER_PROTO_HEADERS := \	$(addprefix $(PC)/, 	\	  $(addsuffix .h,   	\	    $(foreach type, 	\	      $(basename    	\	        $(notdir    	\	          $(wildcard 	\		    $(addprefix $(IPP)/, 				    \		                $(addsuffix .hP,			    \				            $(USER_BASE_PROTO_TYPES)))))),  \	      $(filter %.$(type), $(USER_PROTO_TYPES)))))USER_PROTO_SOURCES := \	$(addprefix $(PC)/, 		\	  $(addsuffix .cc,		\	    $(foreach type,		\	      $(basename 		\	        $(notdir		\		  $(wildcard 		\		    $(addprefix $(IPP)/,\			        $(addsuffix .ccP,		\				  $(USER_BASE_PROTO_TYPES)))))),\ 	      $(filter %.$(type), $(USER_PROTO_TYPES)))))USER_PROTO_OBJECTS := $(patsubst %.cc, %.o, $(USER_PROTO_SOURCES))USER_PROTO_TYPE_SOURCES := \	$(wildcard					\	  $(addprefix $(IPP)/,				\	    $(addsuffix .hP, $(USER_BASE_PROTO_TYPES))  \	    $(addsuffix .ccP, $(USER_BASE_PROTO_TYPES))))#******************************************************************************# libg++ prototype instantiationsLIB_PROTO_HEADERS := \	 $(addprefix $(PC)/,						\	   $(addsuffix .h,						\	     $(foreach type,						\	       $(basename						\		 $(notdir						\		   $(wildcard						\		     $(addprefix $(LPP)/,				\		       $(addsuffix .hP, $(LIB_BASE_PROTO_TYPES)))))),	\	       $(filter %.$(type), $(LIB_PROTO_TYPES)))))LIB_PROTO_SOURCES := \	$(addprefix $(PC)/, 						\	  $(addsuffix .cc,						\	    $(foreach type,						\	      $(basename						\	        $(notdir						\		  $(wildcard						\		    $(addprefix $(LPP)/,				\		      $(addsuffix .ccP, $(LIB_BASE_PROTO_TYPES)))))),	      $(filter %.$(type), $(LIB_PROTO_TYPES)))))LIB_PROTO_OBJECTS := $(patsubst %.cc, %.o, $(LIB_PROTO_SOURCES)).PHONY : testtest :	@echo LIB_PROTO_TYPES = "${LIB_PROTO_TYPES}";	@echo LIB_BASE_PROTO_TYPES = "${LIB_BASE_PROTO_TYPES}" ;	@echo LIB_PROTO_OBJECTS = "${LIB_PROTO_OBJECTS}" ;	@echo LIB_PROTO_HEADERS = "${LIB_PROTO_HEADERS}" ;#*****************************************************************************# main procedures..# example:foo : foo.o $(OBJECTS) 	$(C++) $(C++FLAGS) -o $@ foo.o $(OBJECTS) $(LDIRS)sources : $(SOURCES) #******************************************************************************# various cleanup stuff....PHONY : rmback clean realcleanrmback : 	cd .. ; rm -f proto/*~ include/*~ src/*~clean : rmback	rm -f $(OBJECTS) $(PROTOLIB) $(LIB_PROTO_OBJECTS) $(USER_PROTO_OBJECTS)realclean : clean	rm -f $(LIB_PROTO_SOURCES) $(USER_PROTO_SOURCES) $(LIB_PROTO_HEADERS) \	      $(USER_PROTO_HEADERS)#*****************************************************************************# debugging actions%.E : %.cc	$(C++) $(C++FLAGS) -E $(@D)$(basename $(@F)).cc > $@%.s : %.cc	$(C++) -S $(C++FLAGS) $< -o $@#******************************************************************************# "functions" for creating library source code from prototypesparameters = $(subst .,$(space),$(notdir $(basename $(basename $@))))ifdef_filename = $(subst .,_,$(notdir $(basename $@)))generic-type = $(subst .,,$(suffix $(basename $(notdir $@))))## return the type if it should be a "val" type (pointer or basic type)#parameter-val-q = $(filter %_p, $(parameter)) $(filter-out %_p, $(filter $(parameter), $(BASIC_TYPES)))## return the list of pairs of types and their prototype type (val or ref)#proto-type-arg = $(parameter) \	$(patsubst %, val, $(filter 1, $(words $(parameter-val-q)))) \	$(patsubst %, ref, $(filter-out 1, $(words $(parameter-val-q))))define make-proto-file$(GENCLASS) \  $(dir $<) \  $(dir $@) \  $(suffix $@) \  $(foreach parameter, $(parameters), $(proto-type-arg)) \  $(generic-type) ;endefdefine prepend-proto-includes$(PREPEND) \  $(addsuffix .h, $(basename $@)) \  '#include "include.h"' \  $(patsubst %, '#include "%.h"',				\    $(foreach type, $(USER_TYPES)				\		    $(USER_PROTO_TYPES)				\		    $(LIB_PROTO_TYPES),				\		    $(patsubst %, $(type),			\				  $(filter $(subst .,, $(type)),\				           $(patsubst %_p, %, $(parameters)))))) ;endef#******************************************************************************# libg++ prototype dependencies## Used to automatically generate a %_p.defs file, which is required by classes# which do comparisons, for pointer types to objects which have the real # comparison code.## this will cat the appropriate strings #$(addprefix $(PC)/,	\  $(addsuffix .h,	\    $(filter-out char_p.defs, $(filter %_p.defs, $(LIB_PROTO_TYPES))))) : 	@ echo creating $@ ;				 \	( ifdef_filename=$(strip $(ifdef_filename))	 \	  p=$(strip $(patsubst %_p, %, $(parameters)))	 \	  ../bin/make-defs-file ) > $@ ;lib_proto_intermediate_sources = \	$(filter-out %_p.defs.h, $(LIB_PROTO_HEADERS) $(LIB_PROTO_SOURCES)) \	$(addprefix $(PC)/, $(addsuffix .h, char_p.defs)) lib_type_and_suffix_list = \	$(sort								 \	  $(join $(suffix $(basename $(lib_proto_intermediate_sources))),\		 $(addprefix ., $(suffix $(lib_proto_intermediate_sources)))))#******************************************************************************# prototype dependenciesproto_intermediate_sources = \	$(USER_PROTO_HEADERS) \	$(USER_PROTO_SOURCES) type_and_suffix_list = \	$(sort								\	  $(join $(suffix $(basename $(proto_intermediate_sources))),	\	 	 $(addprefix ., $(suffix $(proto_intermediate_sources)))))#******************************************************************************# generate machine generated dependencies H_FILES  = $(HEADERS) $(LIB_PROTO_HEADERS) $(USER_PROTO_HEADERS)CC_FILES = $(SOURCES) $(LIB_PROTO_SOURCES) $(USER_PROTO_SOURCES)DEPENDENCIES = $(addsuffix .d, $(basename $(CC_FILES)))$(addsuffix .d, $(basename $(CC_FILES))) : %.d : %.cc	( echo -n $(@D) ; $(C++) -M $(C++FLAGS) $*.cc) > $@;#******************************************************************************# machine generated type stuff#$(DEPENDENCIES) : $(H_FILES).PHONY : dependencies source-dependencies object-dependencies dependencies : type-definitions source-dependencies	@ $(MAKE) object-dependencies object-dependencies : $(DEPENDENCIES) 	@echo making object dependencies... ; \	rm .Makefile.O_DEP ; \	ls . | grep '\.d$$' > /tmp/dependencies ; \	ls $(PC) | gawk '{printf "$(PC)/%s\n", $$0 ; }' | grep '\.d$$' >> \		/tmp/dependencies ; \	for file in `cat /tmp/dependencies` ; do \	  cat $$file ; \	done > .Makefile.O_DEP.tmp ; \	mv .Makefile.O_DEP.tmp .Makefile.O_DEP ; \	for file in `cat /tmp/dependencies` ; do \	  rm $$file ; \	done ; \	rm /tmp/dependencies ;source-dependencies : 	@ echo making source dependencies... ; \	($(PROTOTYPE) -voutput_type=libg++-prototypes \		../include/prototype.dependencies | \	 gawk '($$1 !~ "_p.defs$$") || ($$1 == "char_p.defs") { print ; }' | \	 PROTO_SOURCE=$(LPP) PP=LPP ../bin/make-source-dependencies ; \	 ($(PROTOTYPE) -voutput_type=user-prototypes \		../include/prototype.dependencies ; \	  $(HIERARCHY) -voutput_type=general ../include/file_types.hierarchy)|\	 PROTO_SOURCE=$(IPP) PP=IPP ../bin/make-source-dependencies ; \	) > .Makefile.S_DEP ;type-definitions :	@ echo make type definitions... ; \	$(MAKE_TYPES) > .Makefile.TYPES ;#******************************************************************************# include machine generated dependencies include .Makefile.S_DEPinclude .Makefile.O_DEP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -