2018-04-25 02:17:47 +00:00
# rules_foreign_cc
2021-01-24 23:23:19 +00:00
2021-02-12 23:05:18 +00:00
[![Build status ](https://badge.buildkite.com/c28afbf846e2077715c753dda1f4b820cdcc46cc6cde16503c.svg?branch=main )](https://buildkite.com/bazel/rules-foreign-cc?branch=main)
2018-04-26 17:52:06 +00:00
2019-10-23 14:06:34 +00:00
**Rules for building C/C++ projects using foreign build systems inside Bazel projects.**
2018-04-26 17:52:06 +00:00
2019-10-23 14:06:34 +00:00
This is **not an officially supported Google product**
2018-04-26 17:52:06 +00:00
(meaning, support and/or new releases may be limited.)
2021-01-24 23:23:19 +00:00
## Documentation
Documentation for all rules and providers are available [here ](./docs/README.md )
2019-01-29 13:52:47 +00:00
## Bazel versions compatibility
2021-03-22 14:25:05 +00:00
Works with Bazel after 3.7.0 without any flags.
2021-01-25 19:07:05 +00:00
Note that the rules may be compatible with older versions of Bazel but support may break
in future changes as these older versions are not tested.
2019-01-29 13:55:29 +00:00
2019-03-11 15:34:56 +00:00
## News
2021-01-24 23:23:19 +00:00
2021-03-17 15:45:28 +00:00
For more generalized updates, please see [NEWS.md ](./NEWS.md ) or checkout the
[release notes ](https://github.com/bazelbuild/rules_foreign_cc/releases ) of current or previous releases
2019-01-18 17:06:10 +00:00
2021-01-24 23:23:19 +00:00
## Building CMake projects
2018-08-06 13:24:46 +00:00
2021-03-20 20:11:57 +00:00
- Build libraries/binaries with CMake from sources using cmake rule
- Use cmake targets in [cc_library][ccl], [cc_binary][ccb] targets as dependency
- Bazel [cc_toolchain][cct] parameters are used inside cmake build
- See full list of cmake arguments below 'example'
- cmake is defined in `./tools/build_defs`
2021-01-24 23:23:19 +00:00
- Works on Ubuntu, Mac OS and Windows(\* see special notes below in Windows section) operating systems
2018-08-06 13:24:46 +00:00
**Example:**
2018-08-31 12:23:16 +00:00
(Please see full examples in ./examples)
2018-04-26 17:52:06 +00:00
2021-01-24 23:23:19 +00:00
The example for **Windows** is below, in the section 'Usage on Windows'.
2021-02-26 20:21:13 +00:00
- In `WORKSPACE.bazel` , we use a `http_archive` to download tarballs with the libraries we use.
2021-03-20 20:11:57 +00:00
- In `BUILD.bazel` , we instantiate a `cmake` rule which behaves similarly to a [cc_library][ccl], which can then be used in a C++ rule ([cc_binary][ccb] in this case).
2018-04-26 17:52:06 +00:00
2021-02-26 20:21:13 +00:00
In `WORKSPACE.bazel` , put
2018-04-26 17:52:06 +00:00
```python
2018-08-31 12:23:16 +00:00
workspace(name = "rules_foreign_cc_usage_example")
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
2021-03-01 22:41:25 +00:00
# Rule repository, note that it's recommended to use a pinned commit to a released version of the rules
2018-08-13 13:18:14 +00:00
http_archive(
2018-08-31 12:23:16 +00:00
name = "rules_foreign_cc",
2021-03-01 23:14:07 +00:00
sha256 = "c2cdcf55ffaf49366725639e45dedd449b8c3fe22b54e31625eb80ce3a240f1e",
2021-03-01 22:41:25 +00:00
strip_prefix = "rules_foreign_cc-0.1.0",
url = "https://github.com/bazelbuild/rules_foreign_cc/archive/0.1.0.zip",
2018-08-13 13:18:14 +00:00
)
2021-03-12 17:08:13 +00:00
load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies")
2018-08-13 13:18:14 +00:00
2021-02-26 20:21:13 +00:00
# This sets up some common toolchains for building targets. For more details, please see
# https://github.com/bazelbuild/rules_foreign_cc/tree/main/docs#rules_foreign_cc_dependencies
rules_foreign_cc_dependencies()
_ALL_CONTENT = """\
filegroup(
name = "all_srcs",
srcs = glob(["**"]),
2021-04-22 07:59:46 +00:00
visibility = ["//visibility:public"],
2018-08-31 12:23:16 +00:00
)
2021-02-26 20:21:13 +00:00
"""
2018-08-13 13:18:14 +00:00
2021-02-26 20:21:13 +00:00
# pcre source code repository
2018-08-31 12:23:16 +00:00
http_archive(
2021-02-26 20:21:13 +00:00
name = "pcre",
build_file_content = _ALL_CONTENT,
strip_prefix = "pcre-8.43",
urls = [
"https://mirror.bazel.build/ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz",
"https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz",
],
sha256 = "0b8e7465dc5e98c757cc3650a20a7843ee4c3edf50aaf60bb33fd879690d2c73",
2018-04-26 17:52:06 +00:00
)
```
2021-02-26 20:21:13 +00:00
And in the `BUILD.bazel` file, put:
2018-04-26 17:52:06 +00:00
```python
2021-03-12 16:54:14 +00:00
load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake")
2018-08-06 13:24:46 +00:00
2021-03-09 18:55:01 +00:00
cmake(
2021-02-26 20:21:13 +00:00
name = "pcre",
cache_entries = {
"CMAKE_C_FLAGS": "-fPIC",
},
lib_source = "@pcre//:all_srcs",
2021-03-11 17:14:00 +00:00
out_static_libs = ["libpcre.a"],
2018-04-26 17:52:06 +00:00
)
```
then build as usual:
```bash
2021-03-01 19:31:57 +00:00
bazel build //:pcre
2018-04-26 17:52:06 +00:00
```
2018-08-06 13:24:46 +00:00
2018-09-17 12:14:34 +00:00
**Usage on Windows**
2021-03-20 20:11:57 +00:00
When using on Windows, you should start Bazel in MSYS2 shell, as the shell script inside cmake assumes this.
2021-01-24 23:23:19 +00:00
Also, you should explicitly specify **make commands and option to generate CMake crosstool file** .
2018-09-17 12:14:34 +00:00
The default generator for CMake will be detected automatically, or you can specify it explicitly.
2021-01-24 23:23:19 +00:00
**The tested generators:** Visual Studio 15, Ninja and NMake.
2021-02-26 20:21:13 +00:00
The extension `.lib` is assumed for the static libraries by default.
2018-09-17 12:14:34 +00:00
2021-02-26 20:21:13 +00:00
Example usage (see full example in `./examples/cmake_hello_world_lib` ):
2018-09-17 12:14:34 +00:00
Example assumes that MS Visual Studio and Ninja are installed on the host machine, and Ninja bin directory is added to PATH.
```python
2021-03-09 18:55:01 +00:00
cmake(
2018-09-17 12:14:34 +00:00
# expect to find ./lib/hello.lib as the result of the build
name = "hello",
# This option can be omitted
2021-03-17 15:34:02 +00:00
generate_args = [
"-G \"Visual Studio 15 2017\"",
"-A Win64",
],
2018-09-17 12:14:34 +00:00
lib_source = ":srcs",
)
2021-03-09 18:55:01 +00:00
cmake(
2018-09-17 12:14:34 +00:00
name = "hello_ninja",
# expect to find ./lib/hello.lib as the result of the build
lib_name = "hello",
# explicitly specify the generator
2021-03-17 15:34:02 +00:00
generate_args = ["-GNinja"],
2018-09-17 12:14:34 +00:00
lib_source = ":srcs",
)
2021-03-09 18:55:01 +00:00
cmake(
2018-09-17 12:14:34 +00:00
name = "hello_nmake",
# explicitly specify the generator
2021-03-17 15:34:02 +00:00
generate_args = ["-G \"NMake Makefiles\""],
2018-09-17 12:14:34 +00:00
lib_source = ":srcs",
# expect to find ./lib/hello.lib as the result of the build
2021-03-17 15:34:02 +00:00
out_static_libs = ["hello.lib"],
2018-09-17 12:14:34 +00:00
)
```
2021-01-24 23:23:19 +00:00
## Design document
2018-08-31 12:23:16 +00:00
2021-01-24 23:23:19 +00:00
[External C/C++ libraries rules ](https://docs.google.com/document/d/1Gv452Vtki8edo_Dj9VTNJt5DA_lKTcSMwrwjJOkLaoU/edit?usp=sharing )
2021-02-26 20:21:13 +00:00
[ccb]: https://docs.bazel.build/versions/master/be/c-cpp.html#cc_binary
[ccl]: https://docs.bazel.build/versions/master/be/c-cpp.html#cc_library
[cct]: https://docs.bazel.build/versions/master/be/c-cpp.html#cc_toolchain