2017-09-10 9 views
3

nanomsg을 사용하는 TensorFlow의 개인 포크 위에 모듈을 작성했습니다.Bazel 프로젝트 내에서 CMake 라이브러리 만들기

로컬 개발 서버의 경우 cmake install을 사용하여 nanomsg (/usr/local)를 설치하고 설치된 위치에서 헤더 파일에 액세스했습니다. 프로젝트는 로컬에서 잘 실행됩니다.

그러나 이제는 TensorFlow 작업 공간에서 nanomsg를 패키징해야합니다. 나는 다음과 같은 두 가지 방법을 시도하고, 발견 한 어느 쪽도하지 만족 :

을 OpenCV에 대한 this answer 유사
  1. , 나는 개인 저장소에 nanomsg를 미리 컴파일 http_archive directive는 다음을 포함하여 (tensorflow/workspace.bzl 이내) 내 작업 공간 내에서로드 헤더 및 라이브러리와 관련된 빌드 스크립트 이것은 잘 실행되지만 휴대용 솔루션은 아닙니다.

  2. 더 많은 휴대용 솔루션으로 나노 미터를 구축하는 데 사용할 수있는 cmake 명령의 특정 시퀀스를 실행하기 위해 genrule을 만들었습니다. 이 접근법은 깔끔하지만 다른 프로젝트의 cmake에는 genrule을 재사용 할 수 없습니다. (나는 this discussion을 언급했다).

분명히 cmake은 Bazel 빌드의 일류 시민으로 지원되지 않습니다. 자신의 프로젝트에서이 문제에 직면 한 사람이 누구나 cmake을 사용하여 빌드 된 Bazel 프로젝트 내에 라이브러리를 포함 할 수있는 일반적인 휴대용 방법을 만들었습니까? 그렇다면 어떻게 접근 했습니까?

+0

얼마나 휴대 성이 좋습니까? 리눅스, 맥 OS, 윈도우? 2의 경우, 다른 프로젝트에 동일한 genrule을 사용할 수없는 것은 왜 문제입니까? 나는 Bazel에 대해 연구하고 있으며, 지금까지는 일반적인 해결책을 제시 한 사람에 대해 들어 보지 못했습니다. –

답변

5

Ulf가 쓴대로 제안 된 옵션 2가 잘 작동해야한다고 생각합니다.

"cmake가 실패하면 식별 할 수 있습니까?"예 : cmake는 실패 할 경우 오류 종료 코드 (! = 0)와 함께 반환해야합니다. 이것은 Bazel이 genrule 액션을 실패한 것으로 자동 인식하여 빌드를 실패하게합니다. 명령을 실행하기 전에 Bazel이 "set -e -o pipefail"을 설정하므로 (cf. https://docs.bazel.build/versions/master/be/general.html#genrule-environment) genrule "cmd"에서 여러 cmake 명령을 연결하는 경우에도이 명령이 작동해야합니다.

cmake 명령을 실제로 실행하는 "cmd"속성의 쉘 스크립트를 호출하는 경우 스크립트의 첫 번째 줄에 "set -e -o pipefail"을 넣어야합니다. 그렇지 않으면 cmake가 실패 할 때 스크립트가 실패하지 않습니다.

내가 "cmake 실패 여부를 식별 할 수 있습니까?"라는 질문을 오해 한 경우 알려 주시기 바랍니다. :)