]> git.ipfire.org Git - thirdparty/systemd.git/commit
Add "option parser" infrastracture that helps with cmdline option parsing
authorZbigniew Jędrzejewski-Szmek <zbyszek@amutable.com>
Tue, 24 Feb 2026 15:13:06 +0000 (16:13 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@amutable.com>
Fri, 20 Mar 2026 16:26:52 +0000 (17:26 +0100)
commiteafd3e6a7d1b5c4bd46266a7991ce83d8995fb81
tree941da1445f3ab9c873732e2ddaf5188828e5605b
parent7e14d3b979d3ec51d42b10ffa0561a3c4b3e7dd1
Add "option parser" infrastracture that helps with cmdline option parsing

The basic idea is that we'll have "one source of truth" for the list of
options. Currently, this is split between:
  1. struct option options[] array for long options
  2. the short option parameter to getopt_long()
  3. --help
so it is easy to forget to add or update one of those places where
appropriate.

An option is defined through a macro that includes the option short
and long codes, and also the metavar and help. Those four items can
be used to generate the help string automatically.

The code is easier to read when various parts are written in the same
order.

We can define common options through a macro in the header file,
reducing boilerplate repeated in different files. Over time, if we
discover that the same pattern is used in multiple files, we can add
another "common option".

The macro is defined in a way that the editor can indent it like a
normal case statement.

The error message for ambiguous options is formatted a bit differently:
$ systemd-id128 --no-
systemd-id128: option '--no-' is ambiguous; possibilities: '--no-pager' '--no-legend'
$ build/systemd-id128 --no-
option '--no-' is ambiguous; possibilities: --no-pager, --no-legend

I think the formatting without commas is ugly, but OTOH, the quotes
around option names are superfluous, real option names are easy to
distinguish.
src/shared/meson.build
src/shared/options.c [new file with mode: 0644]
src/shared/options.h [new file with mode: 0644]
src/shared/verbs.c
src/shared/verbs.h