command
앞에 @
를 추가하여 반향(反響)을 억제할 수 있다:
all:
@echo "This make line will not be printed"
echo "But this will"
각각의 command
는 새로운 shell
에서 실행된다. (혹은 적어도 그러한 효과를 가진다)
all:
cd ..
# The cd above does not affect this line, because each command is effectively run in a new shell
echo `pwd`
# This cd command affects the next because they are on the same line
cd ..; echo `pwd`
# Same as above
cd ..; \
echo `pwd`
make
에서 기본 shell
은 /bin/sh
이다. SHELL
변수를 변경하여 shell
을 변경할 수 있다:
SHELL=/bin/bash
cool:
echo "Hello from bash"
달러 기호를 문자열에서 사용하고 싶을 땐 $$
를 쓸 수 있다. 이는 bash
혹은 sh
에서 shell
변수를 사용하는 것과 동일하다.
다음 예제에서 makefile
변수와 shell
변수 사이의 차이를 주목하길 바란다:
make_var = I am a make variable
all:
# Same as running "sh_var='I am a shell variable'; echo $sh_var" in the shell
sh_var = 'I am a shell variable'; echo $$sh_var
# Same as running "echo I am a make variable" in the shell
echo $(make_var)
-k
, -i
, and -
-k
: 에러에 직면해도 멈추지 않고 make
수행한다. 이는 make
의 모든 에러를 한번에 살펴보길 원할 때 유용하다.-
: command
앞에 작성하면 에러를 억제한다.-i
: 모든 command
에 대해 -i
가 칭하는 것들을 일어나게 만들 수 있다.Add
-i
to make to have this happen for evevry command.
one:
# This error will be printed but ignored, and make will continue to run
-false
touch one
만일 make
중 ctrl+c
를 입력했다면, 그것이 만든 새로운 target
을 제거한다.
재귀적으로 makefile
을 호출하길 원한다면, make
대신 $(MAKE)
를 사용해야 한다. 이는 make
로 전달된 flag
를 넘겨주며 자체적으로 영향을 받지 않는다.
new_contents = "hello:\n\ttouch inside_file"
all:
mkdir -p subdir
printf $(new_contents) | sed -e 's/^ //' > subdir/makefile
cd subdir && $(MAKE)
clean:
rm -rf subdir
make
가 시작(makefile
내에서)될 때, make
를 실행할 때(shell
에서) 전달된 모든 환경 변수들로부터 make
변수를 만든다:
원문: When Make starts, it automatically creates Make variables out of all the environment variables that are set when it's executed.
out of
를 from
으로 해석
# Run this with "export shell_env_var='I am an environment variable'; make"
all:
# Print out the Shell variable
echo $$shell_env_var
# Print out the Make variable
echo $(shell_env_var)
export
지시자는 하나의 변수를 취하고, 모든 recipes
내의 모든 shell
명령을 위한 환경으로 설정한다:
shell_env_var=Shell env var, created inside of Make
export shell_env_var
all:
echo $(shell_env_var)
echo $$shell_env_var
가령 make
명령을 make
내에서 실행했을 때, export
지시자를 통해 하위 make
명령에서 접근이 가능하도록 만들 수 있다:
new_contents = "hello:\n\techo \$$(cooly)"
all:
mkdir -p subdir
printf $(new_contents) | sed -e 's/^ //' > subdir/makefile
@echo "---MAKEFILE CONTENTS---"
@cd subdir && cat makefile
@echo "---END MAKEFILE CONTENTS---"
cd subdir && $(MAKE)
# Note that variables and exports. They are set/affected globally.
cooly = "The subdirectory can see me!"
export cooly
# This would nullify the line above: unexport cooly
clean:
rm -rf subdir
.EXPORT_ALL_VARIABLES
는 모든 변수들을 내보낸다:
.EXPORT_ALL_VARIABLES:
new_contents = "hello:\n\techo \$$(cooly)"
cooly = "The subdirectory can see me!"
# This would nullify the line above: unexport cooly
all:
mkdir -p subdir
printf $(new_contents) | sed -e 's/^ //' > subdir/makefile
@echo "---MAKEFILE CONTENTS---"
@cd subdir && cat makefile
@echo "---END MAKEFILE CONTENTS---"
cd subdir && $(MAKE)
clean:
rm -rf subdir
여기에는 make
에서 사용한 가능한 훌륭한 옵션들이 존재한다. --dry-run
, --touch
, --old-file
등을 확인하길 바란다.
또한 make
에 대해 복수의 target
을 가질 수 있다. 가령, make clean run test
는 clean
을 수행하고, 그 다음 run
을, 그리고 test
를 수행한다.