Bazel和自动生成的cpp / hpp文件

皮科德·文森特

我开始使用Bazel作为我的C ++项目构建系统。

但是,我遇到了以下问题:

我处于自动生成file.hpp file.cpp(文化编程)的情况。

要重现我的问题,只需使用此最小生成器即可:

-- file.sh --
#!/bin/sh
echo "int foo();" >> file.hpp
echo "#include \"myLib/file.hpp\"\n\nint foo() { return 2017; }" >> file.cpp

我的项目仓库是:(WORKSPACE是一个空文件)

├── myLib
│   ├── BUILD
│   └── file.sh
└── WORKSPACE

BUILD文件是

genrule(
  name = "tangle_file",
  srcs = ["file.sh"],
  outs = ["file.cpp","file.hpp"],
  cmd =  "./$(location file.sh);cp file.cpp $(@D);cp file.hpp $(@D);"
)

cc_library(
    name = "file",
    srcs = ["file.cpp"],
    hdrs = ["file.hpp"],
#    deps = [":tangle_file"],
    visibility = ["//bin:__pkg__"],
)

我有两个问题:

问题(A),涉及genrule()部分:

我必须使用的事实

cmd =  "./$(location file.sh);cp file.cpp $(@D);cp file.hpp $(@D);"

非常神秘。

我的第一次尝试是:

cmd =  "./$(location file.sh)"

但是在那种情况下,我得到以下错误:

声明的输出'myLib / file.cpp'不是genrule创建的。这可能是因为genrule实际上没有创建此输出,或者是因为输出是目录,并且genrule是远程运行的(请注意,只有声明的文件输出的内容是从genrules远程运行的复制的)

问题(B),处理cc_library()部分

我不知道如何使Bazel知道:file目标取决于:tangle_file目标。

如果我没有评论:

deps = [":tangle_file"],

我收到以下错误:

在cc_library规则// myLib:file的deps属性中:genrule规则'// myLib:tangle_file'在此处放错了位置(期望的cc_inc_library,cc_library,objc_library,experimental_objc_library或cc_proto_library)。

亚当

问题(A)

您看到的错误是因为genrule cmd不在其输出目录中运行。如果您用硬编码bazel-out/local-fastbuild/genfiles/myLib/file.cpp而不是file.cppfile.sh脚本编码,则可以使用。但是,建议的方法是让脚本以其输出目录作为参数。

例如,

genrule(
  name = "tangle_file",
  srcs = ["file.sh"],
  outs = ["file.cpp","file.hpp"],
  cmd =  "./$(location file.sh) $(@D)"
)

#!/bin/sh
echo "int foo();" >> $1/file.hpp
echo "#include \"myLib/file.hpp\"\n\nint foo() { return 2017; }" >> $1/file.cpp

问题(B)

你有的事实

srcs = ["file.cpp"],
hdrs = ["file.hpp"],

在你的cc_library是什么告诉巴泽尔认为这取决于genrule,因为genrule创建这些文件。如果要使其更明确,则可以使用标签语法,其作用相同:

srcs = ["//myLib:file.cpp"],
hdrs = ["//myLib:file.hpp"],

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

.hpp和.cpp文件中的常量数组

使用 main() 包含来自其他 cpp(hpp) 文件的函数

如何在CMakeLists.txt中包含h / hpp头文件,而不是cpp或其他hpp文件

使用regex和'find'命令查找* .cpp,*。hpp,*。c和* h文件

如何使Delphi在hpp文件中发出函数和过程定义?

G ++编译.hpp和.cpp文件的方式与共享库不同

编译程序完全在我的.HPP文件中时查找.CPP文件

“ thrift -gen cpp”生成的代码无法在macOS上编译:找不到“ boost / tr1 / functional.hpp”文件

尽管在与main.cpp相同的文件夹中具有json.hpp,但出现“ json.hpp:没有这样的文件或目录”错误

包含Embarcadero C ++ Builder中生成的VCL样式实用程序的.hpp文件时出错

g ++ -I和-L命令查找.hpp文件不起作用

为.cpp和.hpp c ++编写makefile

创建快捷方式来轻松地以崇高的文本格式打开相应的hpp或cpp文件?

src / cpp / cuda.hpp:14:10:致命错误:cuda.h:没有这样的文件或目录

类模板cpp,hpp,cpp

如何使用正则表达式在 cmake 中包含带有后缀(.h、.hpp 和 .hxx)的文件?

从OpenCV使用.hpp头文件

CMake:target.include_ *中的* .hpp和* .cpp

用g ++编译器链接hpp和cpp问题

src / teamcity / teamcity_boost.cpp:22:47:致命错误:boost / test / unit_test_suite_impl.hpp:没有这样的文件或目录

.c与.cc与.cpp与.hpp与.h与.cxx

自动生成和复制文件的好策略是什么?

在R包中包含hpp文件

在Visual Studio中创建hpp文件

Make 在 Boost 中找不到 .hpp 文件

.hpp 文件未在 vscode 中运行

Qt:如何从.ui文件生成.h和.cpp-Vim和Qt实用吗?

Bazel头文件代码生成器

使用Bazel生成QT资源文件