public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Willy Tarreau <w@1wt.eu>
To: "Thomas Weißschuh" <thomas.weissschuh@linutronix.de>
Cc: "Shuah Khan" <shuah@kernel.org>,
	"Shuah Khan" <skhan@linuxfoundation.org>,
	"Thomas Weißschuh" <linux@weissschuh.net>,
	linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org
Subject: Re: [PATCH 24/32] tools/nolibc: add getopt()
Date: Wed, 5 Mar 2025 09:03:48 +0100	[thread overview]
Message-ID: <20250305080348.GA15844@1wt.eu> (raw)
In-Reply-To: <20250305081713-94bcf231-26a2-40fd-b54d-e0cc0251e521@linutronix.de>

On Wed, Mar 05, 2025 at 08:25:14AM +0100, Thomas Weißschuh wrote:
> On Tue, Mar 04, 2025 at 08:54:29AM +0100, Willy Tarreau wrote:
> > On Tue, Mar 04, 2025 at 08:10:54AM +0100, Thomas Weißschuh wrote:
> > > diff --git a/tools/include/nolibc/getopt.h b/tools/include/nolibc/getopt.h
> > > new file mode 100644
> > > index 0000000000000000000000000000000000000000..35aee582681b79e21bce8ddbf634ae9dfdef8f1d
> > > --- /dev/null
> > > +++ b/tools/include/nolibc/getopt.h
> > > @@ -0,0 +1,105 @@
> > > +/* SPDX-License-Identifier: LGPL-2.1 OR MIT */
> > > +/*
> > > + * getopt function definitions for NOLIBC, adapted from musl libc
> > > + * Copyright (C) 2005-2020 Rich Felker, et al.
> > > + * Copyright (C) 2025 Thomas Weißschuh <linux@weissschuh.net>
> > > + */
> > > +
> > > +#ifndef _NOLIBC_GETOPT_H
> > > +#define _NOLIBC_GETOPT_H
> > > +
> > > +struct FILE;
> > > +static struct FILE *const stderr;
> > > +static int fprintf(struct FILE *stream, const char *fmt, ...);
> > 
> > Is there a particular reason why you had to define these here
> > and include nolibc.h at the bottom instead of doing it the usual
> > way with the include at the top ?
> > 
> > If that's due to a limitation in nolibc, we might want to have a
> > closer look at it before it starts to affect other areas. Also if
> > in the future we have to add some str* dependencies here, it would
> > be easier if we can simply include the file as well.
> 
> Doing a regular #include "stdio.h" does fail with the following error:
> 
> In file included from sysroot/i386/include/nolibc.h:109,
>                  from sysroot/i386/include/errno.h:26,
>                  from sysroot/i386/include/stdio.h:12,
>                  from harness-selftest.c:3,
>                  from nolibc-test.c:5:
> sysroot/i386/include/getopt.h: In function 'getopt':
> sysroot/i386/include/getopt.h:72:25: error: implicit declaration of function 'fprintf' [-Werror=implicit-function-declaration]
>    72 |                         fprintf(stderr, "%s: unrecognized option: %c\n", argv[0], *optchar);
>       |                         ^~~~~~~
> [+ some followup errors]
> 
> The include chain is important here.
> The user code includes "stdio.h", which at the very beginning includes
> errno.h->nolibc.h->getopt.h. Now getopt.h tries to use the definitions from
> stdio.h. However as stdio.h was the entrypoint and is not yet fully parsed,
> these definitions are not yet available.

