File Inclusion

include, sinclude

include ( File )
sinclude ( File )

m4 스크립트 파일을 여러 개로 나누어 작성한 후에 필요에 따라 include 해 사용할 수 있습니다. include 매크로의 확장 결과는 해당 파일의 contents 가 됩니다. 만약에 파일이 존재하지 않거나, 읽을 수 없거나, 디렉토리 이거나 할 경우는 확장 결과는 void 가 됩니다. include 매크로의 경우 stderr 로 오류 메시지가 출력되고 m4 명령의 종료 상태 값도 오류가 되지만 sinclude ( silent include ) 매크로의 경우는 오류가 무시됩니다.

$ m4 <<\@                               
1111111
include(`not_exist.m4')dnl           # include 매크로
2222222
@

1111111
m4:stdin:2: cannot open `not_exist.m4': No such file or directory
2222222

$ echo $?     # 오류
1
---------------------------

$ m4 <<\@
1111111
sinclude(`not_exist.m4')dnl          # sinclude 매크로
2222222
@

1111111
2222222

$ echo $?     # 오류가 무시된다.
0

m4 명령의 -I 옵션은 include 경로를 설정하는데 사용됩니다. 만약에 동일한 이름의 파일이 현재 디렉토리에도 존재하면 현재 디렉토리에 있는 파일이 사용됩니다.

$ cat /usr/share/doc/m4/examples/incl.m4 
Include file start
foo
Include file end

$ m4 <<\@ -I /usr/share/doc/m4/examples
define(`foo', `hello include')dnl
include(`incl.m4')dnl
@

Include file start
hello include               # incl.m4 파일에 있는 foo 가 확장된다.
Include file end

매크로 정의에 include 매크로가 포함될 수도 있습니다. 다음 첫 번째 경우는 include 매크로에 quotes 이 없으므로 include 매크로가 확장되어 incl.m4 파일의 contents 가 bar 매크로의 값이 됩니다. 두 번째의 경우는 include 매크로에 quotes 이 존재하므로 bar 매크로의 값은 include 매크로가 되고 bar 매크로가 사용된 위치에서 확장되게 됩니다. 다음 예제의 경우는 결과가 동일하지만 만약에 incl.m4 파일 내용 중에 quotes, commas, parentheses 등이 존재하면 첫 번째 경우는 오류가 됩니다.

$ m4 <<\@ -I /usr/share/doc/m4/examples      $ m4 <<\@ -I /usr/share/doc/m4/examples
define(`bar', include(`incl.m4'))            define(`bar', `include(`incl.m4')')
This is `bar':  >>>bar<<<                    This is `bar':  >>>bar<<<
@                                            @

This is bar:  >>>Include file start          This is bar:  >>>Include file start
foo                                          foo
Include file end                             Include file end
<<<                                          <<<

확장 없이 파일을 include 하려면

undivert 매크로를 사용하면 됩니다.