Guest User

Untitled

a guest
Dec 16th, 2010
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.31 KB | None | 0 0
  1.  
  2. #
  3. # Скрипт для управления процессом сборки из исходников на Си.
  4. # Скрипт может собирать исполняемый файлы, а также *.a и *.so библиотеки,
  5. # и автоматически отслеживать зависимости от заголовочных файлов.
  6. #
  7. # Два режима сборки:
  8. # 1. Из списка исходных файлов собирается один или несколько результирующих
  9. # файлов. (Например *.so и *.a библиотеку)
  10. # 2. Из одного исходного файла собирается один результирующий файл.
  11. # В пределах одного вызова make вы можете собрать любое количество файлов
  12. # с использованием второго режима и не более одного набора исходных файлов
  13. # с использованием первого режима.
  14. #
  15. # Входные данные для скрипта:
  16. #
  17. # BUILDDIR
  18. # Определяет каталог для результирующих файлов. Каталог указывается
  19. # относительно пути M_DIR_BUILD.
  20. #
  21. # TARGETS
  22. # Задаёт список целей, собирамых из одного множества файлов. Как правило,
  23. # указывается либо 1 исполняемый файл, либо *.so и *.a библиотеки.
  24. # После сборки цели помещаются в каталог, определяемый переменной BUILDDIR.
  25. #
  26. # SOURCES
  27. # Список исходных файлов для TARGETS. Файлы в данном списке указываются без
  28. # расширения .с.
  29. #
  30. # TARGETS_1X1
  31. # Список целей, собираемых из одного файла с соответсвующим именем.
  32. #
  33. # USING_LIB_SO
  34. # Список динамических библиотек, от которых зависят цели. Имена библиотек
  35. # указываются без префикса lib и без суффикса .so.
  36. #
  37. # USING_LIB_A
  38. # Список статических библиотек, от которых зависят цели. Имена библиотек
  39. # указываются без префикса lib и без суффикса .a.
  40. #
  41. #
  42. # CC
  43. # Команда для сборки и линковки файлов.
  44. #
  45. # AR
  46. # Команда для сборки архива статической библиотеки.
  47. #
  48. # CFLAGS
  49. # Параметры, передаваемые всем вызовам CC.
  50. #
  51. # CFLAGS_O
  52. # Параметры, передаваемые CC, при сборке обьектных файлов не в PIC-режиме.
  53. #
  54. # CFLAGS_O_имя
  55. # Параметры, передаваемые CC, при сборке обьектного файла для исходника 'имя'.
  56. #
  57. #
  58. # CFLAGS_PIC_O
  59. # Параметры, передаваемые CC, при сборке обьектных файлов в PIC-режиме.
  60. #
  61. # CFLAGS_PIC_O_имя
  62. # Параметры, передаваемые CC, при сборке обьектного файла в PIC-режиме для исходника 'имя'.
  63. #
  64. # LFLAGS
  65. # Параметры, передаваемые CC, при линковке любого файла.
  66. #
  67. # LFLAGS_EXE
  68. # Параметры, передаваемые CC, при линковке исполняемого файла.
  69. #
  70. # LFLAGS_SO
  71. # Параметры, передаваемые CC, при линковке *.so библиотеки.
  72. #
  73. # LFLAGS_T_имя
  74. # Параметры, передаваемые CC, при линковке целевого файла 'имя'.
  75. #
  76. # STDDEPS
  77. # Зависимости, подключаемые ко всем собираемым файлам.
  78. #
  79. # STDDEPS_EXE
  80. # Зависимости, подключаемые ко всем собираемым исполнямым файлам.
  81. #
  82. #
  83. #
  84. #
  85. #
  86. #
  87. #
  88.  
  89.  
  90. #############################################################################
  91.  
  92. all: all_local
  93.  
  94. clean: clean_local
  95.  
  96.  
  97. WD = $(subst $(M_DIR_ROOT)/,,$(shell pwd))
  98.  
  99. BUILDDIR_T := $(M_DIR_BUILD)/$(BUILDDIR)
  100. BUILDDIR_O := $(M_DIR_OBJ)/$(WD)
  101.  
  102. _TARGETS := $(addprefix $(BUILDDIR_T)/, $(TARGETS))
  103. _TARGETS_1X1 := $(addprefix $(BUILDDIR_T)/, $(TARGETS_1X1))
  104. _OBJS := $(addsuffix .o,$(addprefix $(BUILDDIR_O)/, $(SOURCES)))
  105. _PICOBJS := $(addsuffix .pic.o,$(addprefix $(BUILDDIR_O)/, $(SOURCES)))
  106. _OBJS_1X1 := $(addsuffix .o,$(addprefix $(BUILDDIR_O)/, $(TARGETS_1X1)))
  107. _PICOBJS_1X1 := $(addsuffix .pic.o,$(addprefix $(BUILDDIR_O)/, $(TARGETS_1X1)))
  108. _DEPS := $(sort $(_OBJS) $(_PICOBJS) $(_OBJS_1X1) $(_PICOBJS_1X1))
  109. _TARGET_HELPFILES := $(addsuffix .txt,$(addprefix $(M_DIR_BUILD)/$(M_P_HELPFILES)/, $(TARGET_HELPFILES)))
  110.  
  111. _DEP_LIB_A = $(addsuffix .a,$(addprefix $(LIBDIR)/lib, $(USING_LIB_A)))
  112.  
  113. _CMD_GEN_RULE = $(shell \
  114. echo '$(1): $(2) $$(STDDEPS) $$(_DEP_LIB_A) $(4)' >> $(BUILDDIR_O)/.makefile && \
  115. echo ' $$(call $(3), $(2))' >> $(BUILDDIR_O)/.makefile \
  116. )
  117.  
  118.  
  119. __dummy := $(shell mkdir -p $(BUILDDIR_O) && echo "" > $(BUILDDIR_O)/.makefile)
  120.  
  121. __dummy := $(foreach t,$(filter %.so,$(_TARGETS)),$(call _CMD_GEN_RULE,$t,$(_PICOBJS),CMD_BUILD_SO,))
  122. __dummy := $(foreach t,$(filter %.a,$(_TARGETS)),$(call _CMD_GEN_RULE,$t,$(_OBJS),CMD_BUILD_A,))
  123. __dummy := $(foreach t,$(filter-out %.a %.so,$(_TARGETS)),$(call _CMD_GEN_RULE,$t,$(_OBJS),CMD_BUILD_EXE,$$(STDDEPS_EXE)))
  124.  
  125. __dummy := $(foreach t,$(filter %.so,$(TARGETS_1X1)),$(call _CMD_GEN_RULE,$(BUILDDIR_T)/$t,$(BUILDDIR_O)/$t.pic.o,CMD_BUILD_EXE,))
  126. __dummy := $(foreach t,$(filter %.a,$(TARGETS_1X1)),$(call _CMD_GEN_RULE,$(BUILDDIR_T)/$t,$(BUILDDIR_O)/$t.o,CMD_BUILD_EXE,))
  127. __dummy := $(foreach t,$(filter-out %.a %.so,$(TARGETS_1X1)),$(call _CMD_GEN_RULE,$(BUILDDIR_T)/$t,$(BUILDDIR_O)/$t.o,CMD_BUILD_EXE,$$(STDDEPS_EXE)))
  128.  
  129. __dummy := $(foreach t,$(TARGET_HELPFILES),$(call _CMD_GEN_RULE,$(M_DIR_BUILD)/$(M_P_HELPFILES)/$(t).txt,$(t).c,CMD_BUILD_HELPFILE,))
  130.  
  131.  
  132. # Targets
  133.  
  134. all_local: target-dirs $(_TARGETS) $(_TARGETS_1X1) $(_TARGET_HELPFILES)
  135.  
  136. target-dirs:
  137. $(Q)echo "===> "$(WD) && \
  138. mkdir -p $(BUILDDIR_T)
  139.  
  140. CMD_BUILD_O = \
  141. $(Q)echo "CC "$(subst $(M_DIR_ROOT)/,,$@) && \
  142. mkdir -p $(dir $(M_DIR_DEP)/[email protected])&& \
  143. mkdir -p $(dir $@) && \
  144. $(CC) $(CFLAGS) $(CFLAGS_O) $(CFLAGS_O_$(basename $(notdir $@))) -c $(1) -o $@ -MD -MP -MF $(M_DIR_DEP)/[email protected]
  145.  
  146. CMD_BUILD_PIC_O = \
  147. $(Q)echo "CC "$(subst $(M_DIR_ROOT)/,,$@) && \
  148. mkdir -p $(dir $(M_DIR_DEP)/[email protected]) && \
  149. mkdir -p $(dir $@) && \
  150. $(CC) $(CFLAGS) $(CFLAGS_PIC_O) $(CFLAGS_PIC_O_$(basename $(notdir $@))) -fpic -c $(1) -o $@ -MD -MP -MF $(M_DIR_DEP)/[email protected]
  151.  
  152. CMD_BUILD_EXE = \
  153. $(Q)echo "LD "$(subst $(M_DIR_ROOT)/,,$@) && \
  154. mkdir -p $(dir $@) && \
  155. $(CC) $(CFLAGS) $(LFLAGS) $(LFLAGS_EXE) $(LFLAGS_T_$(basename $(notdir $@))) $(1) $(addprefix -l,$(USING_LIB_SO) $(USING_LIB_A) $(USING_LIB_NO_DEP)) -o $@ && \
  156. $(CMD_AFTER_BUILD_T_$(basename $(notdir $@)))\
  157. strip -s -R.comment $@ \
  158.  
  159. CMD_BUILD_SO = \
  160. $(Q)echo "LD "$(subst $(M_DIR_ROOT)/,,$@) && \
  161. mkdir -p $(dir $@) && \
  162. $(CC) -shared $(CFLAGS) $(LFLAGS) $(LFLAGS_SO) $(LFLAGS_T_$(basename $(notdir $@))) $(1) $(LFLAGS__) $(addprefix -l,$(USING_LIB_SO) $(USING_LIB_A) $(USING_LIB_NO_DEP)) -o $@ && \
  163. strip -s -R.comment $@
  164.  
  165. CMD_BUILD_HELPFILE = \
  166. $(Q)echo "HELP "$(subst $(M_DIR_ROOT)/,,$@) && \
  167. mkdir -p $(dir $@) && \
  168. $(M_DIR_UTILS)/mkhelpfile.sh $(1) $@
  169.  
  170. CMD_BUILD_A = \
  171. $(Q)echo "AR "$(subst $(M_DIR_ROOT)/,,$@) && \
  172. mkdir -p $(dir $@) && \
  173. $(AR) -rs $@ $(1)
  174.  
  175. $(BUILDDIR_O)/%.o: %.s $(STDDEPS)
  176. $(call CMD_BUILD_O, $<)
  177.  
  178. $(BUILDDIR_O)/%.o: %.c $(STDDEPS)
  179. $(call CMD_BUILD_O, $<)
  180.  
  181. $(BUILDDIR_O)/%.pic.o: %.c $(STDDEPS)
  182. $(call CMD_BUILD_PIC_O, $<)
  183.  
  184. $(BUILDDIR_T)/%: $(BUILDDIR_O)/%.o $(STDDEPS) $(STDDEPS_EXE)
  185. $(call CMD_BUILD_EXE, $<)
  186.  
  187. $(BUILDDIR_T)/%.so: $(BUILDDIR_O)/%.o $(STDDEPS)
  188. $(call CMD_BUILD_SO, $<)
  189.  
  190. $(BUILDDIR_T)/%.a: $(BUILDDIR_O)/%.o $(STDDEPS)
  191. $(call CMD_BUILD_A, $<)
  192.  
  193. include $(BUILDDIR_O)/.makefile
  194.  
  195. -include $(addsuffix .dep, $(addprefix $(M_DIR_DEP)/, $(_DEPS)))
  196.  
  197. clean_local:
  198. rm -Rf *~ *.o core $(addprefix $(M_DIR_DEP)/, $(_DEPS)) $(_DEPS)
Advertisement
Add Comment
Please, Sign In to add comment