'만들기' 변수는 사용할 수 있는 확장 가능한 문자열 변수의 특수 클래스입니다. 대체'를 사용해야 합니다.
예를 들어 특정 도구 모음 경로를 빌드 작업을 빌드합니다.
Bazel은 사전 정의된 변수를 모두 제공하며 이 변수는 대상 및 종속 항목 타겟에 정의된 맞춤 변수 이를 사용하는 타겟에서만 사용할 수 있습니다.
'제조업체'라는 용어의 이유 구문 및 의미 체계는 역사적임을 이러한 변수는 원래 GNU와 Make를 선택합니다.
사용
'Make 변수'로 표시된 속성 대체'를 사용하면
'Make'라는 변수를 다음과 같이 바꿉니다. FOO
my_attr = "prefix $(FOO) suffix"
즉, $(FOO)
와 일치하는 모든 하위 문자열이 확장됩니다.
FOO
의 값으로 변경합니다. 값이 "bar"
이면 최종
문자열은 다음과 같이 변환됩니다.
my_attr = "prefix bar suffix"
FOO
가 소비에 알려진 변수에 해당하지 않는 경우
대상이면 Bazel이 오류와 함께 실패합니다.
'만들기' 이름이 아닌 기호가 있는 변수(예:
@
는 달러 기호만 사용하여 참조할 수도 있습니다(예:
괄호를 사용합니다. 예를 들면 다음과 같습니다.
my_attr = "prefix $@ suffix"
$
를 문자열 리터럴로 작성 (즉, 변수 방지를 위해)
확장)에서 $$
를 씁니다.
사전 정의된 변수
사전 정의된 '제조업체' 변수는 "'Make var'(변수 만들기)가 대체'를 반환합니다.
주어진 빌드 세트의 이러한 변수 및 변수 값 보기 옵션, 실행
bazel info --show_make_env [build options]
대문자로 된 상단의 출력 줄을 살펴보세요.
도구 모음 옵션 변수
COMPILATION_MODE
:fastbuild
,dbg
또는opt
입니다. (자세히 세부정보)
경로 변수
-
BINDIR
: 타겟용으로 생성된 바이너리 트리의 베이스 살펴봤습니다실행 중에 실행되는 프로그램에 다른 트리가 사용될 수도 호스트 아키텍처에 빌드하여 크로스 컴파일을 지원합니다.
genrule
내에서 도구를 실행하려면 경로를 가져오는 데 권장되는 방법은$(execpath toolname)
입니다. 여기서 toolname은genrule
의tools
속성 GENDIR
: 타겟 아키텍처용으로 생성된 코드 트리의 기반입니다.
머신 아키텍처 변수
-
TARGET_CPU
: 대상 아키텍처의 CPU. 예:k8
입니다.
사전 정의된 genrule 변수
다음은 genrule
에서 사용할 수 있는 기능입니다.
cmd
속성 및
일반적으로 이 속성이 작동하는 데 중요합니다.
OUTS
:genrule
의outs
목록입니다. 만약 하나의 출력 파일만 있는 경우$@
를 사용할 수도 있습니다.-
SRCS
:genrule
의srcs
목록 (또는 이상) 정확히 말하자면srcs
목록). 소스 파일이 하나뿐인 경우$<
를 사용할 수도 있습니다. -
<
:SRCS
(단일 파일인 경우) 기타 트리거 빌드 오류가 발생합니다 -
@
:OUTS
(단일 파일인 경우) 그렇지 않으면 빌드 오류가 발생합니다. -
RULEDIR
: 대상의 출력 디렉터리(즉, 타겟이 포함된 패키지의 이름에 해당하는genfiles
또는bin
트리 아래 대상//my/pkg:my_genrule
이는 항상my/pkg
로 끝납니다.//my/pkg:my_genrule
의 출력이 하위 디렉터리에 있는 경우에도 마찬가지입니다. -
@D
: 출력 디렉터리 만약 아웃에는 항목이 1개 있습니다. 해당 파일이 포함된 디렉터리로 확장됩니다. 여러 개의 이 항목은genfiles
트리(모든 출력 파일이 동일한 경우일 경우) 하위 디렉터리를 참조하세요.참고:
@D
보다RULEDIR
을 사용하세요.RULEDIR
는 시맨틱이 더 간단하며 동일한 방식으로 동작함 할 수 있습니다genrule이 임시 중간 파일 (예: 컴파일러와 같은 다른 도구를 사용한 결과인 경우)
@D
에 씁니다. 단,/tmp
는 쓰기 가능해야 함)하고 완료하기 전에 제거해야 합니다.특히 입력이 포함된 디렉터리에 쓰지 마세요. 다음 날짜일 수 있습니다. 읽기 전용 파일 시스템일 수 있습니다. 그렇지 않은 경우에도 그렇게 하면 소스 트리가 삭제됩니다.
사전 정의된 소스/출력 경로 변수
사전 정의된 변수 execpath
, execpaths
rootpath
, rootpaths
, location
외
locations
는 라벨 매개변수 (예: $(execpath
//foo:bar)
)를 사용하고 해당 라벨에 표시된 파일 경로를 대체합니다.
소스 파일의 경우 이는 작업공간 루트를 기준으로 한 경로입니다. 규칙의 출력인 경우 파일의 출력 경로입니다. 아래의 출력 파일 설명을 참고하세요.
-
execpath
: execroot 여기서 Bazel이 빌드 작업을 실행합니다위의 예에서 Bazel은 연결된 디렉터리에서 모든 빌드 작업을 실행합니다. 작업공간 루트의
bazel-myproject
심볼릭 링크로 대체합니다. 이 소스 파일(empty.source
)이 경로에 연결되어 있음bazel-myproject/testapp/empty.source
입니다. 따라서 실행 경로( 루트 아래의 하위 경로)은testapp/empty.source
입니다. 이 빌드 작업이 파일을 찾는 데 사용할 수 있는 경로입니다.출력 파일은 유사하게 스테이징되지만 하위 경로가 접두사로 붙습니다.
bazel-out/cpu-compilation_mode/bin
(또는 도구:bazel-out/cpu-opt-exec-hash/bin
). 위의 예에서//testapp:app
는show_app_output
의tools
속성입니다. 따라서 출력 파일app
은bazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app
입니다. 따라서 실행 경로는bazel-out/cpu-opt-exec-hash/bin/testapp/app
입니다. 이 추가 접두사 예를 들어 동일한 하드웨어의 두 개의 다른 CPU에 대해 동일한 타겟을 빌드하지 않아도 된다는 것을 배웠습니다.이 변수에 전달된 라벨은 정확히 하나의 파일을 나타내야 합니다. 대상 소스 파일을 나타내는 라벨이면 자동으로 true가 됩니다. 라벨 규칙은 정확히 하나의 출력을 생성해야 합니다. 만약 false이거나 라벨의 형식이 잘못된 경우 빌드가 실패하고 오류가 발생합니다.
-
rootpath
: 빌드된 바이너리가 사용할 수 있는 경로를 나타냅니다. 실행 파일의 하위 디렉터리를 기준으로 런타임에 종속 항목 찾기 기본 저장소에 해당하는 디렉토리를 표시합니다 참고:--enable_runfiles
이(가) 사용 설정되어 있지만 다음 경우에는 적용되지 않습니다. 기본적으로 Windows입니다. 다음 용도로rlocationpath
사용 크로스 플랫폼 지원을 제공합니다execpath
와 유사하지만 구성이 삭제됩니다. 접두사를 사용하면 됩니다. 위의 예에서 이는empty.source
및app
는 순수 작업공간 기준 사용 경로:testapp/empty.source
및testapp/app
.외부 저장소에 있는 파일의
rootpath
repo
는../repo/
로 시작하고 이어서 저장소 기준 경로를 사용합니다.'출력 하나만' 동일합니다. 요구사항을
execpath
로 정의합니다. -
rlocationpath
: 빌드된 바이너리가 실행 파일 라이브러리의Rlocation
함수에 전달하여 다음 위치에서 종속 항목을 찾을 수 있는 경로입니다. 또는 실행 파일 디렉토리 (사용 가능한 경우)에서 또는 실행 파일 매니페스트를 참조하세요.이것은
rootpath
과 마찬가지로 구성 프리픽스를 사용하지만 항상 이름을 지정합니다 위의 예에서empty.source
및app
의 결과는 다음과 같습니다. 경로:myproject/testapp/empty.source
및myproject/testapp/app
.외부 저장소에 있는 파일의
rlocationpath
repo
는repo/
로 시작하고 이어서 저장소 기준 경로를 사용합니다.이 경로를 바이너리에 전달하고 다음을 사용하여 파일 시스템 경로로 확인합니다. 실행 파일 라이브러리는 런타임 환경입니다
rootpath
와 비교하면 다음과 같은 장점이 있습니다. 모든 플랫폼에서 작동하며 runfiles 디렉터리가 있습니다.'출력 하나만' 동일합니다. 요구사항을
execpath
로 정의합니다. -
location
:execpath
또는 펼쳐지는 속성에 따라rootpath
입니다. 이것은 Starlark 이전 버전의 동작이며 실제로 무엇이 있는지 잘 모르는 경우 권장되지 않습니다. 특정 규칙에 대해 수행됩니다. #2475를 참고하세요. 참조하세요.
execpaths
, rootpaths
, rlocationpaths
locations
는 execpath
의 복수형입니다.
rootpath
, rlocationpath
,location
각각 1개의 값으로 사용합니다. 여러 출력을 생성하는 라벨을 지원합니다.
각 출력은 공백으로 구분됩니다. 0 출력 규칙 및 잘못된 형식
라벨은 빌드 오류를 일으킵니다.
참조된 모든 라벨은 소비 대상의 srcs
에 나타나야 합니다.
출력 파일 또는 deps
. 그렇지 않으면 빌드가 실패합니다. C++ 대상은
data
의 라벨도 참조합니다.
라벨은 표준 형식이 아니어도 됩니다(foo
, :foo
).
및 //somepkg:foo
모두 괜찮습니다.
맞춤 변수
맞춤 'Make' 변수는 "'Make var'(변수 만들기)가 대체'를 지원하지만 이러한 변수를 정의하는 다른 대상에 종속됩니다.
좋은 방법이 없는 한 모든 변수는 맞춤설정해야 합니다. 핵심 Bazel에 베이킹해야 하는 이유입니다. 따라서 Bazel은 tarets를 사용하는 변수를 공급하기 위해 잠재적으로 비용이 많이 드는 종속 항목을 신경 쓰지 않아도 됩니다
C++ 도구 모음 변수
다음은 C++ 도구 모음 규칙에 정의되어 있으며 모든 규칙에 사용할 수 있습니다.
toolchains =
["@bazel_tools//tools/cpp:current_cc_toolchain"]
설정
일부 규칙(예: java_binary
)은 암시적으로
규칙 정의에 C++ 도구 모음을 포함하는지 확인하세요. 이러한 변수를 상속합니다.
자동으로 확장 및 축소할 수 있습니다
기본 제공 C++ 규칙은 "컴파일러를 실행하는 것보다 훨씬 더 정교합니다. 있습니다. *SAN, ThinLTO, 모듈을 사용하거나 사용하지 않고, 동시에 신중하게 최적화된 바이너리를 테스트를 여러 플랫폼에서 빠르게 실행하는 경우 기본 제공 규칙은 입력, 출력, 명령줄 플래그가 올바르게 설정되었는지 확인하기 위한 길이 할 수 있습니다.
이러한 변수는 드물게 있습니다. 이러한 기능을 사용하고 싶다면 먼저 Bazel 개발자에게 문의하세요.
ABI
: C++ ABI 버전입니다.-
AR
: 'ar' 명령어를 실행합니다 -
C_COMPILER
: C/C++ 컴파일러 식별자입니다. 예:llvm
입니다. -
CC
: C 및 C++ 컴파일러 명령어입니다.다음 위치에는 항상
CC_FLAGS
를 사용하는 것이 좋습니다.CC
와 조합됩니다. 그렇게 하지 않는 데 따르는 위험은 사용자가 감수해야 합니다. CC_FLAGS
: C/C++용 최소 플래그 집합입니다. genrule에서 사용할 수 있도록 합니다. 특히 여기에는CC
가 여러 항목을 지원하는 경우 올바른 아키텍처를 선택하세요. 살펴봤습니다-
DUMPBIN
: Microsoft COFF 바이너리 파일 덤프 (dumpbin.exe) 다운로드할 수 있습니다 -
NM
: 'nm' 명령어를 실행합니다 -
OBJCOPY
: C/C++와 동일한 도구 모음의 objcopy 명령어 합니다. -
STRIP
: C/C++와 동일한 도구 모음의 스트립 명령어 합니다.
자바 도구 모음 변수
다음은 Java 도구 모음 규칙에 정의되어 있으며 모든 규칙에 사용할 수 있습니다.
toolchains =
["@bazel_tools//tools/jdk:current_java_runtime"]
(또는
"@bazel_tools//tools/jdk:current_host_java_runtime"
해당 호스트 툴체인의 경우).
JDK의 대부분의 도구는 직접 사용하면 안 됩니다. 내장된 Java는 규칙은 Java 컴파일 및 패키징에 훨씬 더 정교한 접근 방식을 사용합니다. Jar, 헤더 인터페이스 같은 업스트림 도구가 표현할 수 있는 것보다 jar, 고도로 최적화된 Jar 패키징 및 병합 구현이 포함되어 있습니다.
이러한 변수는 드물게 있습니다. 이러한 기능을 사용하고 싶다면 먼저 Bazel 개발자에게 문의하세요.
-
JAVA
: 'java' 명령어 (Java Virtual Private Cloud) 있습니다. 이를 방지하고java_binary
규칙 사용 를 사용하세요. 상대 경로일 수 있습니다.java
를 호출하기 전에 현재 실행 중인 모든 디렉터리를 가져오고 있다면 해당 디렉터리를 변경합니다. JAVABASE
: Java 유틸리티입니다. 상대 경로일 수 있습니다. 'bin'이 포함됩니다. 하위 디렉터리에 있습니다
Starlark 정의 변수
규칙 및 도구 모음 작성자가 정의할 수 있음
전체 맞춤 변수를 반환하여
TemplateVariableInfo
제공업체 이러한 종속 항목에 종속된 모든 규칙은
그러면 toolchains
속성에서 해당 값을 읽을 수 있습니다.