OK got it, the usual includes dependency mess when it comes to inline
code (here it's static but it's the same) :-(

In the early days I had thought about placing everything in to nolibc.h
and making the standard include files just stubs that would include it,
but I didn't pursue that direction since I had not reached the point of
the problems.

Maybe for the long term we'll have to reopen that reflexion. We could
even have:

  nolibc.h:
     #include "nolibc-types.h"
     #include "nolibc-stdio.h"
     #include "nolibc-stdlib.h"
     ... etc

  and stdio.h, stdlib, etc:
     #include "nolibc.h"

That could be a clean and non-invasive change that would make sure we
always include everything we need in the desired order. If we still
end up with trouble due to some cross-references (since statics are
painful for that), then it becomes possible to have extra -proto.h
files to only declare types and prototypes, not inlines, and that
will be included first.

Let's discuss that later, thanks for explaining!
Willy

  reply	other threads:[~2025-03-05  8:04 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-04  7:10 [PATCH 00/32] kselftest harness and nolibc compatibility Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 01/32] selftests: harness: Add harness selftest Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 02/32] selftests: harness: Use C89 comment style Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 03/32] selftests: harness: Ignore unused variant argument warning Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 04/32] selftests: harness: Mark functions without prototypes static Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 05/32] selftests: harness: Remove inline qualifier for wrappers Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 06/32] selftests: harness: Guard includes on nolibc Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 07/32] selftests: harness: Remove dependency on libatomic Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 08/32] selftests: harness: Implement test timeouts through pidfd Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 09/32] selftests: harness: Don't set setup_completed for fixtureless tests Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 10/32] selftests: harness: Always provide "self" and "variant" Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 11/32] selftests: harness: Move teardown conditional into test metadata Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 12/32] selftests: harness: Add teardown callback to " Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 13/32] selftests: harness: Stop using setjmp()/longjmp() Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 14/32] tools/nolibc: handle intmax_t/uintmax_t in printf Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 15/32] tools/nolibc: use intmax definitions from compiler Thomas Weißschuh
2025-03-04  7:37   ` Willy Tarreau
2025-03-04 11:08     ` Thomas Weißschuh
2025-03-04 20:29       ` Willy Tarreau
2025-03-04  7:10 ` [PATCH 16/32] tools/nolibc: use pselect6_time64 if available Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 17/32] tools/nolibc: use ppoll_time64 " Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 18/32] tools/nolibc: add tolower() and toupper() Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 19/32] tools/nolibc: add _exit() Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 20/32] tools/nolibc: add setpgrp() Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 21/32] tools/nolibc: implement waitpid() in terms of waitid() Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 22/32] Revert "selftests/nolibc: use waitid() over waitpid()" Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 23/32] tools/nolibc: add dprintf() and vdprintf() Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 24/32] tools/nolibc: add getopt() Thomas Weißschuh
2025-03-04  7:54   ` Willy Tarreau
2025-03-05  7:25     ` Thomas Weißschuh
2025-03-05  8:03       ` Willy Tarreau [this message]
2025-03-04  7:10 ` [PATCH 25/32] tools/nolibc: allow different write callbacks in printf Thomas Weißschuh
2025-03-04  7:59   ` Willy Tarreau
2025-03-04 11:10     ` Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 26/32] tools/nolibc: allow limiting of printf destination size Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 27/32] tools/nolibc: add snprintf() and friends Thomas Weißschuh
2025-03-04  8:01   ` Willy Tarreau
2025-03-04  7:10 ` [PATCH 28/32] selftests/nolibc: use snprintf() for printf tests Thomas Weißschuh
2025-03-04  7:10 ` [PATCH 29/32] selftests/nolibc: rename vfprintf test suite Thomas Weißschuh
2025-03-04  7:11 ` [PATCH 30/32] selftests/nolibc: add test for snprintf() truncation Thomas Weißschuh
2025-03-04  7:11 ` [PATCH 31/32] tools/nolibc: implement width padding in printf() Thomas Weißschuh
2025-03-04  7:11 ` [PATCH 32/32] HACK: selftests/nolibc: demonstrate usage of the kselftest harness Thomas Weißschuh
2025-03-04  8:06 ` [PATCH 00/32] kselftest harness and nolibc compatibility Willy Tarreau

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250305080348.GA15844@1wt.eu \
    --to=w@1wt.eu \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux@weissschuh.net \
    --cc=shuah@kernel.org \
    --cc=skhan@linuxfoundation.org \
    --cc=thomas.weissschuh@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox