Czy w pliku makefile nazwa katalogu jest fałszywym celem czy "prawdziwym" celem?

Zgodnie z tym, co czytałem o makefiles, fałszywy cel to każdy cel, który nie odpowiada rzeczywistej nazwie pliku. Moja intuicja mówi, że katalog jako cel będzie traktowany tak samo jak plik.

Dlaczego to jest ważne? Mam katalog jako cel w moim pliku makefile. kiedy mam go jako warunek wstępny do mojego podstawowego pliku wykonywalnego, ten plik wykonywalny zawsze jest tworzony, niezależnie od tego, czy wszystko jest aktualne. Jeśli wezmę to jako warunek wstępny, mój plik makefile jest mądry wystarczająco, aby wiedzieć, kiedy trzeba coś zbudować, ale mam problem nie wiedząc, czy katalog musi być utworzony. Zgodnie z tym, co czytałem o make, wszelkie fałszywe cele nie są dobre jako warunki wstępne, ponieważ make nie wie, czy są aktualne, więc zawsze będą odbudowywać powiązany cel. Oto fragment mojego pliku makefile.
$(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;

Więc w tym przypadku, jest ${OBJ_DIR}, Nazwa katalogu, fałszywy cel czy nie?

Author: Chance, 2010-11-22

2 answers

Edit: dotyczy to tylko GNU make-słuszne założenie biorąc pod uwagę tag "linux".

Twój cel jest prawdziwym celem, a nie fałszywym. Problem polega na tym, że katalog wyjściowy zostanie zaktualizowany, gdy umieścisz w nim cele, tak aby był zawsze nowszy niż cel. Oznacza to, że twój cel zawsze zostanie zbudowany, ponieważ jest nieaktualny w odniesieniu do jego zależności.

To, czego potrzebujesz, to warunek konieczny tylko do zamówienia . Te warunki wstępne pozwalają określić, że potrzebuje do zbudowania, jeśli nie istnieje, ale nie zwracać uwagi na znacznik czasu. Oznacza to, że cel nie będzie nieaktualny w odniesieniu do warunków wstępnych tylko dla zamówień.

Podajesz to tak:

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

Wszystko po pionowym pasku jest warunkiem tylko zamówienia.

Możesz teraz uprościć swój cel OBJ_DIR:

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

Uwaga: użyłem składni ${OBJ_DIR} zamiast $(OBJ_DIR), ponieważ tego właśnie użyłeś. Warunki wstępne tylko zamówienia nie zależą od tej składni.

 27
Author: camh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-15 05:10:24

To prawdziwy cel.

Fałszywe cele nie są wykrywane automatycznie przez system make - muszą być zidentyfikowane przez Ciebie, za pomocą .PHONY celu.

Sensowne fałszywe cele obejmują all i clean - nie odpowiadają one rzeczywistym plikom, ale akcjom , które chcesz wykonać w pliku makefile. Oto jak wyjaśnić to zrobić:

.PHONY: all clean install test

Katalogi są legalnymi celami reguł makefile. Nie powinieneś robić tych fałszywych.

mydir:
     mkdir mydir

The .PHONY cel jest oczywiście fałszywy.

Dokumentacja GNU znajduje się tutaj .

 7
Author: Alex Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-22 17:37:53