Плоский вывод структуры каталогов объектного файла с GNU Делает

После выполнения больших операций манипулирования данными часто необходимо обновлять базовые индексы. Можно сделать это при помощи UPDATE STATISTICS [таблица] оператор.

другая опция состоит в том, чтобы отбросить и воссоздать индекс, который, если Вы делаете большие вставки данных, вероятно, выполнит вставки намного быстрее. Можно даже включить это в хранимую процедуру.

9
задан Justicle 2 September 2009 в 00:21
поделиться

3 ответа

Есть как минимум два способа сделать это. Во-первых (и что я бы порекомендовал) вы можете добавить каталог сборки к целевым именам (даже при использовании шаблонного правила). Например:

$(OBJS) : build/%.o : %.cpp

Во-вторых, вы можете использовать переменную VPATH, чтобы указать программе make искать необходимые компоненты в другом каталоге. Это, вероятно, наиболее часто используемый подход. У него есть, по крайней мере, один серьезный недостаток, и если вы воспользуетесь им, а позже столкнетесь с проблемами с «дубликатами», то решить проблему не удастся. При первом подходе вы всегда можете отразить структуру исходных каталогов под каталогом сборки, чтобы избежать конфликтов дубликатов.

Изменить: В моем предыдущем ответе было немного мало деталей, поэтому я расширю его, чтобы показать, что это действительно работает как рекламируется. Вот полный рабочий пример Makefile, который использует первый метод, описанный выше, для решения проблемы. Просто вставьте это в Makefile и запустите make - все остальное он сделает и покажет, что это действительно работает.

Изменить: Я не могу понять, как заставить SO разрешать символы табуляции в моем ответе текст (он заменил их пробелами). После копирования и вставки этого примера вам нужно будет преобразовать начальные пробелы в командных сценариях в табуляции.

BUILD_DIR := build

SRCS := \
    a.c \
    b.c \
    c.c \
    a/a.c \
    b/b.c \
    c/c.c

OBJS := ${SRCS:%.c=${BUILD_DIR}/%.o}

foo: ${OBJS}
    @echo Linking $@ using $?
    @touch $@

${BUILD_DIR}/%.o: %.c
    @mkdir -p $(dir $@)
    @echo Compiling $< ...
    @touch $@

${SRCS}:
    @echo Creating $@
    @mkdir -p $(dir $@)
    @touch $@

.PHONY: clean
clean:
    rm -f foo
    rm -f ${OBJS}

В частности, обратите внимание, что есть исходные файлы с повторяющимися именами (ac и a / ac, bc и b / bc и т. д.), и это не вызывает никаких проблем. Также обратите внимание, что VPATH не используется, чего я рекомендую избегать из-за присущих ему ограничений.

Просто вставьте это в Makefile и запустите make - все остальное он сделает и покажет, что это действительно работает.

Изменить: Я не могу понять, как заставить SO разрешать символы табуляции в моем ответе текст (он заменил их пробелами). После копирования и вставки этого примера вам необходимо преобразовать начальные пробелы в командных сценариях в табуляции.

BUILD_DIR := build

SRCS := \
    a.c \
    b.c \
    c.c \
    a/a.c \
    b/b.c \
    c/c.c

OBJS := ${SRCS:%.c=${BUILD_DIR}/%.o}

foo: ${OBJS}
    @echo Linking $@ using $?
    @touch $@

${BUILD_DIR}/%.o: %.c
    @mkdir -p $(dir $@)
    @echo Compiling $< ...
    @touch $@

${SRCS}:
    @echo Creating $@
    @mkdir -p $(dir $@)
    @touch $@

.PHONY: clean
clean:
    rm -f foo
    rm -f ${OBJS}

В частности, обратите внимание, что есть исходные файлы с повторяющимися именами (ac и a / ac, bc и b / bc и т. д.), и это не вызывает никаких проблем. Также обратите внимание, что VPATH не используется, чего я рекомендую избегать из-за присущих ему ограничений.

Просто вставьте это в Makefile и запустите make - все остальное он сделает и покажет, что это действительно работает.

Изменить: Я не могу понять, как заставить SO разрешать символы табуляции в моем ответе текст (он заменил их пробелами). После копирования и вставки этого примера вам необходимо преобразовать начальные пробелы в командных сценариях в табуляции.

BUILD_DIR := build

