bazel-contrib / bazel-contrib/rules_foreign_cc

cmake builds in bazel 8+ can produce improper includes paths

Open
#1,430 0 comments 1 reaction 0 assignees View on GitHub
Dominant language
Starlark
Stars
737
Forks
270
PR merge metrics
No merged PRs in 30d

Description

Not sure what changed in bazel 8+, but the repro below shows that this ruleset produces what looks like the full path of a dereferenced symlink in the includes dir. The issue does not appear in bazel 7.6.1

### Create a workspace for the minimal repro
```
# MODULE.bazel
module(
name = "proxsuite_repro",
version = "0.1.0",
)

bazel_dep(name = "rules_foreign_cc", version = "0.15.0")

http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
name = "proxsuite",
build_file = "@//:third_party/proxsuite/build_file.bazel",
integrity = "sha256-wukoqjXEL9xSl6gbncxqf5J8igsBoY0ZhHgNZ969qnY=",
strip_prefix = "proxsuite-0.5.0",
url = "https://github.com/Simple-Robotics/proxsuite/releases/download/v0.5.0/proxsuite-0.5.0.tar.gz",
)
```
```
# thirdparty/proxsuite/build_file.bazel
load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake")

filegroup(
name = "all_srcs",
srcs = glob(["**"]),
)

cmake(
name = "proxsuite",
generate_args = [
"-GNinja",
],
cache_entries = {
"CMAKE_BUILD_TYPE": "RelWithDebInfo",
"BUILD_TESTING": "OFF",
"BUILD_PYTHON_INTERFACE": "OFF",
"BUILD_WITH_VECTORIZATION_SUPPORT": "ON",
},
copts = ["-Wno-error"],
lib_source = ":all_srcs",
out_headers_only = True,
visibility = ["//visibility:public"],
)
```

### Launch base container (assuming you are in your working dir)

```
docker run -v .:/tmp/workspace -it ubuntu:22.04 bash
```

### In container Install deps for build

```
apt update && apt install -y wget build-essential libeigen3-dev=3.4.0* libsimde-dev=0.7.2*
```

### Install bazelisk to swap between versions easily later

```
wget --progress=dot:giga https://github.com/bazelbuild/bazelisk/releases/download/v1.22.1/bazelisk-amd64.deb && dpkg -i bazelisk-amd64.deb && rm -f bazelisk-amd64.deb
```

### enter working dir

```
cd /tmp/workspace
```

### build using latest bazel version as of writing

```
echo 8.3.1 > .bazelversion
bazel build @proxsuite
ls bazel-bin/external/+_repo_rules+proxsuite/proxsuite/include
# Note that there are 2 dirs in the includes directory one looks like symlinks were dereferenced and the full path was placed in the direcory.
```
#### output
```
root@4e93b28779b9:/tmp/workspace# tree -a bazel-bin/external/+_repo_rules+proxsuite/proxsuite
bazel-bin/external/+_repo_rules+proxsuite/proxsuite
`-- include
|-- proxsuite
| |-- config.hpp
| |-- deprecated.hpp
| `-- warning.hpp
`-- root
`-- .cache
`-- bazel
`-- _bazel_root
`-- 9cc7d801fb7b9b2f471013117c1d1061
`-- sandbox
`-- processwrapper-sandbox
`-- 3
`-- execroot
`-- _main
`-- external
`-- +_repo_rules+proxsuite
`-- proxsuite
|-- fwd.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/+_repo_rules+proxsuite/include/proxsuite/fwd.hpp
|-- helpers
| |-- common.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/+_repo_rules+proxsuite/include/proxsuite/helpers/common.hpp

...
```

### Revert to latest 7.x.y version (7.6.1 as of writing)
```
echo 7.6.1 > .bazelversion
bazel build @proxsuite
ls bazel-bin/external/_main~_repo_rules~proxsuite/proxsuite/include
# Note that there is only 1 dir with the includes placed properly.
```
#### output
```
root@4e93b28779b9:/tmp/workspace# tree -a bazel-bin/external/_main~_repo_rules~proxsuite/proxsuite
bazel-bin/external/_main~_repo_rules~proxsuite/proxsuite
`-- include
`-- proxsuite
|-- config.hpp
|-- deprecated.hpp
|-- fwd.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/_main~_repo_rules~proxsuite/include/proxsuite/fwd.hpp
|-- helpers
| |-- common.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/_main~_repo_rules~proxsuite/include/proxsuite/helpers/common.hpp
| |-- instruction-set.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/_main~_repo_rules~proxsuite/include/proxsuite/helpers/instruction-set.hpp
| |-- optional.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/_main~_repo_rules~proxsuite/include/proxsuite/helpers/optional.hpp
| |-- tl-optional.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/_main~_repo_rules~proxsuite/include/proxsuite/helpers/tl-optional.hpp
| `-- version.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/_main~_repo_rules~proxsuite/include/proxsuite/helpers/version.hpp
|-- linalg
| |-- dense
| | |-- core.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/_main~_repo_rules~proxsuite/include/proxsuite/linalg/dense/core.hpp
| | |-- factorize.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/_main~_repo_rules~proxsuite/include/proxsuite/linalg/dense/factorize.hpp
| | |-- ldlt.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/_main~_repo_rules~proxsuite/include/proxsuite/linalg/dense/ldlt.hpp
| | |-- modify.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/_main~_repo_rules~proxsuite/include/proxsuite/linalg/dense/modify.hpp
| | |-- solve.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/_main~_repo_rules~proxsuite/include/proxsuite/linalg/dense/solve.hpp
| | `-- update.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/_main~_repo_rules~proxsuite/include/proxsuite/linalg/dense/update.hpp
| |-- sparse
| | |-- core.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/_main~_repo_rules~proxsuite/include/proxsuite/linalg/sparse/core.hpp
| | |-- factorize.hpp -> /root/.cache/bazel/_bazel_root/9cc7d801fb7b9b2f471013117c1d1061/execroot/_main/external/_main~_repo_rules~proxsuite/include/proxsuite/linalg/sparse/factorize.hpp
...
```

Contributor guide

Open the contributing guide

Research direction

Reproduce the issue using MODULE.bazel and third_party/proxsuite/build_file.bazel with Bazel 8.3.1, then repeat with 7.6.1. Compare the generated bazel-bin include trees and inspect the rules_foreign_cc cmake rule's handling of the include output; done means Bazel 8+ produces the same properly arranged include tree as Bazel 7.

Written by the indexing model from the issue text.

Assessment

Tech stack
cmake, docker
Domain
build-system
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.