저는 작은 프로젝트를 사용 autoconf
하고 구축하고 있습니다.automake
프로젝트 매뉴얼에는 OpenBSD의 기본 언어를 사용했습니다.mdoc
체재, man
이를 사용하여 설치 가능한 형식의 매뉴얼을 생성합니다.mandoc
유틸리티. - 포맷된 매뉴얼은 일부 시스템에서 제대로 이해하지 못하거나 전혀 이해 하지 못하기 때문에 man
실제 매뉴얼로 설치됩니다 .make install
mdoc
프로젝트 doc
디렉토리에는 현재 다음과 같은 파일이 있습니다 Makefile.am
(설명서는 라는 유틸리티에 대한 것입니다 shell
).
dist_man1_MANS= shell.man
EXTRA_DIST= shell.mdoc
shell.man: shell.mdoc
$(mandoc) -T man shell.mdoc >shell.man
$(mandoc)
포맷터의 전체 경로로 올바르게 확장됩니다 mandoc
(이 변수는 스크립트에 의해 설정됨 configure
).
이를 통해 make dist
이를 실행하여 나머지 프로젝트 배포 파일과 함께 소스 매뉴얼과 생성된 매뉴얼을 포함하는 shell.man
압축 아카이브를 생성할 수 있습니다.tar
mdoc
man
$ tar tzf shell-toolbox-20180401.tar.gz
...
shell-toolbox-20180401/doc/Makefile.am
shell-toolbox-20180401/doc/shell.man
shell-toolbox-20180401/doc/Makefile.in
shell-toolbox-20180401/doc/shell.mdoc
이 tar
아카이브는 나중에 프로젝트와 해당 매뉴얼을 성공적으로 빌드하고 설치하는 데 사용될 수 있습니다. 여태까지는 그런대로 잘됐다.
그러나 내가 달리면make distcheck
(왜냐하면 나는 그것이 절대적으로 작동하는지 확인하고 싶기 때문입니다):
$ make distcheck
...
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/local/bin/gmkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for mandoc... /usr/bin/mandoc
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating doc/Makefile
config.status: creating src/shell
Making all in src
Making all in doc
/usr/bin/mandoc -T man shell.mdoc >shell.man
mandoc: shell.mdoc: ERROR: No such file or directory
*** Error 3 in shell-toolbox-20180401/_build/sub/doc (Makefile:459 'shell.man')
*** Error 1 in shell-toolbox-20180401/_build/sub (Makefile:345 'all-recursive')
*** Error 1 in /home/myself/local/build/shell-toolbox (Makefile:576 'distcheck')
mdoc
매뉴얼을 빌드할 때가 되면 빌드 디렉토리에 소스 파일이 없는 것 같습니다:
$ ls shell-toolbox-20180401/_build/sub/doc
total 32
-rw-r--r-- 1 myself myself 14989 Apr 1 21:35 Makefile
-rw-r--r-- 1 myself myself 0 Apr 1 21:35 shell.man
길이가 0인 shell.man
파일은 실패한 mandoc
실행에서 생성됩니다.
소스 코드는 압축이 풀린 아카이브에 있지만 _build/sub/doc
디렉토리에 복사되지는 않았습니다.
$ ls -l shell-toolbox-20180401/doc
total 48
-r--r--r-- 1 myself myself 178 Apr 1 21:23 Makefile.am
-r--r--r-- 1 myself myself 13925 Apr 1 21:23 Makefile.in
-r--r--r-- 1 myself myself 3443 Apr 1 21:27 shell.man
-r--r--r-- 1 myself myself 3319 Apr 1 18:54 shell.mdoc
질문: 형식화된 매뉴얼을 생성하기 전에 소스 코드를 빌드 디렉토리에 올바르게 복사 automake
하려면 어떤 마법을 적용해야 합니까 ? make distcheck
나는 해킹 없이 이 작업을 수행할 수 있는 "올바른" 방법을 찾고 있습니다.mdoc
man
나는 사용하려고
man1_SOURCES= shell.mdoc
그러나 이것은 사람들을 automake
불평 하게 만든다.
doc/Makefile.am:2: warning: variable 'man1_SOURCES' is defined but no program or
doc/Makefile.am:2: library has 'man1' as canonical name (possible typo)
이 오류를 발생시키는 또 다른 방법은 수동으로 수행하는 것입니다.VPATH 빌드(이것은 기본적으로 를 수행할 때 발생하는 일입니다 make distcheck
):
$ make distclean
$ mkdir t
$ cd t
$ ../configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/local/bin/gmkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for mandoc... /usr/bin/mandoc
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating doc/Makefile
config.status: creating src/shell
$ make
Making all in src
Making all in doc
/usr/bin/mandoc -T man shell.mdoc >shell.man
mandoc: shell.mdoc: ERROR: No such file or directory
*** Error 3 in doc (Makefile:459 'shell.man')
*** Error 1 in /home/myself/local/build/shell-toolbox/t (Makefile:345 'all-recursive')
$ ls -l doc
total 32
-rw-r--r-- 1 myself myself 14589 Apr 1 22:42 Makefile
-rw-r--r-- 1 myself myself 0 Apr 1 22:42 shell.man
답변1
해결책: VPATH 빌드를 수행할 때 수동 소스를 올바르게 얻으려면 파일의 관련 섹션에 있는 규칙이 Makefile.am
다음과 같아야 합니다.
shell.man: $(srcdir)/shell.mdoc
$(mandoc) -T man $(srcdir)/shell.mdoc >shell.man
$(srcdir)/shell.mdoc
를 지정하면 make
빌드 트리가 배포 트리와 다른 위치에 있더라도 배포 트리에서 파일을 찾을 수 있습니다.
답변2
이미 승인된 답변이 있지만 다음 규칙이 VPATH 빌드에 적합할 수 있으며 더 작다는 추가 이점이 있다고 생각합니다.
shell.man: shell.mdoc
$(mandoc) -T man $< >$@
답변3
automake
다양한 목표 전후 실행에 대한 지원 -local
및 규칙입니다 . -hook
분명히 그렇지 않으므로 distcheck-local
다른 아이디어는 다음 을 Makefile.am
사용한 dist-hook
후에 무언가를 실행하는 것 입니다 dist
.
dist-hook:
cp something $(distdir)/somewhere