All of lore.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.