Make clean не удалит файлы в других каталогах - PullRequest
0 голосов
/ 07 октября 2019

Моя проблема в том, что при запуске «make clean» он не удалит ни один из файлов, включая предварительно скомпилированные заголовочные файлы в каталоге m (не уверен в других каталогах, поскольку у них не было файлов для удаления). Тем не менее, он удаляет все файлы в корневом каталоге, где находится make-файл. Обратите внимание, что M, D, N и G - это все подкаталоги каталога, в котором находится make-файл. Кроме того, я попытался вручную выполнить каждую из команд терминала, указанных для очистки, и он успешно удалил все файлы в каталоге m икорневой каталог без ошибок. Я не знаю, почему есть несоответствие, любая помощь приветствуется. Заранее спасибо.

Ниже показан мой make-файл:

#Compiler Variable
CMP=g++

#Compiler Flags Variable
CPPFLAGS= -c -std=c++17

#Directory Variables
m := ./M
ds := ./D
nn := ./N
g := ./G

M_HEAD = $(m)/L.h $(m)/M.h $(m)/T.h
M_SRC = $(m)/L.cpp $(m)/M.cpp $(m)/T.cpp
M_OJBS = L.o M.o T.o

#Targets and Dependencies 
all: main.o m.o
    $(CMP) main.o $(M_OJBS) -o test

main.o: main.cpp
    $(CMP) $(CPPFLAGS) main.cpp

m.o: $(M_HEAD) $(M_SRC)
    $(CMP) $(CPPFLAGS) $(M_HEAD) $(M_SRC)

clean:
    rm -rf *.o *.h.gch test
    cd $(m)
    rm -rf *.o *.h.gch test
    cd ..
    cd $(ds)
    rm -rf *.o *.h.gch test
    cd ..
    cd $(nn)
    rm -rf *.o *.h.gch test
    cd ..
    cd $(g)
    rm -rf *.o *.h.gch test

Ответы [ 2 ]

3 голосов
/ 07 октября 2019

Когда make запускает рецепт, он запускает каждую строку рецепта в своей собственной оболочке. После того, как эта строка рецепта заканчивается, оболочка завершается, и для следующей строки запускается новая оболочка.

Таким образом, ваше правило clean такое же, как и при выполнении:

/bin/sh -c "rm -rf *.o *.h.gch test"
/bin/sh -c "cd $(m)"
/bin/sh -c "rm -rf *.o *.h.gch test"
/bin/sh -c "cd .."
/bin/sh -c "cd $(ds)"
/bin/sh -c "rm -rf *.o *.h.gch test"
/bin/sh -c "cd .."
/bin/sh -c "cd $(nn)"
/bin/sh -c "rm -rf *.o *.h.gch test"
/bin/sh -c "cd .."
/bin/sh -c "cd $(g)"
/bin/sh -c "rm -rf *.o *.h.gch test"

Таким образом, ваши cd команды бесполезны, потому что вы изменяете каталоги в подоболочке, затем оболочка закрывается и смена каталогов теряется, а затем вы запускаете команду rm в том же каталоге, в котором вы начали.

Вы должны поместить cd в ту же (логическую) строку, что и rm, и вам не нужно запускать cd .., потому что это подразумевается:

clean:
        rm -rf *.o *.h.gch test
        cd $(m)  && rm -rf *.o *.h.gch test
        cd $(ds) && rm -rf *.o *.h.gch test
        cd $(nn) && rm -rf *.o *.h.gch test
        cd $(g)  && rm -rf *.o *.h.gch test
1 голос
/ 07 октября 2019

Решение может заключаться в ответе на этот вопрос:

Как мне написать команду 'cd' в make-файле?

Краткий ответ:вам нужно поставить точки с запятой в конце каждой строки в вашей чистой зависимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...