Add apps/examples/cxxtest from Qiang Yu

git-svn-id: http://svn.code.sf.net/p/nuttx/code/trunk@5284 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-10-31 20:13:28 +00:00
parent 66aae459f1
commit 05a1bb2abf
10 changed files with 476 additions and 10 deletions

View File

@ -395,3 +395,5 @@
* nsnlib/nsh_codeccmd.c: NSH commands to use the CODEC library.
Contributed by Darcy Gong.
* apps/examples/wgetjson: Test example contributed by Darcy Gong
* apps/examples/cxxtest: A test for the uClibc++ library provided by
Qiang Yu and the RGMP team.

View File

@ -8,6 +8,7 @@ source "$APPSDIR/examples/buttons/Kconfig"
source "$APPSDIR/examples/can/Kconfig"
source "$APPSDIR/examples/cdcacm/Kconfig"
source "$APPSDIR/examples/composite/Kconfig"
source "$APPSDIR/examples/cxxtest/Kconfig"
source "$APPSDIR/examples/dhcpd/Kconfig"
source "$APPSDIR/examples/elf/Kconfig"
source "$APPSDIR/examples/ftpc/Kconfig"

View File

@ -54,6 +54,10 @@ ifeq ($(CONFIG_EXAMPLES_COMPOSITE),y)
CONFIGURED_APPS += examples/composite
endif
ifeq ($(CONFIG_EXAMPLES_CXXTEST,y)
CONFIGURED_APPS += examples/cxxtest
endif
ifeq ($(CONFIG_EXAMPLES_DHCPD),y)
CONFIGURED_APPS += examples/dhcpd
endif

View File

@ -37,12 +37,12 @@
# Sub-directories
SUBDIRS = adc buttons can cdcacm composite dhcpd discover elf ftpc ftpd hello
SUBDIRS += helloxx hidkbd igmp json lcdrw mm modbus mount nettest nsh null nx
SUBDIRS += nxconsole nxffs nxflat nxhello nximage nxlines nxtext ostest
SUBDIRS += pashello pipe poll pwm qencoder rgmp romfs serloop telnetd
SUBDIRS += thttpd tiff touchscreen udp uip usbserial sendmail usbstorage
SUBDIRS += usbterm watchdog wget wgetjson wlan
SUBDIRS = adc buttons can cdcacm composite cxxtest dhcpd discover elf ftpc
SUBDIRS += ftpd hello helloxx hidkbd igmp json lcdrw mm modbus mount
SUBDIRS += nettest nsh null nx nxconsole nxffs nxflat nxhello nximage
SUBDIRS += nxlines nxtext ostest pashello pipe poll pwm qencoder rgmp
SUBDIRS += romfs serloop telnetd thttpd tiff touchscreen udp uip usbserial
SUBDIRS += sendmail usbstorage usbterm watchdog wget wgetjson wlan
# Sub-directories that might need context setup. Directories may need
# context setup for a variety of reasons, but the most common is because
@ -57,8 +57,8 @@ SUBDIRS += usbterm watchdog wget wgetjson wlan
CNTXTDIRS = pwm
ifeq ($(CONFIG_NSH_BUILTIN_APPS),y)
CNTXTDIRS += adc can cdcacm composite dhcpd discover ftpd json modbus
CNTXTDIRS += nettest qencoder telnetd watchdog wgetjson
CNTXTDIRS += adc can cdcacm composite cxxtestdhcpd discover ftpd json
CNTXTDIRS += modbus nettest qencoder telnetd watchdog wgetjson
endif
ifeq ($(CONFIG_EXAMPLES_HELLO_BUILTIN),y)

View File

@ -239,6 +239,25 @@ examples/composite
CONFIG_EXAMPLES_COMPOSITE_TRACEINTERRUPTS
Show interrupt-related events.
examples/cxxtest
^^^^^^^^^^^^^^^^
This is a test of the C++ standard library. At present a port of the uClibc++
C++ library is available. Due to licensinging issues, the uClibc++ C++ library
is not included in the NuttX source tree by default, but must be installed
(see misc/uClibc++/README.txt for installation).
The only NuttX setting that is required is:
CONFIG_HAVE_CXX=y
The uClibc++ test includes simple test of:
- iostreams,
- STL,
- RTTI, and
- Exceptions
examples/dhcpd
^^^^^^^^^^^^^^

View File

@ -0,0 +1,14 @@
#
# For a description of the syntax of this configuration file,
# see misc/tools/kconfig-language.txt.
#
config EXAMPLES_CXXTEST
bool "C++ test program"
default n
depends on HAVE_CXX
---help---
Enable the C++ test program
if EXAMPLES_CXXTEST
endif

View File

@ -0,0 +1,122 @@
############################################################################
# apps/examples/cxxtest/Makefile
#
# Copyright (C) 2009-2011 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# 3. Neither the name NuttX nor the names of its contributors may be
# used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
############################################################################
-include $(TOPDIR)/.config
-include $(TOPDIR)/Make.defs
include $(APPDIR)/Make.defs
# CXX test program
ASRCS =
CSRCS =
CXXSRCS = cxxtest_main.cxx
AOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))
CXXOBJS = $(CXXSRCS:.cxx=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS) $(CXXSRCS)
OBJS = $(AOBJS) $(COBJS) $(CXXOBJS)
ifeq ($(WINTOOL),y)
BIN = "${shell cygpath -w $(APPDIR)/libapps$(LIBEXT)}"
else
BIN = "$(APPDIR)/libapps$(LIBEXT)"
endif
ROOTDEPPATH = --dep-path .
# cxxtest built-in application info
APPNAME = cxxtest
PRIORITY = SCHED_PRIORITY_DEFAULT
STACKSIZE = 4096
# Common build
VPATH =
all: .built
.PHONY: clean depend disclean chkcxx
chkcxx:
ifneq ($(CONFIG_HAVE_CXX),y)
@echo ""
@echo "In order to use this example, you toolchain must support must"
@echo ""
@echo " (1) Explicitly select CONFIG_HAVE_CXX to build in C++ support"
@echo " (2) Define CXX, CXXFLAGS, and COMPILEXX in the Make.defs file"
@echo " of the configuration that you are using."
@echo ""
@exit 1
endif
$(AOBJS): %$(OBJEXT): %.S
$(call ASSEMBLE, $<, $@)
$(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(CXXOBJS): %$(OBJEXT): %.cxx
$(call COMPILEXX, $<, $@)
.built: chkcxx $(OBJS)
@( for obj in $(OBJS) ; do \
$(call ARCHIVE, $(BIN), $${obj}); \
done ; )
@touch .built
.context:
ifeq ($(CONFIG_EXAMPLES_HELLOXX_BUILTIN),y)
$(call REGISTER,$(APPNAME),$(PRIORITY),$(STACKSIZE),$(APPNAME)_main)
@touch $@
endif
context: .context
.depend: Makefile $(SRCS)
@$(MKDEP) $(ROOTDEPPATH) $(CXX) -- $(CXXFLAGS) -- $(SRCS) >Make.dep
@touch $@
depend: .depend
clean:
@rm -f *.o *~ .*.swp .built
$(call CLEAN)
distclean: clean
@rm -f Make.dep .depend
-include Make.dep

View File

@ -0,0 +1,219 @@
//***************************************************************************
// examples/cxxtest/main.cxx
//
// Copyright (C) 2012 Gregory Nutt. All rights reserved.
// Author: Qiang Yu, http://rgmp.sourceforge.net/wiki/index.php/Main_Page
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in
// the documentation and/or other materials provided with the
// distribution.
// 3. Neither the name NuttX nor the names of its contributors may be
// used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
//***************************************************************************
//***************************************************************************
// Included Files
//***************************************************************************
#include <nuttx/config.h>
#include <nuttx/init.h>
#include <nuttx/arch.h>
#include <iostream>
#include <vector>
#include <map>
#include <stdexcept>
#include <cassert>
using namespace std;
//***************************************************************************
// Definitions
//***************************************************************************
//***************************************************************************
// Private Classes
//***************************************************************************
class Base
{
public:
virtual void printBase(void) {};
};
class Extend : public Base
{
public:
void printExtend(void)
{
cout << "extend" << endl;
}
};
//***************************************************************************
// Private Data
//***************************************************************************
//***************************************************************************
// Public Functions
//***************************************************************************
//***************************************************************************
// Name: test_iostream
//***************************************************************************/
static void test_iostream(void)
{
int a;
string s;
cout << "test iostream===========================" << endl;
cout << "Hello, this is only a test" << endl;
cout << "Print an int: " << 190 << endl;
cout << "Print a char: " << 'd' << endl;
/*
cout << "Please type in an int:" << endl;
cin >> a;
cout << "You type in: " << a << endl;
cout << "Please type in a string:" << endl;
cin >> s;
cout << "You type in: " << s << endl;
*/
}
//***************************************************************************
// Name: test_stl
//***************************************************************************/
static void test_stl(void)
{
cout << "test vector=============================" << endl;
vector<int> v1;
assert(v1.empty());
v1.push_back(1);
assert(!v1.empty());
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
assert(v1.size() == 4);
v1.pop_back();
assert(v1.size() == 3);
cout << "v1=" << v1[0] << ' ' << v1[1] << ' ' << v1[2] << endl;
assert(v1[2] == 3);
vector<int> v2 = v1;
assert(v2 == v1);
string words[4] = {"Hello", "World", "Good", "Luck"};
vector<string> v3(words, words + 4);
vector<string>::iterator it;
for (it = v3.begin(); it != v3.end(); it++)
{
cout << *it << ' ';
}
cout << endl;
assert(v3[1] == "World");
cout << "test map================================" << endl;
map<int,string> m1;
m1[12] = "Hello";
m1[24] = "World";
assert(m1.size() == 2);
assert(m1[24] == "World");
}
//***************************************************************************
// Name: test_rtti
//***************************************************************************/
static void test_rtti(void)
{
cout << "test rtti===============================" << endl;
Base *a = new Base();
Base *b = new Extend();
assert(a);
assert(b);
Extend *t = dynamic_cast<Extend *>(a);
assert(t == NULL);
t = dynamic_cast<Extend *>(b);
assert(t);
t->printExtend();
delete a;
delete b;
}
//***************************************************************************
// Name: test_exception
//***************************************************************************/
static void test_exception(void)
{
cout << "test exception==========================" << endl;
try
{
throw runtime_error("runtime error");
}
catch (runtime_error &e)
{
cout << "Catch exception: " << e.what() << endl;
}
}
//***************************************************************************
// Public Functions
//***************************************************************************
//***************************************************************************
// Name: cxxtest_main
//***************************************************************************/
int cxxtest_main(int argc, char *argv[])
{
// If C++ initialization for static constructors is supported, then do
// that first
#ifdef CONFIG_HAVE_CXXINITIALIZE
up_cxxinitialize();
#endif
test_iostream();
test_stl();
test_rtti();
test_exception();
return 0;
}

85
misc/uClibc++/README.txt Executable file
View File

@ -0,0 +1,85 @@
misc/uClib++ README
^^^^^^^^^^^^^^^^^^^
This directory contains a version of the uClibc++ C++ library. This code
originates from http://cxx.uclibc.org/ and has been adapted for NuttX by the
RGMP team (http://rgmp.sourceforge.net/wiki/index.php/Main_Page).
uClibc++ resides in the misc/ directory rather than in the main NuttX source
tree due to licensing issues: NuttX is licensed under the permissiv
modified BSD License; uClibc, on the other hand, islicensed under the
stricter GNU LGPL Version 3 license.
Installation of uClibc++
^^^^^^^^^^^^^^^^^^^^^^^^
If you wish to use uClibc++ with NuttX, you will be required to comply with
the licensing requires of the GNU LGPL Version 3 license. A simple
installation script is provided at misc/uClibc++/install.sh that can be used
to install the uClibc++ components into the NuttX source tree.
The install script takes only a single arguement: The path to the nuttx
directory. If your directory structure is the same as the SVN structure
(with misc/ and nuttx/ at the same level), then uClibc++ can be installed
using this command executed from the misc/uClibc++ directory:
./install.sh ../../nuttx
If you run the install.sh like this, then it will (1) make sure you
understand that you have tainted the NuttX BSD license with LGPLv3, and (2)
copy the uClibc++ sources files into nuttx/libxx/uClibc++, include/, and
include/cxx.
Building NuttX with uClibc++
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
After installing uClibc++ in this way, no additional steps should be
required to build NuttX with the uClibc++ library incorporated:
$ cd ../../nuttx
$ . ./setenv.sh
$ make
Here is how it works:
There is a new file called Make.defs in misc/uClibc/libxx/uClibc++. After
installation, it will reside at nuttx/libxx/uClibc++. The
nuttx/libxx/Makefile will (conditionally) include this Make.defs file:
-include uClibc++/Make.defs
This Make.defs file, if present, will add the uClibc++ source files to the
build, add the uClibc++ subdirectory to the dependency list, and add the
uClibc++ subdirectory to the VPATH. That should, in principle, be all it
takes.
Dependencies
^^^^^^^^^^^^
In order to build libxx (and hence libxx/uClibc++), CONFIG_HAVE_CXX must be
defined in your NuttX configuration file.
The C++ runtime support is provided by GCC libgcc_eh.a and libsupc++.a
libraries.
RGMP
^^^^
The target platform is RGMP X86, it is also updated for TLS support which is
needed by these two libraries. So application can also use TLS on RGMP NuttX
port.
Command to compile and install RGMP:
$ make
$ make install
$ /usr/rgmp/setup
$ exit
Command to compile and run NUTTX:
$ cd nuttx/tools
$ ./configure rgmp/x86/cxxtest
$ cd ..
$ make
$ rgmp_run

View File

@ -264,8 +264,8 @@ fi
# Licensing
echo "You are about to install the uClibc++ library into the NuttX source"
echo "tree. NuttX is licensed under a modified BSD License; uClibc is"
echo "licensed under the GNU LGPL Version 3 license. When you install"
echo "tree. NuttX is licensed under the permissive, modified BSD License; uClibc"
echo "is licensed under the GNU LGPL Version 3 license. When you install"
echo "uClibc++ into the NuttX source tree, you must then comply with uClibc's"
echo "stricter GNU LGPL Version 3 license."
echo ""