build: Support tools and examples with multiple translation units
Change-Id: I71a5690391464d8275b91f55e914c004eed4f360
Refs: #2344
diff --git a/examples/README.md b/examples/README.md
new file mode 100644
index 0000000..22b71ac
--- /dev/null
+++ b/examples/README.md
@@ -0,0 +1,52 @@
+ndn-cxx examples
+================
+
+By default, examples in `examples/` folder are not built. To enable them, use
+`--with-examples` configure option. For example:
+
+ ./waf configure --with-examples
+ ./waf
+
+There are two ways to add new examples, depending on their complexity:
+
+1. Examples with a single translation unit
+
+ For simple examples that have a single translation unit, the `.cpp` file can be directly put
+ in `examples/` folder and it will be automatically compiled on the next run of `./waf`. Name
+ of the compiled binary will be determined by the base name of the `.cpp` file. For example,
+ `examples/foo.cpp` will be compiled into binary `foo` in `<build>/examples` folder:
+
+ echo "int main() { return 0; }" > examples/foo.cpp
+ ./waf
+ # ... Compiling examples/foo.cpp
+ # ... Linking build/examples/foo
+
+ # To run the example
+ ./build/examples/foo
+
+2. Examples with multiple translation units
+
+ For more complex examples that contain multiple translation units, one can use
+ the following directory structure:
+
+ - Create a directory under `examples/` folder (e.g., `examples/bar`).
+ The name of this directory will determine the name of the compiled binary
+ (`<build>/examples/bar/bar`)
+
+ - Place any number of translation units (e.g., `examples/bar/a.cpp`, `examples/bar/b.cpp`,
+ ...) in this directory. All `.cpp` files in this directory will be compiled and linked
+ together to produce the binary of the example. One of the .cpp files should contain
+ the `main()` function.
+
+ For example:
+
+ mkdir examples/bar
+ echo "int bar(); int main() { return bar(); }" > examples/bar/a.cpp
+ echo "int bar() { return 10; } " > examples/bar/b.cpp
+ ./waf
+ # ... Compiling examples/bar/a.cpp
+ # ... Compiling examples/bar/b.cpp
+ # ... Linking build/examples/bar/bar
+
+ # To run the example
+ ./build/examples/bar/bar
diff --git a/examples/wscript b/examples/wscript
index 7db133e..52de33f 100644
--- a/examples/wscript
+++ b/examples/wscript
@@ -3,10 +3,22 @@
top = '..'
def build(bld):
- for app in bld.path.ant_glob('*.cpp'):
+ # List all .cpp files (whole example should be in one .cpp)
+ for i in bld.path.ant_glob(['*.cpp']):
+ name = str(i)[:-len(".cpp")]
bld(features=['cxx', 'cxxprogram'],
- target = '%s' % (str(app.change_ext('','.cpp'))),
- source = app,
- use = 'ndn-cxx',
- install_path = None,
+ target=name,
+ source=[i] + bld.path.ant_glob(['%s/**/*.cpp' % name]),
+ use='ndn-cxx',
+ install_path=None
+ )
+
+ # List all directories files (example can has multiple .cpp in the directory)
+ for name in bld.path.ant_glob(['*'], dir=True, src=False):
+ bld(features=['cxx', 'cxxprogram'],
+ target="%s/%s" % (name, name),
+ source=bld.path.ant_glob(['%s/**/*.cpp' % name]),
+ use='ndn-cxx',
+ install_path=None,
+ includes='%s' % name,
)