rules.library
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:13k
源码类别:

VxWorks

开发平台:

C/C++

  1. # rules.library - Host independent rules for making libraries
  2. #
  3. # Copyright 1984-2002, Wind River Systems, Inc.
  4. #
  5. # modification history
  6. # --------------------
  7. # 02b,14feb02,jab  use LD_PARTIAL_LAST_FLAGS in last link for .out targets
  8. # 02a,14dec01,tam  made CPU variant builds automatic
  9. # 01z,06dec01,tam  added support for building CPU variant archive(s)
  10. # 01y,04dec01,sn   added BUILD_ALL_OBJS
  11. # 01x,12nov01,tam  added use of TOOL_COMMON_DIR
  12. # 01w,09nov01,tam  removed '//' in paths
  13. # 01v,08nov01,tam  fix x86-win32 build; added build of empty lib$CPU$TOOLvx.a
  14. # 01u,01nov01,tam  updated rclean rule for new archive directory hierarchy
  15. # 01t,19oct01,pch  Add rules and dependencies for generation of
  16. #                  target/src/arch/Makefile and target/h/types/vxCpu.h
  17. # 01s,01nov01,jab  added LIBDIR directory creation
  18. # 01r,24oct01,tam  updated for repackaging
  19. # 01q,23oct01,jab  cleaned up
  20. # 01p,11oct01,dbs  add EXCLUDE_SUBDIRS variable as per AE
  21. # 01o,20sep01,dat  Moving make files to h/tool/
  22. # 01n,19sep01,mem  Prefix $(VX_CPU_FAMILY) to LIBDIRBASE path.
  23. # 01m,06aug01,mem  Updated for new runtime arrangement.
  24. # 01l,25jul01,sn   Add per-file CFLAGS capability for C++ files
  25. # 01k,24jul01,r_s  changing the make 'ifeq' conditional to work with 'gnu', 
  26. #                  'sfgnu', 'sfgnule' etc for TOOL
  27. # 01j,24jul01,r_s  diab specific rules added
  28. # 01j,05jun01,mem  Add per-file CFLAGS_AS capability.
  29. # 01i,12jan00,dra  add per-file CFLAGS capability
  30. # 01h,19jan99,dra  use LD_PARTIAL_FLAGS for partial links with ctdt.o
  31. # 01g,23feb99,sn   removed references to $(POST_MUNCH)
  32. #                  -traditional -> -fdollars-in-identifiers
  33. # 01f,02feb99,sn   added rules to build standalone "munched" C++ modules
  34. #                  (useful for building test programs)
  35. # 01e,11dec98,j_w  add clean rule to remove lib$(CPU)$(TOOL).a
  36. # 01d,11nov98,sn   undid 01d
  37. # 01c,07nov96,yp   made the RM commands in implicit rules windows friendly
  38. # 01b,17may96,yp   moved clean rule to host specific stubs so Windows will work
  39. # 01a,07may96,yp   created
  40. #
  41. # DESCRIPTION
  42. # This file is included by every Makefile in the run-time (not BSPs).
  43. # This file contains makefile rules that are host independent for creating
  44. # vxWorks libraries. It also contains implicit rules for .c .s .cpp and .cxx
  45. # files in either the current directory or in $(LIBDIR).
  46. #
  47. # In each source directory, the list of source files is obtained and matched
  48. # against the objects specified to be built in the OBJS macro. In this way 
  49. # extraneous .c and .s files are ignored and make does not fail if it doesn't
  50. # find the source file to an object in OBJS (This is the case with most source
  51. # customers).
  52. #
  53. # The MAKETAIL and CLEANTAIL macros, designed by Sott H. although obsolete
  54. # from here on, are still available and known to work only in Unix environments.
  55. #
  56. # If the macro SUBDIRS is defined with directories we build the subdirectories 
  57. # before we build the current dir.
  58. #
  59. # INCLUDES
  60. # $(TGT_DIR)/h/make/defs.default
  61. # $(TGT_DIR)/h/tool/$(TOOL_FAMILY)/make.$(CPU)$(TOOL)
  62. # $(TGT_DIR)/h/make/defs.$(WIND_HOST_TYPE)
  63. # $(TGT_DIR)/h/make/rules-lib.$(WIND_HOST_TYPE)
  64. # depend.$(CPU)$(TOOL)
  65. # By default object files are installed in the toolchain independant object 
  66. # directory if LIB_BASE_NAME is set, that is when LIB_COMMON is not set.
  67. ifeq ($(LIB_COMMON),)
  68. LIB_COMMON = true
  69. endif
  70. ## New Archive Directory Hierarchy (LIB_BASE_NAME != ""):
  71. ifneq ($(LIB_BASE_NAME),)
  72. #     - Object modules are installed in the toolchain dependant directory
  73. #     if LIB_COMMON is equal to false, and in the toolchain independant
  74. #     directory otherwise.
  75. #     - Objects modules populate the archive whose name is selected by
  76. #     LIB_BASE_NAME
  77. #     - note that LIB_DIR_TAG is only set when building archive(s) for CPU
  78. #     variants.
  79. ifeq ($(LIBDIRBASE),)
  80. ifeq ($(findstring false,$(LIB_COMMON)),false)
  81. LIBDIRBASE = $(subst /,$(DIRCHAR),$(VX_CPU_FAMILY)/$(CPU)/$(TOOL)$(LIB_DIR_TAG))
  82. else
  83. LIBDIRBASE = $(subst /,$(DIRCHAR),$(VX_CPU_FAMILY)/$(CPU)/$(TOOL_COMMON_DIR)$(LIB_DIR_TAG))
  84. endif
  85. endif
  86. ifeq ($(LIBNAME),)
  87. LIBNAME = $(subst /,$(DIRCHAR),$(LIBDIRBASE)/lib$(LIB_BASE_NAME).a)
  88. endif
  89. ifeq ($(LIBDIRNAME),)
  90. LIBDIRNAME = $(subst /,$(DIRCHAR),$(LIBDIRBASE)/obj$(LIB_BASE_NAME))
  91. endif
  92. endif # ifeq ($(LIB_BASE_NAME),)
  93. ## Build of specific target archive(s) via VX_ARCHIVE_LIST:
  94. # If VX_ARCHIVE_LIST is set only the specified target archive(s) are built. 
  95. # This means that source directories not contributing to these archive(s) 
  96. # are skipped. VX_ARCHIVE_LIST is used with CPU variant builds.
  97. ifneq ($(VX_ARCHIVE_LIST),)
  98. ifeq ($(LIB_BASE_NAME),)
  99. SKIP_DIR  = true
  100. else
  101. ifneq ($(filter lib$(LIB_BASE_NAME).a, $(VX_ARCHIVE_LIST)), 
  102.        lib$(LIB_BASE_NAME).a)
  103. SKIP_DIR  = true
  104. endif
  105. endif
  106. endif
  107. ## CPU variant builds:
  108. # List of CPU variant builds: CPU_VARIANT_TAG_LIST
  109. # This list is computed for the current CPU/TOOL combinaison. Note that CPU
  110. # variant build(s) are started as part of the 'Default' rule (see further below)
  111. ifneq ($(CPU_VARIANT_LIST),)
  112. CPU_VARIANT_TAG_LIST_TMP1 = 
  113.     $(foreach cpuVariantTag, $(CPU_VARIANT_LIST),
  114. $(filter $(CPU)$(TOOL),
  115.     $(CPU_VARIANT_CPU_TOOL_LIST$(cpuVariantTag)))$(cpuVariantTag))
  116. CPU_VARIANT_TAG_LIST_TMP2 = $(filter $(CPU)$(TOOL)%, 
  117. $(CPU_VARIANT_TAG_LIST_TMP1))
  118. CPU_VARIANT_TAG_LIST = $(patsubst $(CPU)$(TOOL)%, %,
  119.     $(CPU_VARIANT_TAG_LIST_TMP2))
  120. # Generate list of make commands for CPU variant builds: CPU_VARIANT_MAKE_CMD
  121. ifneq  ($(CPU_VARIANT_TAG_LIST),)
  122. CPU_VARIANT_MAKE_CMD = echo "Build of CPU variants"
  123. CPU_VARIANT_MAKE_CMD += $(foreach cpuVariant, $(CPU_VARIANT_TAG_LIST),         
  124.     $(CMD_SEPARATOR) $(MAKE) CPU=$(CPU) TOOL=$(TOOL) LIB_DIR_TAG=$(cpuVariant) 
  125. VX_ARCHIVE_LIST="$(VX_ARCHIVE_LIST$(cpuVariant))" TARGET=$(TARGET))
  126. endif
  127. endif
  128. include $(TGT_DIR)/h/make/defs.default
  129. include $(TGT_DIR)/h/tool/$(TOOL_FAMILY)/make.$(CPU)$(TOOL)
  130. include $(TGT_DIR)/h/make/defs.$(WIND_HOST_TYPE)
  131. ## implicit rules
  132. .s.o :
  133. @ $(RM) $@
  134. $(CC) $(CFLAGS_AS) $(CFLAGS_AS_$(<:.s=.o)) $(OPTION_OBJECT_ONLY) $(OPTION_OBJECT_NAME)$@ $<
  135. .c.o :
  136. @ $(RM) $@
  137. $(CC) $(CFLAGS) $(CFLAGS_$(<:.c=.o)) $(OPTION_OBJECT_ONLY) $<
  138. # rules to build objects in $(LIBDIR)
  139. $(LIBDIR)/%.o : %.c
  140. @ $(RM) $(subst /,$(DIRCHAR),$@)
  141. $(CC) $(CFLAGS) $(CFLAGS_$(<:.c=.o)) $(OPTION_OBJECT_ONLY) $(OPTION_OBJECT_NAME)$@ $<
  142. $(LIBDIR)/%.o : %.s
  143. @ $(RM) $(subst /,$(DIRCHAR),$@)
  144. $(CC) $(CFLAGS_AS) $(CFLAGS_AS_$(<:.s=.o)) $(OPTION_OBJECT_ONLY) $(OPTION_OBJECT_NAME)$@ $<
  145. # rule for munchless C++ compiles
  146. $(LIBDIR)/%.o : %.cpp
  147. @ $(RM) $(subst /,$(DIRCHAR),$@)
  148. $(CXX) $(C++FLAGS) $(CFLAGS_$(<:.cpp=.o)) $(OPTION_OBJECT_ONLY) $(OPTION_OBJECT_NAME)$@ $<
  149. ## Rule for standalone "munched" C++ modules.
  150. # In general the only library modules that should be munched are 
  151. # standalone test programs. Certainly nothing in the runtime should be 
  152. # munched until BSP or Project build time. If you want your
  153. # module to be munched, specify a .out target in $(OBJS) instead
  154. # of a .o.
  155. $(LIBDIR)/%.out : %.cpp
  156. @ $(RM) $@
  157. $(CXX) $(C++FLAGS) $(OPTION_OBJECT_ONLY) $(OPTION_OBJECT_NAME) 
  158.       $(basename $@).o $<
  159. @ $(RM) ctdt.c
  160. $(NM) $(basename $@).o | $(MUNCH) > ctdt.c
  161. $(MAKE) CC_COMPILER=$(OPTION_DOLLAR_SYMBOLS) ctdt.o
  162. $(LD_PARTIAL) $(LD_PARTIAL_LAST_FLAGS) $(OPTION_OBJECT_NAME)$@ $(basename $@).o ctdt.o
  163. @ $(RM) $(basename $@).o ctdt.c ctdt.o
  164. # rule for munchless C++ compiles
  165. .cpp.o :
  166. @ $(RM) $@
  167. $(CXX) $(C++FLAGS) $(OPTION_OBJECT_ONLY) $<
  168. .cxx.o :
  169. @ $(RM) $@
  170. $(CXX) $(C++FLAGS) $(OPTION_OBJECT_ONLY) $<
  171. # C++ compile and munch
  172. .cpp.out :
  173. @ $(RM) $@
  174. $(CXX) $(C++FLAGS) $(OPTION_OBJECT_ONLY) $<
  175. @ $(RM) $@ ctdt.c
  176. $(NM) $*.o | $(MUNCH) > ctdt.c
  177. $(MAKE) CC_COMPILER=$(OPTION_DOLLAR_SYMBOLS) ctdt.o
  178. $(LD_PARTIAL) $(LD_PARTIAL_LAST_FLAGS) $(OPTION_OBJECT_NAME)$@ $*.o ctdt.o
  179. @ $(RM) ctdt.c ctdt.o
  180. .cxx.out :
  181. @ $(RM) $@
  182. $(CXX) $(C++FLAGS) $(OPTION_OBJECT_ONLY) $<
  183. @ $(RM) $@ ctdt.c
  184. $(NM) $*.o | $(MUNCH) > ctdt.c
  185. $(MAKE) CC_COMPILER=$(OPTION_DOLLAR_SYMBOLS) ctdt.o
  186. $(LD_PARTIAL) $(LD_PARTIAL_LAST_FLAGS) $(OPTION_OBJECT_NAME)$@ $*.o ctdt.o
  187. @ $(RM) ctdt.c ctdt.o
  188. ## rules to construct object lists
  189. # vxWorks source distribution do not always have all of the
  190. # sources to object files specified in macro OBJS macro.
  191. # We use GNU make functions to find what we need to build
  192. # get the list of .c, .cpp and .s files
  193. FILE_LIST       = $(wildcard *.[cs]) $(wildcard *.cpp) $(INDIRECT_SOURCES)
  194. # Change .c to .o in FILE_LIST and store in TMP_LIST
  195. TMP_LIST        = $(FILE_LIST:.c=.o)
  196. # Change .cpp to .o in TMP_LIST and store in TMP1_LIST
  197. TMP1_LIST        = $(TMP_LIST:.cpp=.o)
  198. # We can also build .out files from .cpp files
  199. TMP2_LIST        = $(subst .cpp,.out,(filter %.cpp,$(FILE_LIST)))
  200. # Change .s to .o in TMP1_LIST, concat with TMP2_LIST, and store in 
  201. # OBJ_PRESENT. These are the objects we can build
  202. OBJ_PRESENT     = $(TMP1_LIST:.s=.o) $(TMP2_LIST)
  203. # Find the intersection of the objects we can build and the objects we'd
  204. # like to build
  205. # Normally we just build objects that can be built from source
  206. # files in this directory. However if BUILD_ALL_OBJS is non-empty
  207. # then trust the definition of $(OBJS).
  208. ifeq ($(BUILD_ALL_OBJS),)
  209. OBJS_TO_BUILD   = $(filter $(OBJ_PRESENT),$(OBJS))
  210. else
  211. OBJS_TO_BUILD   = $(OBJS)
  212. endif
  213. # Now we fix up where they will go once they are built
  214. LIBOBJS         = $(foreach file, $(OBJS_TO_BUILD), $(LIBDIR)/$(file))
  215. # It is safe to assume that if a subdirectory exists with a Makefile in it 
  216. # that we want to build it. If this is not the case one needs to over ride 
  217. # this definition in the Makefile for the directory in concern. 
  218. # NOTE: to over ride this definition one must define SUBDIRS before the
  219. # include directive for this file (rules.library) in the Makefile
  220. ifeq ($(SUBDIRS),)
  221. ALL_SUBDIRS = $(patsubst %/,%,$(dir $(wildcard */Makefile)))
  222. else
  223. ALL_SUBDIRS = $(SUBDIRS)
  224. endif
  225. SUBDIRS_TMP = $(filter-out $(EXCLUDE_SUBDIRS), $(ALL_SUBDIRS))
  226. override SUBDIRS := $(filter-out $(UNSUPPORTED_SUBDIRS), $(SUBDIRS_TMP))
  227. # architecturedb, and files which are generated from it
  228. # see the files in $(WIND_BASE)/host/src/cpuGen,
  229. # and the comments in architecturedb, for details
  230. ARCH_DB    = $(WIND_BASE)/host/resource/target/architecturedb
  231. ARCH_FILES = $(TGT_DIR)/src/arch/Makefile $(TGT_DIR)/h/types/vxCpu.h
  232. ## Default rule:
  233. # The default rule builds directories recursively starting from the top level
  234. # directory. For every directory, the selected archive is also created and/or
  235. # populated with object files. 
  236. # In addition CPU variant build(s) if enabled for the current CPU/TOOL 
  237. # combinaison are started at the end of the top level directory build 
  238. # (target/src/).
  239. # An empty lib$(CPU)$(TOOL)vx.a is created by this rule if no
  240. # lib$(CPU)$(TOOL)vx.a already exists.
  241. VX_LIB  = $(wildcard $(TGT_DIR)/lib/lib$(CPU)$(TOOL)vx.a)
  242. ifneq    ($(SKIP_DIR), true)
  243. Default: archdeps lib subdirs
  244. ifneq  ($(CPU_VARIANT_MAKE_CMD),)
  245. $(CPU_VARIANT_MAKE_CMD)
  246. endif
  247. ifeq  ($(VX_LIB),)
  248. $(AR) cru $(TGT_DIR)/lib/lib$(CPU)$(TOOL)vx.a
  249. endif
  250. ifneq ($(MAKETAIL),)
  251. ($(MAKE) -f Makefile CPU=$(CPU) TOOL=$(TOOL)
  252.  $(MAKETAIL)
  253.  MAKETAIL='')
  254. endif
  255. else
  256. Default: subdirs
  257. @echo skipping directory
  258. endif
  259. ## recursive clean rule
  260. rclean: 
  261. ifneq ($(SUBDIRS),)
  262. $(MAKE) CPU=$(CPU) TOOL=$(TOOL) TGT_DIR=$(TGT_DIR) 
  263. TARGET=rclean $(SUBDIRS)
  264. endif
  265. $(MAKE) CPU=$(CPU) TOOL=$(TOOL) TGT_DIR=$(TGT_DIR) clean
  266. ifeq ($(CLEANLIBS),YES)
  267. $(RM) $(wildcard $(TGT_DIR)/lib/lib$(CPU)$(TOOL)*.a)
  268. $(RM) $(wildcard $(TGT_DIR)/lib/$(VX_CPU_FAMILY)/$(CPU)/$(TOOL)/lib*.a)
  269. $(RMDIR) $(wildcard $(TGT_DIR)/lib/$(VX_CPU_FAMILY)/$(CPU)/$(TOOL)/obj*)
  270. $(RM) $(wildcard $(TGT_DIR)/lib/$(VX_CPU_FAMILY)/$(CPU)/$(TOOL_COMMON_DIR)/lib*.a)
  271. $(RMDIR) $(wildcard $(TGT_DIR)/lib/$(VX_CPU_FAMILY)/$(CPU)/$(TOOL_COMMON_DIR)/obj*)
  272. $(RMDIR) $(wildcard $(TGT_DIR)/lib/obj$(CPU)$(TOOL)*)
  273. endif
  274. # Make sure the object directory exists.
  275. ifneq ($(LIBDIR),$(TGT_DIR)/lib/)
  276. MAKE_LIBDIR = make_libdir
  277. make_libdir:
  278. -$(MKDIR) $(subst /,$(DIRCHAR),$(LIBDIR))
  279. endif
  280. # recursive build of all objects. The hope is that this rule will help
  281. # with parallel builds. Calling lib and subdirs with parallel builds
  282. # has the adverse effect of trying to create libraries from multiple
  283. # subdirectories that tends to destroy the library.
  284. all-objs : archdeps objs
  285. ifneq ($(SUBDIRS),)
  286. $(MAKE) CPU=$(CPU) TOOL=$(TOOL) TGT_DIR=$(TGT_DIR) 
  287. TARGET=all-objs $(SUBDIRS)
  288. endif
  289. # Just in case you want to build objects and not update the archives
  290. objs: archdeps $(MAKE_LIBDIR) $(LIBOBJS)
  291. release: archdeps
  292. $(MAKE) CPU=$(CPU) TOOL=$(TOOL) TGT_DIR=$(TGT_DIR) 
  293. TARGET=release
  294. # Files which are generated from the architecturedb
  295. archdeps:  $(ARCH_FILES)
  296. $(TGT_DIR)/h/types/vxCpu.h: $(TGT_DIR)/h/types/vxCpu.in $(ARCH_DB)
  297. cpuGen -t -i $< -o $@
  298. $(TGT_DIR)/src/arch/Makefile: $(TGT_DIR)/src/arch/Makefile.in $(ARCH_DB)
  299. cpuGen -m -i $< -o $@
  300. include $(TGT_DIR)/h/make/rules-lib.$(WIND_HOST_TYPE)
  301. # we don't need a dependency list if are not building objects
  302. ifneq ($(OBJS),)
  303. # We suppress the warning message about non existent file and setting of errno
  304. # by prepending - . GNU make allows this.
  305. -include depend.$(CPU)$(TOOL)
  306. endif