building system 썸네일형 리스트형 Depsets 이해하기 Depsets 개요 Depsets는 target의 transitive dependency를 효율적으로 수집할 수 있도록 설계한 데이터 구조를 갖고 있고, rule 구현 과정에서 필수적으로 사용된다. Depsets 생성자 depset( direct = [], transitive = [], order = default)depset 생성자의 direct 항목과 transitive 항목은 둘다 list 정보를 입력받아, direct 집합과 모든 transitive 집합의 합집합으로 dependency 요소를 갖고 있는 depset 객체를 반환한다. depset 생성자의 order 항목으로 "postorder", "preorder", "topological" 중 하나를 선택할 수 있고, dependency 요소의.. 더보기 DefaultInfo 프로바이더 이해하기 DefaultInfo 모든 bazel의 rule은 implementation 함수에서 DefaultInfo 프로바이더를 명시적으로 반환하지 않더라도 암묵적으로 DefaultInfo 프로바이더를 갖는다. DefaultInfo는 target의 결과 파일 정보뿐만 아니라, transitive file 정보도 files 멤버로 포함하고 있다. 실행 시간에 필요한 데이터 정보는 default_runfiles 멤버가 포함하고 있다. 일반적으로 default_runfiles 정보가 다른 rule에 참여하면, runfiles 필드 항목을 통해 또다시 포워딩해야 한다. DefaultInfo 멤버 DefaultInfo // 생성자 함수 files // 멤버 변수 files_to_run // 멤버 변수 data_runfil.. 더보기 nasm_library 구현해보기 개요 nasm.exe 기반으로 nasm_libray rule를 정의하는 작업은 매우 흥미롭다. 기본적으로 빌드 시스템이 외부 tool를 제어해 원하는 결과물은 만드는 tool chain 기술이라고 볼 수 있고, 단순한 nasm.exe 파일은 툴을 넘어서, 동시에 앞으로 만날 가장 단순한 형태의 컴파일러라고도 볼 수 있다. 풀어야 과제 풀어야 할 과제는 명확하다. nasm_library가 작동하도록 nasm_library.bzl 파일을 생성해야 한다. nasm_library의 src 항목은 filegroup 정보를 입력으로 사용할 수도 있지만, 일반 asm 파일을 받아낼 수 있어야 한다. 이렇게 만들어진 룰을 곧바로 cc_binary나 cc_library과 연계될 수 있어야 한다. load("//proje.. 더보기 msvc 환경에서 bazel /MD 모드로 컴파일하기 생각보다 간단하다. .bazelrc 파일에 'build --features=static_link_msvcrt'를 추가하면 된다. 디버그 모드는 'build --features=dbg'를 추가하면 된다. 위에 스샷은 static_link_msvcrt가 정상적으로 작동하는지 실행 파일에 대한 의존성 검사 화면!! 더보기 generated file 활용하기 개요 bazel 빌드 시스템 자신이 만든 파일에 의존성을 설정하면, 소스 트리과 대응하는 generated directory를 include directory로 추가할 필요가 있다. 현재 소스 경로를 추가하면, 대응하는 generated directory로 함께 자동으로 추가된다. 즉 generated directory가 아닌 대응하는 소스 경로를 추가해야 한다. 소스 경로를 추가하면 소스 경로 다음에 generated directory를 추가된다는 사실을 컴파일러 파라미터 정보 파일을 열어 보면 확인할 수 있다. 등록 순서에 영향으로 같은 파일이 존재하면 소스 트리에 포함된 파일을 먼저 고려한다. src/BUILD.bazel 파일 코딩 의도는 단순한다. src 폴더에서 x.h 파일을 생성하고, cc_l.. 더보기 platforms module 사용하기 platforms과 select 함수 빌드되는 platforms 정보에 따라 서로 다른 옵션을 설정해야 할 경우가 있다. MODULE.bazel 파일이 다음의 의존성 모듈을 정보를 입력한다. bazel_dep(name = "platforms", version = "0.0.8")사용하는 BUILD.bazel 파일에서 다음처럼 사용할 수 있다. select 함수를 통해서 환경 정보가 만족하면 사용할 구문을 : 이후에 적어주면 된다. genrule( name = "os", outs = ["os.txt"], cmd = select ( { "@platforms//os:linux" : "echo 'linux' > $@", "@platforms//os:windows" : "echo 'window.. 더보기 dependency attribute란? 개요 이번 게시글에서는 이전 게시글 예제를 기반으로 dependency attribute 의미를 알아보자. 의존성이 설정된 파일이 변경되면, 의존하고 있는 target는 다시 빌드한다. 파일이 변경된 여부는 파일 생성 시점이 아닌 파일의 해쉬 데이터으로 확인한다. make_md5_binary.bzl 파일 다시 보기 make_md5_binary.bzl 코딩은 아래와 같다. 참고로 _ 로 시작한 이름은 private 접근 권한을 갖는다. # make_md5_binary.bzl def _make_md5_binary_impl(ctx): ctx.actions.run_shell( outputs = [ctx.outputs.out], inputs = [ctx.file.src], command = "md5sum {} >.. 더보기 StarLark 언어로 만들어 보는 기본 예제 MD5 파일 생성하기 개요 이번 게시글에서는 StarLark 언어를 사용해 md5 파일 생성하는 예제를 구현한다. 본 예제를 통해 사용자 정의 rule를 만들고, rule 기능을 수행하는 implementation function를 구현한다. 풀어야 할 과제 다음과 같은 파일로 구성된다. main.cc 파일의 md5 해쉬값을 생성할 것이다. .bazelrc BUILD.bazel main.cc make_md5_binary.bzl MODULE.bazelconsole 창에 아래 명령어를 입력하면 윈도우 환경에서 해쉬값을 얻어낼 수 있다. [윈도우] certutil -hashfile main.cc md5 [윈도우] bash.exe -c "md5sum main.cc" [우분투] md5sum main.cc결과 화면 CMD> certut.. 더보기 이전 1 2 다음