Ответ 1
Фактически выполняется команда, меняя каталог на some_directory
, однако это выполняется в оболочке подпроцесса и не влияет ни на make, ни на оболочку, из которой вы работаете.
Если вы хотите выполнить больше задач в some_directory
, вам нужно добавить полуточку и добавить другие команды. Обратите внимание: вы не можете использовать символы новой строки, поскольку они интерпретируются make как конец правила, поэтому любые новые строки, которые вы используете для ясности, должны быть экранированы обратным слэшем.
Например:
all:
cd some_dir; echo "I'm in some_dir"; \
gcc -Wall -o myTest myTest.c
Обратите внимание также, что точка с запятой необходима между каждой командой, даже если вы добавляете обратную косую черту и новую строку. Это связано с тем, что вся строка анализируется как одна строка оболочки. Как отмечено в комментариях, вы должны использовать '& &' для объединения команд, что означает, что они выполняются только в том случае, если предыдущая команда была успешной.
all:
cd some_dir && echo "I'm in some_dir" && \
gcc -Wall -o myTest myTest.c
Это особенно важно при выполнении деструктивной работы, такой как очистка, поскольку иначе вы уничтожаете неправильный материал, если cd
не работает по какой-либо причине.
Обычное использование, однако, заключается в вызове make в подкаталоге, который вы, возможно, захотите изучить. Там есть опция командной строки, поэтому вам не нужно вызывать cd
самостоятельно, поэтому ваше правило будет выглядеть следующим образом:
all:
$(MAKE) -C some_dir all
который изменится на some_dir
и выполнит Makefile
там с целевым "все". В качестве наилучшей практики используйте $(MAKE)
вместо прямого вызова make
, так как позаботится о вызове правильного экземпляра make (если вы, например, используете специальную версию make для вашей среды сборки), а также при работе с некоторыми коммутаторами, например, -t
.
Для записи всегда выполняйте команду echo, которая выполняется (если явно не подавлена), даже если она не имеет выхода, что вы видите.