building system/bazel

generated file 활용하기

opencpp 2024. 1. 30. 21:24
반응형

개요

bazel 빌드 시스템 자신이 만든 파일에 의존성을 설정하면, 소스 트리과 대응하는 generated directory를 include directory로 추가할 필요가 있다. 현재 소스 경로를 추가하면, 대응하는 generated directory로 함께 자동으로 추가된다. 즉 generated directory가 아닌 대응하는 소스 경로를 추가해야 한다.

소스 경로를 추가하면 소스 경로 다음에 generated directory를 추가된다는 사실을 컴파일러 파라미터 정보 파일을 열어 보면 확인할 수 있다. 등록 순서에 영향으로 같은 파일이 존재하면 소스 트리에 포함된 파일을 먼저 고려한다.

src/BUILD.bazel 파일

코딩 의도는 단순한다. src 폴더에서 x.h 파일을 생성하고, cc_libarycc_binary에서 사용하려 한다. 일단 직접적으로 generated file를 cc_binary에서 사용할 수 없다. 대신 cc_library에 사용하고, cc_libarycc_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_binarycc_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

예제 파일

generated files.zip
0.00MB

반응형