[makefile] #3. Commands and execution

문연수·2022년 9월 15일
0

Makefile

목록 보기
4/8

1. Command Echoing/Silencing

command 앞에 @ 를 추가하여 반향(反響)을 억제할 수 있다:

all:
	@echo "This make line will not be printed"
    echo "But this will"

2. Command Execution

 각각의 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`

3. Default Shell

make 에서 기본 shell/bin/sh 이다. SHELL 변수를 변경하여 shell 을 변경할 수 있다:

SHELL=/bin/bash

cool:
	echo "Hello from bash"

4. Double dollar sign

 달러 기호를 문자열에서 사용하고 싶을 땐 $$ 를 쓸 수 있다. 이는 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)

5. Error handling with -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

6. Interrupting or killing make

만일 makectrl+c 를 입력했다면, 그것이 만든 새로운 target 을 제거한다.

7. Recursive use of make

 재귀적으로 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

8. Export, environments, and recursive make

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 offrom 으로 해석

# 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

9. Arguments to make

여기에는 make 에서 사용한 가능한 훌륭한 옵션들이 존재한다. --dry-run, --touch, --old-file 등을 확인하길 바란다.

 또한 make 에 대해 복수의 target 을 가질 수 있다. 가령, make clean run testclean 을 수행하고, 그 다음 run 을, 그리고 test 를 수행한다.

출처

[사이트] https://makefiletutorial.com/#getting-started

profile
2000.11.30

0개의 댓글