Right. you have to decide whether you want to build in an existing tree or setup a new out of tree build using sources pulled elsewhere. A simple (yet dangerous) way to do that in GNU makefiles is to just override vpath in a Makefile.linux, and then make -f GNUMakefile.linux from wherever you are building:
//Makefile.linux # Find Nutt-X apps directory relative to where I am building from CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ else if [ -x /bin/bash ]; then echo /bin/bash; \ else echo sh; fi ; fi) SHELL := $(CONFIG_SHELL) TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi) APPSDIR := $(TOPDIR)/../.. # pull in sources from nuttx appsdir vpath %.c %.h $(APPSDIR)/pathing/to/file for a single top-level makefile with no children this works OK. On Tue, Feb 22, 2022 at 7:00 PM Gregory Nutt <spudan...@gmail.com> wrote: > I think we have done a great job with C code compatibility across > platforms. I was thinking more of a common application make system that > could work on both Linux and NuttX platforms. The apps/ Makefiles and > Make.defs files and some of the apps Kconfig menu=ing are not compatible. > I would like to be able to just type 'make' and the app build would just do > the right thing. But in order to do that, the build system would have to > know which platform it is building on. > > Perhaps some indirect, ad hoc, heuristic like checking if TOPDIR and APPDIR > are defined. That would probably be enough. Those should always be passed > to the Makefile from the higher level apps/ build logic, but would never be > defined when building the application to run natively on Linux or any other > non-NuttX platform. > > Greg > > > > On Tue, Feb 22, 2022 at 8:31 PM James Dougherty <jafr...@gmail.com> wrote: > > > 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 > > > >> > > > > > > > > > >