2016-11-14 2 views
0

IBM i 시스템에서 코드를 컴파일하기 위해 GNU Make 4.0을 사용하고 있습니다. Make는 잘못 된 규칙을 선택하여 한 유형의 객체를 작성합니다.메이크가 명시 적 패턴 규칙을 무시하는 이유는 무엇입니까?

이 플랫폼에서 프로그램 개체는 소스 코드에서 컴파일 된 모듈로 작성됩니다. 또한 소스 코드에서 임시 모듈을 작성한 다음 프로그램을 작성하여 단일 소스 코드에서 직접 프로그램을 작성하는 편리한 바로 가기 명령이 있습니다. 내가 마주 치고있는 문제는 타겟 규칙이 모듈이 아닌 모듈에서 빌드되어야한다는 것을 지정하더라도 Make가 두 단계 버전 (crtrpgmod + crtpgm) 대신 바로 가기 명령 (crtbndrpg)을 사용한다는 것입니다. .

IBM i 오브젝트를 작성하는 방법을 설명하는 일반 파일과이 프로젝트의 모든 항목에 대한 오브젝트 종속성을 설명하는 프로젝트 특정 파일과 일반적인 파일을 사용하는 include의 두 가지 makefile이 있습니다. 내 일반 메이크 (편의상 편집) 다음과 같습니다

# `IBMiMake`, a generic makefile that describes how to create IBM i objects. 

OBJPATH := $(CURDIR) 
override OBJPATH := $(shell echo "$(OBJPATH)" | tr '[:lower:]' '[:upper:]') 

%.MODULE: %.RPGLE 
    $(eval crtcmd := crtrpgmod module($(OBJLIB)/$*) srcstmf('$<') $(CRTRPGMODFLAGS)) 
    @system "$(crtcmd)" > $(LOGPATH)/$(notdir $<).log 

%.PGM: %.RPGLE 
    $(eval crtcmd := crtbndrpg pgm($(OBJLIB)/$*) srcstmf('$<') $(CRTBNDRPGFLAGS)) 
    system "$(crtcmd)" >$(LOGPATH)/$(notdir $<).log 2>&1 

%.PGM: 
    $(eval crtcmd := crtpgm pgm($(OBJLIB)/$*) module($(basename $(filter %.MODULE,$(notdir $^)))) $(CRTPGMFLAGS)) 
    system "$(crtcmd)" >$(LOGPATH)/[email protected] 2>&1 

프로젝트 별 메이크 (또한 단순 위해 편집) 다음과 같습니다

# `xpmake`, to create objects in this project. 
ROOTDIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) 
IBMIMAKE := $(ROOTDIR)/../SDE/IBMiMake 
include $(IBMIMAKE) 

# AB2001.B.MODULE -- CRTRPGMOD 
AB2001.B.MODULE: AB2001.B.RPGLE 

# AB2001.B.PGM -- CRTPGM 
AB2001.B.PGM: AB2001.B.MODULE 

문제의 객체를 만들려면 :

bash-4.2$ make AB2001.B.PGM OBJPATH:='/qsys.lib/xp33make.lib' -f xp33make/xpmake -d --no-builtin-rules 

수행해야 할 작업 : 먼저 crtrpgmod 명령을 사용하여 모듈을 만들어야합니다. 그런 다음 crtpgm 명령을 사용하여 프로그램을 작성해야합니다. 그러나 crtpgm을 통해 프로그램을 만드는 대신 어떤 이유로 crtbndrpg 명령을 사용하여 소스 코드에서 프로그램을 직접 빌드하려고 시도합니다. 내가 생각할 수있는 유일한 방법은 아마도 Make가 AB2001.B.MODULE을 중간 파일로보고 crtrpgmod 단계를 우회하는 것입니다. 이것이 사실일까요? 내 규칙을 따르고 사물을 과장하려고하지 않으려면 어떻게해야합니까?

GNU Make 4.0 
Built for powerpc-ibm-aix5.3.0.0 
Copyright (C) 1988-2013 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 
Reading makefiles... 
Reading makefile 'xp33make/xpmake'... 
Reading makefile '/home/SMEEP/Source/xp33make/../SDE/IBMiMake' (search path) (no ~ expansion)... 
Updating makefiles.... 
Considering target file '/home/SMEEP/Source/xp33make/../SDE/IBMiMake'. 
    Looking for an implicit rule for '/home/SMEEP/Source/xp33make/../SDE/IBMiMake'. 
    No implicit rule found for '/home/SMEEP/Source/xp33make/../SDE/IBMiMake'. 
    Finished prerequisites of target file '/home/SMEEP/Source/xp33make/../SDE/IBMiMake'. 
No need to remake target '/home/SMEEP/Source/xp33make/../SDE/IBMiMake'. 
Considering target file 'xp33make/xpmake'. 
    Looking for an implicit rule for 'xp33make/xpmake'. 
    No implicit rule found for 'xp33make/xpmake'. 
    Finished prerequisites of target file 'xp33make/xpmake'. 
No need to remake target 'xp33make/xpmake'. 
Updating goal targets.... 
Considering target file 'AB2001.B.PGM'. 
File 'AB2001.B.PGM' does not exist. 
Looking for an implicit rule for 'AB2001.B.PGM'. 
Trying pattern rule with stem 'AB2001.B'. 
Trying implicit prerequisite 'AB2001.B.CLLE'. 
Trying pattern rule with stem 'AB2001.B'. 
Trying implicit prerequisite 'AB2001.B.RPGLE'. 
Found an implicit rule for 'AB2001.B.PGM'. 
    Considering target file 'AB2001.B.RPGLE'. 
    Looking for an implicit rule for 'AB2001.B.RPGLE'. 
    No implicit rule found for 'AB2001.B.RPGLE'. 
    Finished prerequisites of target file 'AB2001.B.RPGLE'. 
    No need to remake target 'AB2001.B.RPGLE'; using VPATH name '/home/SMEEP/Source/xp33make/AB2001.B.RPGLE'. 
    Considering target file 'AB2001.B.MODULE'. 
    Looking for an implicit rule for 'AB2001.B.MODULE'. 
    Trying pattern rule with stem 'AB2001.B'. 
    Trying implicit prerequisite 'AB2001.B.C'. 
    Trying pattern rule with stem 'AB2001.B'. 
    Trying implicit prerequisite 'AB2001.B.CLLE'. 
    Trying pattern rule with stem 'AB2001.B'. 
    Trying implicit prerequisite 'AB2001.B.RPGLE'. 
    Found prerequisite 'AB2001.B.RPGLE' as VPATH '/home/SMEEP/Source/xp33make/AB2001.B.RPGLE' 
    Found an implicit rule for 'AB2001.B.MODULE'. 
    Pruning file '/home/SMEEP/Source/xp33make/AB2001.B.RPGLE'. 
    Pruning file '/home/SMEEP/Source/xp33make/AB2001.B.RPGLE'. 
    Finished prerequisites of target file 'AB2001.B.MODULE'. 
    Prerequisite '/home/SMEEP/Source/xp33make/AB2001.B.RPGLE' is older than target 'AB2001.B.MODULE'. 
    Prerequisite '/home/SMEEP/Source/xp33make/AB2001.B.RPGLE' is older than target 'AB2001.B.MODULE'. 
    No need to remake target 'AB2001.B.MODULE'; using VPATH name '/QSYS.LIB/XP33MAKE.LIB/AB2001.B.MODULE'. 
Finished prerequisites of target file 'AB2001.B.PGM'. 
Must remake target 'AB2001.B.PGM'. 
system "crtbndrpg pgm(XP33MAKE/AB2001.B) srcstmf('/home/SMEEP/Source/xp33make/AB2001.B.RPGLE')" >/home/SMEEP/Source/xp33make/Logs/2016-11-14_11.42.55-Mon/AB2001.B.RPGLE.log 2>&1 
Putting child 30016df0 (AB2001.B.PGM) PID 1155363 on the chain. 
Live child 30016df0 (AB2001.B.PGM) PID 1155363 
Reaping losing child 30016df0 PID 1155363 
/home/SMEEP/Source/xp33make/../SDE/IBMiMake:476: recipe for target 'AB2001.B.PGM' failed 
Removing child 30016df0 PID 1155363 from chain. 
+0

** crtbndrpg ** 규칙을 지정하는 이유는 무엇입니까? 모든 ILE RPG 프로그램은 crtrpgmod + crtpgm을 사용하여 작성할 수 있으며, crtbndrpg를 사용하여 ** 만들 수도 있습니다. – user2338816

+0

네 말이 맞아, 내가 끝내는 방향이야. – smeep

답변

3

귀하의 예를 읽고 여전히 어려운 : 여기

는 출력되는 최소한의 예를 작성하는 것이 보통이다 (최고 즉, '파일을 작성하는 등 touch를 사용하는 예를 구성하고, 아무튼입니다 귀하의 환경에 따라 다릅니다.)

또한, 변수 지정을 만들기 위해 레시피 안에 $(eval ...)을 사용하는 것은 다소 혼란 스럽습니다. 레시피에서 이것을 수행했기 때문에 어떤 종류의 스코프가 관련되어 있다고 생각하지 마십시오. 이러한 변수는 여전히 전 세계적으로 할당되어 있습니다. 일치하는 패턴 규칙의 줄기 인 경우 당신은 분명히 두 번째를 사용하려면

%.PGM: %.RPGLE 
%.PGM: 

:하지만, 어떤 경우

는 문제는 %.PGM 일치하는 목표를 구축하는 두 가지 방법이있다이다 길이가 같으면 (동일한 줄기를 가진 .PGM) make은 항상 정의한 첫 번째 패턴을 선택하므로 가능한 경우 첫 번째 패턴을 선택합니다.

따라서 make%.RPGLE 빌드 방법을 알아낼 수 있다면 패턴 규칙이 일치하도록 해당 타겟을 빌드하는 데 항상 crtbndrpg을 사용합니다.

+0

감사합니다. 네 말이 맞아, 너무 복잡해. 일반적인 예제를 작성하는 데 어려움을 겪었지 만 앞으로는 성공할 수 있도록 노력할 것입니다. '% .c : % .b','% .b : % .a','% .c : % .a' 규칙을 감안할 때 어떤 규칙을 정의에 적용 할지를 제어 할 수있는 방법이 있습니까? 'xyz.c : xyz.b' 또는'xyz.c : xyz.a'? 우리는 바로 가기'% .c : % .a' 규칙으로 만들어지기로되어 있지만'% .c : % .a'와'% .c : % '두 단계를 사용해야하는 항목이 있습니다. b'. 어떻게 사용할지를 결정할 수 있습니까? – smeep

+0

'% .PGM : % .RPGLE'과 같이 IBMiMake에서 원하지 않는 규칙을 취소하기 위해 xpmake에서 레시피가없는 다른 규칙을 추가하십시오. – jaeheung

+1

주어진 메이크 파일에서 패턴 중 하나를 사용하고 싶지 않다면 재흥이 말한대로 삭제할 수 있습니다. 만약 당신이 다른 것들을 위해 같은 메이크 파일의 모든 패턴을 필요로한다면, 그 패턴을 남겨놓을 수 없다. 당신이하고 싶은 것을 직감 할 수는 없습니다. 항상 동일한 알고리즘을 사용하여 각 대상에 대한 규칙을 검색합니다. 이 경우 "표준"동작을 사용하지 않는 대상에 대해 명시 적 규칙 (정적 패턴 규칙)을 만들어야합니다. – MadScientist

0

간소화 과정에서 생략되었지만 명확한 규칙에 조리법이 부족하다는 것이 확실하지 않습니다. 래서 피가없는 패턴 규칙은 기존 암시 적 규칙을 취소하는 것을 의미합니다. https://www.gnu.org/software/make/manual/html_node/Canceling-Rules.html

+1

패턴 규칙에 래서 피가없는 경우 패턴 규칙 만 취소됩니다. 여기서 패턴 규칙에는 조리법이 있습니다. 레시피가없는 규칙은 단지 추가 선행 조건을 정의합니다. 레서피가 없으므로 명확한 규칙은 없으며 make는 레서피를 찾기 위해 패턴 규칙을 검색합니다. – MadScientist