2017-12-15 1 views
1

저는 GNU autotools (autoconf, automake)를 사용하여 빌드 된 프로젝트에서 일하고 있습니다. 잘 작동하지만 help2man에 문제가 있습니다. 병렬 (MAKEFLAGS=-j3)을 빌드 할 때 프로젝트는 두 번 빌드됩니다. 한 번 "정상적인"대상을 사용하고 한 번은 foo.1 호출을 사용합니다.병렬 automake에서 help2man을 사용하십시오.

  1. help2man
  2. 없이 시스템을 지원하기 위해 foo.1 배포 : 제 질문은 다음과 같은 지원 Makefile.am를 작성하는 방법이다, 그래서

    foo.1 : $(top_srcdir)/man/foo.x $(top_srcdir)/src/main.c $(top_srcdir)/configure.ac 
        $(MAKE) $(AM_MAKEFLAGS) foo$(EXEEXT) 
        -$(HELP2MAN) -o [email protected] --include $< $(top_builddir)/foo 
    

    :

    다음 Makefile.am에서 관련 부분입니다 오류를 던지지 마십시오.

  3. 필요에 따라 다시 작성 맨 페이지

나는 당신의 대답

+0

아이디어가 있습니까? – xanoetux

답변

0

는이 질문에 대한 쉬운 해결책은없는 것 같다이다; 다음은 나를 위해 일한다.

configure.ac에서 help2man을 확인해야합니다. 크로스 컴파일 할 경우 help2man을 실행하면 안됩니다. 실행 파일이 실행됩니다. 따라서 다음 스 니펫이 포함되어 있습니다.

# Man pages 
AS_IF([test "$cross_compiling" = "no"], [ 
    AM_MISSING_PROG([HELP2MAN], [help2man]) 
], [ 
    HELP2MAN=: 
]) 

건물에는 2 단계 개념이 있습니다. 먼저 맨페이지가 실행 파일보다 새로운 지 확인합니다. 그렇다면 불필요한 맨 페이지 재 작성을 금지하기 위해 맨 페이지 자체가 변경되었을 때 마지막으로 변경된 임시 파일을 사용하여 소스를 검사합니다. 그래서, Makefile.am에는 다음이 포함 발견하고이 솔루션을 제공하는 헨드릭 Oenings에

dist_man_MANS = foo.1 
EXTRA_DIST += $(dist_man_MANS:.1=.x) common.x 
MOSTLYCLEANFILES += $(dist_man_MANS:=-t) 
MAINTAINERCLEANFILES += $(dist_man_MANS) 

common_dep = $(top_srcdir)/common.x $(top_srcdir)/configure.ac $(top_srcdir)/.version 
common_indirect_dep = $(top_srcdir)/common.x $(top_srcdir)/configure $(top_srcdir)/.version 
foo.1 : $(common_indirect_dep) $(top_builddir)/foo$(EXEEXT) 
foo.1-t : $(common_dep) $(top_srcdir)/main-helpversion.c 

SUFFIXES += .x .1 .1-t 
.x.1: 
    test -f [email protected] || if test -f $(top_srcdir)/`echo $@ | $(SED) -e 's,.*/,,'`; then \ 
     touch -r $(top_srcdir)/`echo [email protected] | $(SED) -e 's,.*/,,'` [email protected]; \ 
    else \ 
     touch -d @0 [email protected]; \ 
    fi 
    touch -r [email protected] [email protected] 
    $(MAKE) $(AM_MAKEFLAGS) [email protected] 
    if test -s [email protected]; then \ 
     mv -f [email protected] [email protected]; \ 
    else \ 
     rm -f [email protected]; \ 
     if test -s [email protected]; then touch [email protected]; else rm -f [email protected]; fi; \ 
    fi 
.x.1-t: 
    $(HELP2MAN) -o [email protected] -I $< -I $(top_srcdir)/common.x -s 1 foo$(EXEEXT) 

감사합니다. 당신은 작동 예제 in his git repoitory을 찾을 수 있습니다. 필요하지 않은 경우에도 프로그램을 빌드하는 것처럼 몇 가지 단점이 있지만 일반적으로 맨 페이지를 빌드 할 때 프로그램이 빌드됩니다.

+0

그 결점 중 하나는'make -j3'가 원래 피하려고했던'foo $ (EXEEXT)'빌드 레이스를 다시 소개한다는 것이다. – ldav1s

+0

정말이에요? 내 생각에, 내 (GNU) make가 이것을 해결한다. 목표 A와 B가 평행하게 구축되는 것을 상상해보십시오. 반면에 B는 A에 의존합니다 (위의 예제는 단순화되었습니다). 내가 볼 수있는 한, make는 정확하게 이것을 해결한다. – xanoetux

+0

GNU make 4.0 사용하기. 원래 예제를 재귀 적으로 재 작성했습니다 (더 많은 보호가 필요함). 깨끗한 상태에서 그 보호는 존재하지 않으며'foo $ (EXEXT)'를 빌드하는 두 번의 호출을 얻습니다. – ldav1s

0

foo.1 필요 올바른 전제 조건을 기대하고있다. AIUI는 help2man 그냥 실행 가능한 바이너리가 구축 될 필요가 :

foo.1 : $(top_srcdir)/man/foo.x $(top_srcdir)/configure.ac $(top_builddir)/foo 
     -$(HELP2MAN) -o [email protected] --include $< $(top_builddir)/foo 

은 그래서 당신이 일반적으로 가능하지 않은) 2 중 원하는 것을 이해하지

3)

을합니다.

dist_man_MANS = foo.1 

1)

+0

이미이 아이디어를 시도했지만 최종 사용자가 help2man을 설치해야합니다. 소스가 변경되지 않아도 맨 페이지가 다시 작성됩니다. – xanoetux

+0

[AC_CHECK_PROG] (https : //www.gnu.org/software/autoconf/manual/autoconf-2.69/autoconf.html#Generic-Programs), AC_CHECK_PROG 테스트는 위의'foo.1' 규칙을 [조건부] ('help2man'이 설치되어 있지 않을 때 https://www.gnu.org/software/automake/manual/html_node/Usage-of-Conditionals.html). – ldav1s

+0

그러나 가능하면 맨 페이지가 최종 사용자 (가능한 경우)에서 다시 작성되기 때문에 distcheck faiks를 작성하십시오. https://www.gnu.org/software/automake/manual/html_node/Errors-with-distclean을 참조하십시오.html – xanoetux

관련 문제