SRCS := \
    a.c \
    b.c \
    c.c \
    a/a.c \
    b/b.c \
    c/c.c

OBJS := ${SRCS:%.c=${BUILD_DIR}/%.o}

foo: ${OBJS}
    @echo Linking $@ using $?
    @touch $@

${BUILD_DIR}/%.o: %.c
    @mkdir -p $(dir $@)
    @echo Compiling $< ...
    @touch $@

${SRCS}:
    @echo Creating $@
    @mkdir -p $(dir $@)
    @touch $@

.PHONY: clean
clean:
    rm -f foo
    rm -f ${OBJS}

В частности, обратите внимание, что есть исходные файлы с повторяющимися именами (ac и a / ac, bc и b / bc и т. д.), и это не вызывает никаких проблем. Также обратите внимание, что VPATH не используется, чего я рекомендую избегать из-за присущих ему ограничений.

вам нужно будет преобразовать начальные пробелы в командных сценариях в табуляции.

BUILD_DIR := build

SRCS := \
    a.c \
    b.c \
    c.c \
    a/a.c \
    b/b.c \
    c/c.c

OBJS := ${SRCS:%.c=${BUILD_DIR}/%.o}

foo: ${OBJS}
    @echo Linking $@ using $?
    @touch $@

${BUILD_DIR}/%.o: %.c
    @mkdir -p $(dir $@)
    @echo Compiling $< ...
    @touch $@

${SRCS}:
    @echo Creating $@
    @mkdir -p $(dir $@)
    @touch $@

.PHONY: clean
clean:
    rm -f foo
    rm -f ${OBJS}

В частности, обратите внимание, что есть исходные файлы с повторяющимися именами (ac и a / ac, bc и b / bc и т. д.), и это не Не вызывает никаких проблем. Также обратите внимание, что VPATH не используется, чего я рекомендую избегать из-за присущих ему ограничений.

вам нужно будет преобразовать начальные пробелы в командных сценариях в табуляции.

BUILD_DIR := build

SRCS := \
    a.c \
    b.c \
    c.c \
    a/a.c \
    b/b.c \
    c/c.c

OBJS := ${SRCS:%.c=${BUILD_DIR}/%.o}

foo: ${OBJS}
    @echo Linking $@ using $?
    @touch $@

${BUILD_DIR}/%.o: %.c
    @mkdir -p $(dir $@)
    @echo Compiling $< ...
    @touch $@

${SRCS}:
    @echo Creating $@
    @mkdir -p $(dir $@)
    @touch $@

.PHONY: clean
clean:
    rm -f foo
    rm -f ${OBJS}

В частности, обратите внимание, что есть исходные файлы с повторяющимися именами (ac и a / ac, bc и b / bc и т. д.), и это не Не вызывает никаких проблем. Также обратите внимание, что VPATH не используется, чего я рекомендую избегать из-за присущих ему ограничений.

9
ответ дан 4 December 2019 в 15:22
поделиться
vpath %.cpp src src/b src/c

Затем обращайтесь к исходным файлам без имени их каталога; Make будет искать vpath .

2
ответ дан 4 December 2019 в 15:22
поделиться

Создание плоской структуры каталогов в соответствии с первоначальным запросом.

Использует vpath для отслеживания исходных файлов, но все ведение документации выполняется автоматически из Список SRC .

SRC = a/a.c a/aa.c b/b.c
TARGET = done

FILES = $(notdir $(SRC) )
#make list of source paths, sort also removes duplicates
PATHS = $(sort $(dir $(SRC) ) )

BUILD_DIR = build
OBJ = $(addprefix $(BUILD_DIR)/, $(FILES:.c=.o))
DEP = $(OBJ:.o=.d)

# default target before includes
all: $(TARGET)

include $(DEP)

vpath %.c $(PATHS)

# create dummy dependency files to bootstrap the process
%.d:
    echo a=1 >$@

$(BUILD_DIR)/%.o:%.c
    echo $@: $< > $(patsubst %.o,%.d,$@)
    echo $< >$@

$(TARGET): $(OBJ)
    echo $^ > $@

.PHONY: clean
clean:
    del $(BUILD_DIR)/*.o
    del $(BUILD_DIR)/*.d

Извините за уродливые echo , но у меня был только ящик с выигрышем, чтобы проверить его.

1
ответ дан 4 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: