2013-08-31 2 views
0

Haiku Jam을 사용하여 OS X 데스크탑 응용 프로그램을 만들려고합니다. 내가 필요로하는 유일한 파일은 다음과 같습니다응용 프로그램 구조 만들기

  • <appname>.app (디렉토리)
  • <appname>.app/Contents (디렉토리)
  • <appname>.app/Contents/Info.plist (파일)
  • <appname>.app/Contents/MacOS (디렉토리)
  • <appname.app>/Contents/MacOS/<appname> (실행 파일, 이것은 실제입니다 내장 바이너리)

문제는 내가 모르는 것입니다. oper Jamfile이 파일과 디렉토리를 생성하도록 Jam에게 알려주는 코드. 내장 된 MkDirFile 규칙을 호출하는 "응용 프로그램"규칙을 만들 것이라고 생각할 수 있습니다. 그게 내 접근 이었어. 누락 된 명령어로 인해서 실행되지 않았다는 것을 제외하고는 DEPENDS 명령이다. 불행히도 DEPENDS 명령을 추가하여 필요한 파일과 디렉토리에 따라 대상을 NOTFILE으로 만드는 경우 이상한 순환 참조 오류가 발생하거나 순환 종속성으로 인해 규칙이 실행되지 않을 수 있습니다. 어떻게해야합니까?

(make에서,이 순서대로 make 실행 명령들이 입력 되었기 때문에, 매 시간. 나는 make 규칙을 생성하고 적절하게 반복 mkdircp를 호출 것, 죽은 간단 할 것입니다.)

답변

0

나는 간단한 규칙과 접근 방식이 작동하지해야하는 이유를 볼 수 없습니다 : (Main에 전달로)

rule Application application : infoFile 
{ 
    local appDir = $(application:BS=.app) ; 
    MakeLocate $(appDir) : ... some directory ... ; 
    Depends $(appDir) : $(application) $(infoFile) ; 
    Application1 $(appDir) : $(application) $(infoFile) ; 
} 

actions Application1 
{ 
    rm -rf $(1) 
    mkdir -p $(1)/Contents/MacOS 
    cp $(2[1]) $(1)/Contents/MacOS 
    cp $(2[2]) $(1)/Contents/Info.plist 
} 

첫 번째 인수는 실행 대상 - 규칙은 최종 이름이 가정합니다. 두 번째 인수는 Info.plist의 대상입니다 (이름은 중요하지 않음). 이미 존재하는 파일이라고 생각합니다. 따라서 Jam에게 찾아야합니다. 파일을 가정하면 실행 파일을 빌드 Jamfile의 하위 디렉토리에있는, 즉 Jamfile의 흥미로운 부분은 다음과 같을 수 있습니다 : 당신은 jam -q MyApp.app 빌드 것

Main MyApp : ... ; 

local infoFile = [ FGristFiles Info.plist ] ; 
SEARCH on $(infoFile) = $(SEARCH_SOURCE) ; 
Application MyApp : $(infoFile) ; 

. info 파일의 이름이 항상 그와 같으며 해당 하위 디렉토리에있는 경우 해당 코드를 Application 규칙으로 이동하고 호출을 단순화 할 수 있습니다. 또는 한 번만 필요하면 응용 프로그램 규칙에서 모든 코드를 이동하고 작업 만 유지하면됩니다.

또는 작업을 작성하지 않고도 모든 작업을 수행 할 수 있습니다. 당신의 Jamfile에서 : 당신이 jam -q MyApp-dir을 할 수 있도록

local application = MyApp ; 
local infoFile = Info.plist ; 

local targetDir = ... some directory ... ; 
local applicationDir = [ FDirName $(targetDir) $(application:BS=.app) ] ; 
local contentsDir = [ FDirName $(applicationDir) Contents ] ; 
local macOsDir = [ FDirName $(contentsDir) MacOS ] ; 

Main $(application) : ... ; 
MakeLocate $(application) : $(macOsDir) ; 

local targetInfoFile = <$(application)-info-plist)>Info.plist ; 
MakeLocate $(targetInfoFile) : $(contentsDir) ; 
File $(targetInfoFile) : [ FGristFiles $(infoFile) ] ; 

NotFile $(application)-dir ; 
Depends $(application)-dir : $(application) $(targetInfoFile) ; 

의사 대상이 존재합니다. 분명히 코드를 재사용하고 싶다면 코드로 옮길 수 있습니다. application 및 infoFile이 다시 매개 변수가됩니다. File 규칙은 소스 파일의 SEARCHSEARCH_SOURCE으로 설정하므로 나중에 다른 동작이 필요할 경우 다시 설정해야합니다.

면책 조항 : 위의 코드 중 하나라도 테스트하지 않았으므로 오타 또는 다른 작은 사고는 가능합니다. 그러나 원칙적으로 사물은 윤곽이 잡힌 것처럼 작동해야합니다.

+0

참고 : 'rule Application application : infoFile'은 (는) 잘못된 구문입니다. 단지'rule application'이어야합니다; 인수를 지정하려면 주석을 사용하십시오. – wjk

+0

그러면 Haiku의 Jam (약간 확장 된 Perforce Jam 2.5rc3) 또는 "최근의"Perforce Jam을 사용하지 않는 것 같습니다. 명명 된 규칙 매개 변수는 2002 년에 PERFORCE JAM에서 소개되었습니다. 일부 Linux 배포판 (적어도 openSUSE)은 이전 PERFORCE JAM 버전의 포크 인 Boost Jam과 함께 제공됩니다. 또한 return/break/continue를 지원하지 않습니다 (각각 예기치 않은 의미로만 리턴). – user686249

+0

나는 그것을 몰랐다. – wjk