Подтвердить что ты не робот

В make файле имя каталога является фальшивой целью или "реальной" целью?

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

Почему это важно? У меня есть каталог в качестве цели в моем make файле. когда у меня есть это как предварительное условие для моего основного исполняемого файла, этот исполняемый файл всегда создается, независимо от того, обновляется или нет. Если я выберу это как предварительное условие, мой make файл достаточно умен, чтобы знать, когда нужно строить вещи, но у меня есть проблема не знать, нужно ли создавать каталог. Согласно тому, что я прочитал о make, любые фиктивные цели не являются хорошими предпосылками, потому что make не знает, являются ли они актуальными, поэтому они всегда будут восстанавливать связанную цель. Вот выдержка из моего make файла.

$(EXEC_WITH_PATH): ${OBJ_DIR} $(DPEND) $(OBJS)
    @echo "--------------------------------------------";
    @echo "$(THIS_DIR)  $(MACHINE)";
    @echo "Linking Shared Library";
    @echo "ar -rc $(EXEC_WITH_PATH) INSERT::{OBJS}";
    ar -rc $(EXEC_WITH_PATH)  $(OBJS);
    @echo "--------------------------------------------";


# Make dirs for object code and links
${OBJ_DIR} :
        @if [ ! -d ${OBJ_DIR} ]; then \
                mkdir ${OBJ_DIR};    \
        fi;

Итак, в этом случае, ${OBJ_DIR}, имя каталога, фальшивая цель или нет?

4b9b3361

Ответ 1

Изменить: это применимо только к GNU make - справедливому допущению с учетом тега linux.

Ваша цель - настоящая цель, а не PHONY. Проблема в том, что выходной каталог обновляется, когда вы помещаете в него цели, чтобы он всегда был более новым, чем ваша цель. Это означает, что ваша цель всегда будет построена, потому что она устарела в отношении ее зависимостей.

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

Вы указываете его следующим образом:

$(EXEC_WITH_PATH): $(DPEND) $(OBJS) | ${OBJ_DIR}
...

Все, что требуется после вертикальной полосы, является предварительным условием для заказа.

Теперь вы можете сделать свою цель OBJ_DIR более простой:

${OBJ_DIR} :
        mkdir -p ${OBJ_DIR}

Примечание. Я использовал синтаксис ${OBJ_DIR} вместо $(OBJ_DIR), потому что это то, что вы использовали. Предварительные требования только для заказа не зависят от этого синтаксиса.

Ответ 2

Это настоящая цель.

Фиксированные цели автоматически не распознаются системой make - они должны быть идентифицированы вами, используя цель .PHONY.

Чувствительные фальшивые цели включают all и clean - они не соответствуют реальным файлам, а действиям, которые вы хотите сделать make файл. Вот как это объяснить:

.PHONY: all clean install test

Каталоги являются законными целями правил makefile. Вы не должны делать эти фальшивые слова.

mydir:
     mkdir mydir

Цель .PHONY, конечно, фальшивая.

Документация GNU можно найти здесь.