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 매크로를 사용하면 됩니다.