generated file 활용하기
개요
bazel 빌드 시스템 자신이 만든 파일에 의존성을 설정하면, 소스 트리과 대응하는 generated directory를 include directory로 추가할 필요가 있다. 현재 소스 경로를 추가하면, 대응하는 generated directory로 함께 자동으로 추가된다. 즉 generated directory가 아닌 대응하는 소스 경로를 추가해야 한다.
소스 경로를 추가하면 소스 경로 다음에 generated directory를 추가된다는 사실을 컴파일러 파라미터 정보 파일을 열어 보면 확인할 수 있다. 등록 순서에 영향으로 같은 파일이 존재하면 소스 트리에 포함된 파일을 먼저 고려한다.
src/BUILD.bazel 파일
코딩 의도는 단순한다. src 폴더에서 x.h 파일을 생성하고, cc_libary
나 cc_binary
에서 사용하려 한다. 일단 직접적으로 generated file를 cc_binary
에서 사용할 수 없다. 대신 cc_library
에 사용하고, cc_libary
를 cc_binary
에서 사용하는 구조로 사용해야 한다.
#src/BUILD.bazel
genrule(
name = "gen_header",
srcs = [],
outs = ["x.h"],
cmd = """echo '#define STR "TEST"
int sum(int, int);// GENDIR: $(GENDIR)' > $@""",
)
cc_library(
name = "lib",
srcs = ["x.cc"],
hdrs = [":gen_header"],
includes = ["."]
)
cc_binary(
name = "main",
srcs = ["main.cc"],
deps = [":lib"],
)
생성된 x.h 파일은 아래와 같다.
#define STR "TEST"
int sum(int, int);// GENDIR: bazel-out/x64_windows-fastbuild/bin
cc_library
에서 hdrs
항목에 genrule 이름을 적어주면 의존성이 설정하고 includes 항목에 자신의 경로, 즉 "."를 추가하면, 대응하는 generated directory도 추가되기 때문에 x.h 형태로 곧바로 사용 수 있다.
//src/x.cc
#include <x.h>
#include <iostream>
int sum(int a, int b) { std::cout << "STR:" << STR <<" sum:" << ( a + b) <<"\n"; return a + b ; }
cc_binary
는 cc_library
의 name을 deps
항목에 적어주면, cc_library
의 includes 항목이 그대로 전파됨으로 그냥 x.h 형태로 사용할 수 있다.
//src/main.cc
#include <x.h>
#include <iostream>
int main( int argc, char** argv) {
sum(100,200);
std::cout << "STR:" << STR << " main\n";
return 0;
}
실행 결과
빌드하기
CMD> bazelisk build //...
INFO: Analyzed 3 targets (0 packages loaded, 0 targets configured).
INFO: Found 3 targets...
INFO: Elapsed time: 0.100s, Critical Path: 0.01s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
실행하기
CMD> bazelisk run //src:main
INFO: Analyzed target //src:main (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //src:main up-to-date:
bazel-bin/src/main.exe
INFO: Elapsed time: 0.115s, Critical Path: 0.01s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
INFO: Running command line: bazel-bin/src/main.exe
STR:TEST sum:300
STR:TEST main