apps/examples/elf: Add configuration optionst o support building the hello++4 example that depends upon having uClibc++ available. From Leo aloe3132.

This commit is contained in:
Gregory Nutt 2015-05-29 11:47:40 -06:00
parent fe2c662ee8
commit 5f6b3276a2
3 changed files with 42 additions and 9 deletions

View File

@ -16,7 +16,7 @@ config EXAMPLES_ELF_SYSCALL
default n default n
depends on LIB_SYSCALL && !BUILD_KERNEL depends on LIB_SYSCALL && !BUILD_KERNEL
---help--- ---help---
Link with the SYCALL library. By default, all undefined symbols Link with the SYSCALL library. By default, all undefined symbols
must be provided via a symbol table. But if this option is must be provided via a symbol table. But if this option is
selected, then each ELF test program will link with the SYSCALL selected, then each ELF test program will link with the SYSCALL
library and will interface with the OS system calls. In this case, library and will interface with the OS system calls. In this case,
@ -54,4 +54,23 @@ config EXAMPLES_ELF_DEVPATH
Used for registering the RAM block driver that will hold the ROMFS file system Used for registering the RAM block driver that will hold the ROMFS file system
containing the ELF executables to be tested. Default: "/dev/ram0" containing the ELF executables to be tested. Default: "/dev/ram0"
config EXAMPLES_ELF_CXXINITIALIZE
bool "C++ Initialization"
default y
depends on HAVE_CXX && HAVE_CXXINITIALIZE
---help---
By default, if CONFIG_HAVE_CXX and CONFIG_HAVE_CXXINITIALIZE are
defined, then this example will call the NuttX function to
initialize static C++ constructors. This option may be disabled,
however, if that static initialization was performed elsewhere.
config EXAMPLES_ELF_UCLIBCXX
bool "uClibc++ is installed"
default n
depends on UCLIBCXX
---help---
By default, uClibc++ is not installed and configured. If the
user installs and configures the C++ standard library, this
example will compile the demos using it.
endif endif

View File

@ -225,6 +225,12 @@ int elf_main(int argc, char *argv[])
int ret; int ret;
int i; int i;
/* Call all C++ static constructors */
#if defined(CONFIG_EXAMPLES_ELF_CXXINITIALIZE)
up_cxxinitialize();
#endif
/* Initialize the memory monitor */ /* Initialize the memory monitor */
mm_initmonitor(); mm_initmonitor();

View File

@ -67,8 +67,10 @@ BIN1 = hello++1
BIN2 = hello++2 BIN2 = hello++2
ifeq ($(CONFIG_BINFMT_CONSTRUCTORS),y) ifeq ($(CONFIG_BINFMT_CONSTRUCTORS),y)
BIN3 = hello++3 BIN3 = hello++3
ifeq ($(CONFIG_EXAMPLES_ELF_UCLIBCXX),y)
BIN4 = hello++4
endif
endif endif
#BIN4 = hello++4
ALL_BIN = $(BIN1) $(BIN2) $(BIN3) $(BIN4) ALL_BIN = $(BIN1) $(BIN2) $(BIN3) $(BIN4)
SRCS1 = $(BIN1).c SRCS1 = $(BIN1).c
@ -80,10 +82,12 @@ OBJS2 = $(SRCS2:.c=$(OBJEXT))
ifeq ($(CONFIG_BINFMT_CONSTRUCTORS),y) ifeq ($(CONFIG_BINFMT_CONSTRUCTORS),y)
SRCS3 = $(BIN3).c SRCS3 = $(BIN3).c
OBJS3 = $(SRCS3:.c=$(OBJEXT)) OBJS3 = $(SRCS3:.c=$(OBJEXT))
ifeq ($(CONFIG_EXAMPLES_ELF_UCLIBCXX),y)
SRCS4 = $(BIN4).c
OBJS4 = $(SRCS4:.c=$(OBJEXT))
endif
endif endif
#SRCS4 = $(BIN4).c
#OBJS4 = $(SRCS4:.c=$(OBJEXT))
SRCS = $(SRCS1) $(SRCS2) $(SRCS3) $(SRCS4) SRCS = $(SRCS1) $(SRCS2) $(SRCS3) $(SRCS4)
OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4)
@ -122,15 +126,17 @@ ifeq ($(CONFIG_BINFMT_CONSTRUCTORS),y)
$(BIN3): $(OBJS3) $(BIN3): $(OBJS3)
@echo "LD: $<" @echo "LD: $<"
$(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) -o $@ $(ARCHCRT0OBJ) $^ $(LDLIBS) $(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) -o $@ $(ARCHCRT0OBJ) $^ $(LDLIBS)
endif
# BIN4 is similar to BIN3 except that it uses the streams code from libstdc++ # BIN4 is similar to BIN3 except that it uses the streams code from libstdc++
# #
# NOTE: libstdc++ is not available for NuttX as of this writing # NOTE: libstdc++ is not available for NuttX as of this writing
# #
#$(BIN4): $(OBJS4) ifeq ($(CONFIG_EXAMPLES_ELF_UCLIBCXX),y)
# @echo "LD: $<" $(BIN4): $(OBJS4)
# $(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) -o $@ $(ARCHCRT0OBJ) $^ $(LDLIBS) @echo "LD: $<"
$(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) -o $@ $(ARCHCRT0OBJ) $^ $(LDLIBS)
endif
endif
clean: clean:
$(call DELFILE, $(BIN1)) $(call DELFILE, $(BIN1))
@ -145,8 +151,10 @@ install: $(ALL_BIN)
$(Q) install $(BIN2) $(ROMFS_DIR)/$(BIN2) $(Q) install $(BIN2) $(ROMFS_DIR)/$(BIN2)
ifeq ($(CONFIG_BINFMT_CONSTRUCTORS),y) ifeq ($(CONFIG_BINFMT_CONSTRUCTORS),y)
$(Q) install $(BIN3) $(ROMFS_DIR)/$(BIN3) $(Q) install $(BIN3) $(ROMFS_DIR)/$(BIN3)
ifeq ($(CONFIG_EXAMPLES_ELF_UCLIBCXX),y)
$(Q) install $(BIN4) $(ROMFS_DIR)/$(BIN4)
endif
endif endif
# $(Q) install $(BIN4) $(ROMFS_DIR)/$(BIN4)