Hi Greg,

Thanks for this; it is one of the greatest features you have built into
NuttX - POSIX compliance!!!

I have a few programs which compile either for NuttX or Linux/MacOS with no
changes (or Makefile
-D options). I started out that way, using -D__NuttX__ but then found that
besides the includes for NuttX,
almost all of the std c library and some of sys (at least filesystem/serial
code) needs no change!

Instead of gcc dumpspecs archaeology, I just did the opposite and have
NuttX be the fall-out for
conditional includes in the Posix environment. Most NuttX/Linux
cross-platform code files have the below:

#ifndef __linux__
#include <nuttx/config.h> /* NuttX */
#endif

/* POSIX Includes (Linux/Nutt-X) common */
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <math.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/statfs.h>
#include <sys/ioctl.h>
#include <sys/mount.h>
#include <stdbool.h>
#include <errno.h>
#include <time.h>

I also found some mutually exclusive cases like the below:

#ifdef __linux__
/* Linux include -D__linux__ */
#else
/* Nutt-X include  -D__NuttX__ */
#endif

And yes, I found __NuttX__ defined in the past also

$find . -type f | xargs grep _NuttX__
./nuttx/configs/stm32f4discovery/testlibcxx/Make.defs:
 -D__NuttX__
./nuttx/configs/bambino-200e/netnsh/Make.defs:CXXFLAGS += $(ARCHDEFINES)
$(EXTRADEFINES) -pipe -std=c++11 -DCLOCK_MONOTONIC -D__NuttX__
./nuttx/configs/imxrt1050-evk/libcxxtest/Make.defs:            -D__NuttX__
$

Of course if you're targeting more than one RTOS you'll need more, but I
have had great luck with
filesystem, pthread, mutex, and serial (termios) portability.

Thank you
-James






On Tue, Feb 22, 2022 at 5:11 PM Gregory Nutt <spudan...@gmail.com> wrote:

> Hmm.. but that doesn't help with setting up the build.  That definition is
> only visible to C code since it is a C pre-processor definition defined in
> the CFLAGS.  It can't really be used to customize the build, at least not
> in any clean way.
>
> It would have been useful to have a similar, Make=friendly definition as
> well.
>
> On Tue, Feb 22, 2022 at 7:03 PM Gregory Nutt <spudan...@gmail.com> wrote:
>
> > Thanks!  Now I see it defined tools/Config.mk.  Looks like that was added
> > with #2192.  That is exactly what I need!
> >
> > I was thrown off because there are applications that ARE using __NUTTX__:
> >
> > $ grep -rl __NUTTX__ *
> > system/adb/Makefile
> > system/libuv/0001-initial-libuv-port-to-nuttx.patch
> > system/libuv/libuv/Makefile
> > system/libuv/tests/Makefile
> >
> > There are a couple using __NuttX__, but didn't catch those:
> >
> > $ grep -rl __NuttX__ *
> > netutils/ftpd/ftpd.c
> > netutils/webclient/webclient.c
> >
> > Thanks again.
> >
> >
> >
> > On Tue, Feb 22, 2022 at 6:43 PM Nathan Hartman <hartman.nat...@gmail.com
> >
> > wrote:
> >
> >> On Tue, Feb 22, 2022 at 2:14 PM Gregory Nutt <spudan...@gmail.com>
> wrote:
> >>
> >> > One option would be to define __NUTTX_ in tools/Config.mk instead of
> in
> >> > each individual apps/Makefile.  That would provide a single point
> >> > definition coordinate all usage.
> >>
> >>
> >> Just one (possible) correction: IIRC it is capitalized as __NuttX__. All
> >> my
> >> cross platform applications look for __NuttX__ to detect that they are
> >> being built this way. The buildroot toolchain does define that, though I
> >> am
> >> *not* using the buildroot toolchain and it is somehow defined anyway. I
> am
> >> away from my computer at the moment so I cannot check where it is coming
> >> from, but from memory I think we added something to the NuttX build
> >> scripts
> >> some time ago (maybe about 1 or 2 years ago) to cause that to be defined
> >> with all compilers. (Or perhaps I remember wrong and I added it to our
> >> in-house boards' Make.defs.)
> >>
> >> Nathan
> >>
> >
>

Reply via email to