apache / apache/couchdb

[Bug]: Build system smells

Open
#6,109 1 comment 0 reactions 0 assignees View on GitHub
bug needs-triage
Dominant language
Erlang
Stars
7k
Forks
1.1k
Avg merge
1d 16h
Merged PRs (30d)
9

Description

### Version

3.5.2

### Describe the problem you're encountering

Most of these can be considered minor issues, but

- [ ] [Several](https://github.com/apache/couchdb/blob/14c7423c67ed21081a19de8745714364cf638242/INSTALL.Unix.md#debian-based-systems) [documentation](https://github.com/apache/couchdb/blob/14c7423c67ed21081a19de8745714364cf638242/INSTALL.Unix.md#macos) [sources](https://docs.couchdb.org/en/stable/install/unix.html#debian-based-systems) mention a `pkg-config` dependency. I am under a heavy suspicion that this is a false dependency and that `pkg-config` is not used anywhere. If it is used anywhere, it is most certainly used wrong (otherwise cross compilation of couchdb would work).
- [ ] https://github.com/apache/couchdb/blob/78395184b02cdc9573c3536ec72721fb353d5442/configure#L337-L343

This is not how you check for dependencies. This doesn't work well with cross compilation and with systems that deal with includes in a "more creative way" like Nix. Since we have it, why don't we use `pkg-config`?

```
pkg-config --exists mozjs-${SM_VSN}
```

This of course requires further testing. couchdb seems to support a lot of systems, some of them might not have pkg-config working. More than one dependency detection mechanism might be needed, but `pkg-config` should be the first method tried.
- [ ] [Do not hardcode `-j` in a Makefile](https://github.com/apache/couchdb/blob/78395184b02cdc9573c3536ec72721fb353d5442/src/couch_quickjs/rebar.config.script#L24-L27) You do not know how many cores does the build machine have. It it must be done, at least use `-j$(nproc)` (which also doesn't belong in a Makefile).
- [ ] `CFLAGS` overriding is done wrong.

As I've mentioned in #6107, this is issue is often seen in hand-written Makefiles. Please see the following chapter of the GNU Make manual on how `CFLAGS` overriding should be done: https://ftp.gnu.org/old-gnu/Manuals/make-3.80/html_node/make_125.html#SEC129 It is a minor issue though.
- [ ] rebar doesn't echo the build command when builing C/C++

This leads to cleaner output, but it is worse to debug when the compilation fails. There's a reason why Make echos the build commands.

`configure` asks for `rebar` and `rebar3`. I know little about erlang, but it seems like `rebar3` is a successor of `rebar`. If that's the case, it would make sense to fully transition to `rebar3` if possible.

couchdb doesn't have much C code, but I've found errors in a notable portion of its build process. Languate interop can be difficult to get right. I would advise the following:

- Drop all C code which isn't necessary for couchdb. If the C code can be replaced by erlang, do it.

I'd imagine that since couchdb doesn't have much C code, most of it is there for a purpose. But it's useful to reevaluate it just to be sure.
- Check whether official erlang documentation, rebar or some third party source of documentation could be used for guidance on erlang to C/C++ interop. If for example rebar or some other erlang build tool provides a high-level facility for interop, consider switching to it.

I assume the C/C++ code is used for interop. If not, disregard this advice.

Contributor guide

Open the contributing guide

Research direction

Start by auditing configure, INSTALL.Unix.md, and src/couch_quickjs/rebar.config.script, then compare the CFLAGS guidance in the linked GNU Make manual and the related #6107 discussion. The checklist spans dependency detection, cross-compilation, Makefile behavior, compiler output, and rebar migration; done requires deciding scope and validating the build across the supported systems.

Written by the indexing model from the issue text.

Assessment

Tech stack
c, cpp, erlang
Domain
build-system, tooling
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.