Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #
- # Скрипт для управления процессом сборки из исходников на Си.
- # Скрипт может собирать исполняемый файлы, а также *.a и *.so библиотеки,
- # и автоматически отслеживать зависимости от заголовочных файлов.
- #
- # Два режима сборки:
- # 1. Из списка исходных файлов собирается один или несколько результирующих
- # файлов. (Например *.so и *.a библиотеку)
- # 2. Из одного исходного файла собирается один результирующий файл.
- # В пределах одного вызова make вы можете собрать любое количество файлов
- # с использованием второго режима и не более одного набора исходных файлов
- # с использованием первого режима.
- #
- # Входные данные для скрипта:
- #
- # BUILDDIR
- # Определяет каталог для результирующих файлов. Каталог указывается
- # относительно пути M_DIR_BUILD.
- #
- # TARGETS
- # Задаёт список целей, собирамых из одного множества файлов. Как правило,
- # указывается либо 1 исполняемый файл, либо *.so и *.a библиотеки.
- # После сборки цели помещаются в каталог, определяемый переменной BUILDDIR.
- #
- # SOURCES
- # Список исходных файлов для TARGETS. Файлы в данном списке указываются без
- # расширения .с.
- #
- # TARGETS_1X1
- # Список целей, собираемых из одного файла с соответсвующим именем.
- #
- # USING_LIB_SO
- # Список динамических библиотек, от которых зависят цели. Имена библиотек
- # указываются без префикса lib и без суффикса .so.
- #
- # USING_LIB_A
- # Список статических библиотек, от которых зависят цели. Имена библиотек
- # указываются без префикса lib и без суффикса .a.
- #
- #
- # CC
- # Команда для сборки и линковки файлов.
- #
- # AR
- # Команда для сборки архива статической библиотеки.
- #
- # CFLAGS
- # Параметры, передаваемые всем вызовам CC.
- #
- # CFLAGS_O
- # Параметры, передаваемые CC, при сборке обьектных файлов не в PIC-режиме.
- #
- # CFLAGS_O_имя
- # Параметры, передаваемые CC, при сборке обьектного файла для исходника 'имя'.
- #
- #
- # CFLAGS_PIC_O
- # Параметры, передаваемые CC, при сборке обьектных файлов в PIC-режиме.
- #
- # CFLAGS_PIC_O_имя
- # Параметры, передаваемые CC, при сборке обьектного файла в PIC-режиме для исходника 'имя'.
- #
- # LFLAGS
- # Параметры, передаваемые CC, при линковке любого файла.
- #
- # LFLAGS_EXE
- # Параметры, передаваемые CC, при линковке исполняемого файла.
- #
- # LFLAGS_SO
- # Параметры, передаваемые CC, при линковке *.so библиотеки.
- #
- # LFLAGS_T_имя
- # Параметры, передаваемые CC, при линковке целевого файла 'имя'.
- #
- # STDDEPS
- # Зависимости, подключаемые ко всем собираемым файлам.
- #
- # STDDEPS_EXE
- # Зависимости, подключаемые ко всем собираемым исполнямым файлам.
- #
- #
- #
- #
- #
- #
- #
- #############################################################################
- all: all_local
- clean: clean_local
- WD = $(subst $(M_DIR_ROOT)/,,$(shell pwd))
- BUILDDIR_T := $(M_DIR_BUILD)/$(BUILDDIR)
- BUILDDIR_O := $(M_DIR_OBJ)/$(WD)
- _TARGETS := $(addprefix $(BUILDDIR_T)/, $(TARGETS))
- _TARGETS_1X1 := $(addprefix $(BUILDDIR_T)/, $(TARGETS_1X1))
- _OBJS := $(addsuffix .o,$(addprefix $(BUILDDIR_O)/, $(SOURCES)))
- _PICOBJS := $(addsuffix .pic.o,$(addprefix $(BUILDDIR_O)/, $(SOURCES)))
- _OBJS_1X1 := $(addsuffix .o,$(addprefix $(BUILDDIR_O)/, $(TARGETS_1X1)))
- _PICOBJS_1X1 := $(addsuffix .pic.o,$(addprefix $(BUILDDIR_O)/, $(TARGETS_1X1)))
- _DEPS := $(sort $(_OBJS) $(_PICOBJS) $(_OBJS_1X1) $(_PICOBJS_1X1))
- _TARGET_HELPFILES := $(addsuffix .txt,$(addprefix $(M_DIR_BUILD)/$(M_P_HELPFILES)/, $(TARGET_HELPFILES)))
- _DEP_LIB_A = $(addsuffix .a,$(addprefix $(LIBDIR)/lib, $(USING_LIB_A)))
- _CMD_GEN_RULE = $(shell \
- echo '$(1): $(2) $$(STDDEPS) $$(_DEP_LIB_A) $(4)' >> $(BUILDDIR_O)/.makefile && \
- echo ' $$(call $(3), $(2))' >> $(BUILDDIR_O)/.makefile \
- )
- __dummy := $(shell mkdir -p $(BUILDDIR_O) && echo "" > $(BUILDDIR_O)/.makefile)
- __dummy := $(foreach t,$(filter %.so,$(_TARGETS)),$(call _CMD_GEN_RULE,$t,$(_PICOBJS),CMD_BUILD_SO,))
- __dummy := $(foreach t,$(filter %.a,$(_TARGETS)),$(call _CMD_GEN_RULE,$t,$(_OBJS),CMD_BUILD_A,))
- __dummy := $(foreach t,$(filter-out %.a %.so,$(_TARGETS)),$(call _CMD_GEN_RULE,$t,$(_OBJS),CMD_BUILD_EXE,$$(STDDEPS_EXE)))
- __dummy := $(foreach t,$(filter %.so,$(TARGETS_1X1)),$(call _CMD_GEN_RULE,$(BUILDDIR_T)/$t,$(BUILDDIR_O)/$t.pic.o,CMD_BUILD_EXE,))
- __dummy := $(foreach t,$(filter %.a,$(TARGETS_1X1)),$(call _CMD_GEN_RULE,$(BUILDDIR_T)/$t,$(BUILDDIR_O)/$t.o,CMD_BUILD_EXE,))
- __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)))
- __dummy := $(foreach t,$(TARGET_HELPFILES),$(call _CMD_GEN_RULE,$(M_DIR_BUILD)/$(M_P_HELPFILES)/$(t).txt,$(t).c,CMD_BUILD_HELPFILE,))
- # Targets
- all_local: target-dirs $(_TARGETS) $(_TARGETS_1X1) $(_TARGET_HELPFILES)
- target-dirs:
- $(Q)echo "===> "$(WD) && \
- mkdir -p $(BUILDDIR_T)
- CMD_BUILD_O = \
- $(Q)echo "CC "$(subst $(M_DIR_ROOT)/,,$@) && \
- mkdir -p $(dir $(M_DIR_DEP)/[email protected])&& \
- mkdir -p $(dir $@) && \
- $(CC) $(CFLAGS) $(CFLAGS_O) $(CFLAGS_O_$(basename $(notdir $@))) -c $(1) -o $@ -MD -MP -MF $(M_DIR_DEP)/[email protected]
- CMD_BUILD_PIC_O = \
- $(Q)echo "CC "$(subst $(M_DIR_ROOT)/,,$@) && \
- mkdir -p $(dir $(M_DIR_DEP)/[email protected]) && \
- mkdir -p $(dir $@) && \
- $(CC) $(CFLAGS) $(CFLAGS_PIC_O) $(CFLAGS_PIC_O_$(basename $(notdir $@))) -fpic -c $(1) -o $@ -MD -MP -MF $(M_DIR_DEP)/[email protected]
- CMD_BUILD_EXE = \
- $(Q)echo "LD "$(subst $(M_DIR_ROOT)/,,$@) && \
- mkdir -p $(dir $@) && \
- $(CC) $(CFLAGS) $(LFLAGS) $(LFLAGS_EXE) $(LFLAGS_T_$(basename $(notdir $@))) $(1) $(addprefix -l,$(USING_LIB_SO) $(USING_LIB_A) $(USING_LIB_NO_DEP)) -o $@ && \
- $(CMD_AFTER_BUILD_T_$(basename $(notdir $@)))\
- strip -s -R.comment $@ \
- CMD_BUILD_SO = \
- $(Q)echo "LD "$(subst $(M_DIR_ROOT)/,,$@) && \
- mkdir -p $(dir $@) && \
- $(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 $@ && \
- strip -s -R.comment $@
- CMD_BUILD_HELPFILE = \
- $(Q)echo "HELP "$(subst $(M_DIR_ROOT)/,,$@) && \
- mkdir -p $(dir $@) && \
- $(M_DIR_UTILS)/mkhelpfile.sh $(1) $@
- CMD_BUILD_A = \
- $(Q)echo "AR "$(subst $(M_DIR_ROOT)/,,$@) && \
- mkdir -p $(dir $@) && \
- $(AR) -rs $@ $(1)
- $(BUILDDIR_O)/%.o: %.s $(STDDEPS)
- $(call CMD_BUILD_O, $<)
- $(BUILDDIR_O)/%.o: %.c $(STDDEPS)
- $(call CMD_BUILD_O, $<)
- $(BUILDDIR_O)/%.pic.o: %.c $(STDDEPS)
- $(call CMD_BUILD_PIC_O, $<)
- $(BUILDDIR_T)/%: $(BUILDDIR_O)/%.o $(STDDEPS) $(STDDEPS_EXE)
- $(call CMD_BUILD_EXE, $<)
- $(BUILDDIR_T)/%.so: $(BUILDDIR_O)/%.o $(STDDEPS)
- $(call CMD_BUILD_SO, $<)
- $(BUILDDIR_T)/%.a: $(BUILDDIR_O)/%.o $(STDDEPS)
- $(call CMD_BUILD_A, $<)
- include $(BUILDDIR_O)/.makefile
- -include $(addsuffix .dep, $(addprefix $(M_DIR_DEP)/, $(_DEPS)))
- clean_local:
- rm -Rf *~ *.o core $(addprefix $(M_DIR_DEP)/, $(_DEPS)) $(_DEPS)
Advertisement
Add Comment
Please, Sign In to add comment