2015-02-02 6 views
8

"스크립트 빌드 단계 실행"으로 실행되는 스크립트 내부에서 빌드 프로세스에서 ld 명령의 인수를 결정하는 방법은 무엇입니까?xcode 실행 스크립트 빌드 단계에서 ld 명령 인수를 찾습니다.

나는 옵션으로 xcodebuild -dry-run을보고 있었지만, 나는 그것이 무엇을 제공해야 하는지를 이해할 필요가있다.

강력한 솔루션에 대한 아이디어가 있습니까?

편집는 :

이 프로젝트가 신속 소스 코드를 포함 할 때 xcodebuild는 LD와 LDPLUSPLUS을 지원하지 않는 것 같습니다. 따라서 @fpotter가 제공 한 솔루션은 신속하게 프로젝트에서 작동하지 않습니다.

의견이 있으십니까?

답변

5

Xcode는 좋은 방법을 제공하지 않습니다. 스크립트 실행 빌드 단계에서 작업해야하는 것은 환경에서 제공되는 Xcode 빌드 설정입니다.

실제로 전체 인수 목록이 ld이어야하는 경우 사용할 수있는 해킹이 있습니다. LDLDPLUSPLUS 빌드 설정을 사용하면 Xcode에서 실제 ld 대신 자신의 스크립트를 호출 할 수 있습니다. 이 스크립트에서 args를 캡처하고 실제 링커를 호출 한 다음 Run Script 빌드 단계가 아닌 원하는 포스트 프로세싱을 수행 할 수 있습니다.

는 대상에 대한 .xcconfig 만들기 : 여기

당신이 그렇게 할 수있는 방법입니다.

그것은 다음과 같이한다 : 프로젝트의 디렉토리

LD = $(SRCROOT)/ld-wrapper/clang 
LDPLUSPLUS = $(SRCROOT)/ld-wrapper/clang++ 

SRCROOT 포인트. LDPLUSPLUS 라인은 앱에 C++ 또는 ObjC++ 코드가있는 경우에만 필요합니다. xcconfig를 만들고 싶지 않으면 Xcode UI를 통해 사용자 정의 빌드 설정으로 추가 할 수 있습니다.

Xcode에서 호출 할 래퍼 스크립트를 만듭니다.

<your project root>/ld-wrapper/wrapper.sh에서이 같은 스크립트를 설치합니다

#!/bin/bash 

set -o errexit 

# Choose which clang to run (clang or clang++) depending on how we're invoked. 
# If we're invoked via the 'clang' link, we'll run 'clang'. If we're invoked 
# via the 'clang++' link, we'll run 'clang++'. 
CLANG_PATH="$DEVELOPER_DIR"/Toolchains/XcodeDefault.xctoolchain/usr/bin/$(basename "$0") 

"$CLANG_PATH" "[email protected]" 

echo "clang args: [email protected]" 
echo "do any post processing here." 

++는 그 소리와 그 소리에 대한 래퍼 스크립트에 대한 심볼릭 링크를 만듭니다 그것 뿐이다

cd <project root>/ld-wrapper 
ln -s wrapper.sh clang 
ln -s wrapper.sh clang++ 

합니다. 못생긴지만 작동합니다.

+0

고마워요. @fpotter, 당신이 처음으로 대답하는 것을 기쁘게 생각합니다. 나는 LD 변수 접근법이 흥미 롭다고 생각한다. 'xcodebuild -dry-run'의 결과를 파싱 할 수없는 이유는 무엇입니까? – ekeren

+0

'드라이 런'의 출력을 확실히 파싱 할 수 있습니다. 하지만 Run Script 내에서 'dry-run'으로 xcodebuild를 호출하는 것은 느립니다. 드라이 클리닝 만하는 경우에도 xcodebuild는 프로젝트를 열고 빌드 준비에 많은 시간을 할애합니다. 실제로 대규모 프로젝트의 경우 마른 일을하는 데 1 분 이상 걸릴 수 있습니다. – fpotter

+1

프로젝트에 신속한 코드가 포함되어있을 때 xcode가 LD 및 LDPLUSPLUS 변수를 무시하는 이유는 무엇입니까? – ekeren