daemon+rib: Merge nrd and nfd into a single process (separate threads)

Change-Id: I41952d5b8ee29f109130c570e0d13ccad6970d2f
Refs: #2489
This commit is contained in:
Alexander Afanasyev committed 2015-02-15 12:43:49 -08:00
1 parent 63df436e5f
commit f08a7376e9
13 files changed
+190 -373

No files matched your search

+27 -38
View File
@@ -7,23 +7,17 @@ when they die.
Initial setup
-------------
Edit `net.named-data.nfd` and `net.named-data.nrd` correcting paths for `nfd` and `nfd`
binaries, configuration file, and log files.
Edit `net.named-data.nfd` correcting paths for `nfd` binary, configuration and log files.
# Copy launchd.plist for nfd (forwarding daemon)
# Copy launchd.plist for NFD
sudo cp net.named-data.nfd.plist /Library/LaunchDaemons/
sudo chown root /Library/LaunchDaemons/net.named-data.nfd.plist
# Copy launchd.plist for nrd (RIB management daemon)
sudo cp net.named-data.nrd.plist /Library/LaunchDaemons/
sudo chown root /Library/LaunchDaemons/net.named-data.nrd.plist
### Assumptions in the default scripts
* `nfd` and `nrd` are installed into `/usr/local/bin`
* `nfd` is installed into `/usr/local/bin`
* Configuration file is `/usr/local/etc/ndn/nfd.conf`
* `nfd` will be run as root
* `nrd` will be run as user `ndn` and group `ndn`
* Log files will be written to `/usr/local/var/log/ndn` folder, which is owned by user `ndn`
### Creating users
@@ -62,29 +56,24 @@ Folder `/usr/local/var/log/ndn` should be created and assigned proper user and g
sudo mkdir -p /usr/local/var/log/ndn
sudo chown -R ndn:ndn /usr/local/var/log/ndn
`HOME` directories for `nfd` and `nrd` should be created and configured with correct
library's config file and contain proper NDN security credentials for signing Data
packets. This is necessary since default private key storage on OSX (`osx-keychain`) does
not support non-interactive access, and file-based private key storage needs to be used:
`HOME` directory for `nfd` should be created and configured with correct library's config file
and contain proper NDN security credentials for signing Data packets. This is necessary since
default private key storage on OSX (`osx-keychain`) does not support non-interactive access,
and file-based private key storage needs to be used:
# Generate self-signed NDN certificate for nfd (owned by root)
sudo mkdir -p /usr/local/var/lib/ndn/nfd/.ndn
sudo sh -c 'echo tpm=file > /usr/local/var/lib/ndn/nfd/.ndn/client.conf'
sudo HOME=/usr/local/var/lib/ndn/nfd ndnsec-keygen /localhost/daemons/nfd | \
sudo HOME=/usr/local/var/lib/ndn/nfd ndnsec-install-cert -
# Generate self-signed NDN certificate for nrd (owned by ndn)
sudo mkdir -p /usr/local/var/lib/ndn/nrd/.ndn
sudo chown -R ndn:ndn /usr/local/var/lib/ndn/nrd
sudo -u ndn -g ndn sh -c 'echo tpm=file > /usr/local/var/lib/ndn/nrd/.ndn/client.conf'
sudo -u ndn -g ndn HOME=/usr/local/var/lib/ndn/nrd ndnsec-keygen /localhost/daemons/nrd | \
sudo -u ndn -g ndn HOME=/usr/local/var/lib/ndn/nrd ndnsec-install-cert -
# Create HOME and generate self-signed NDN certificate for nfd
sudo -s -- ' \
mkdir -p /usr/local/var/lib/ndn/nfd/.ndn; \
export HOME=/usr/local/var/lib/ndn/nfd; \
echo tpm=tpm-file > /usr/local/var/lib/ndn/nfd/.ndn/client.conf; \
ndnsec-keygen /localhost/daemons/nfd | ndnsec-install-cert -; \
'
### Configuring NFD's security
NFD sample configuration allows anybody to create faces, add nexthops to FIB,
and set strategy choice for namespaces. While such settings could be a good start, it is
generally not a good idea to run NFD in this mode.
NFD sample configuration allows anybody to create faces, add nexthops to FIB, and set strategy
choice for namespaces. While such settings could be a good start, it is generally not a good
idea to run NFD in this mode.
While thorough discussion about security configuration of NFD is outside the scope of this
document, at least the following change should be done to nfd.conf in authorize section:
@@ -93,7 +82,7 @@ document, at least the following change should be done to nfd.conf in authorize
{
authorize
{
certfile certs/localhost_daemons_nrd.ndncert
certfile certs/localhost_daemons_nfd.ndncert
privileges
{
faces
@@ -114,25 +103,25 @@ document, at least the following change should be done to nfd.conf in authorize
}
While this configuration still allows management of faces and updating strategy choice by
anybody, only NFD's RIB Manager Daemon (`nrd`) is allowed to manage FIB.
anybody, only NFD's RIB Manager (i.e., NFD itself) is allowed to manage FIB.
As the final step to make this configuration work, nrd's self-signed certificate needs to
be exported into `localhost_daemons_nrd.ndncert` file:
As the final step to make this configuration work, NFD's self-signed certificate needs to
be exported into `localhost_daemons_nfd.ndncert` file:
sudo mkdir /usr/local/etc/ndn/certs
sudo sh -c 'sudo -u ndn -g ndn HOME=/usr/local/var/lib/ndn/nrd \
ndnsec-dump-certificate -i /localhost/daemons/nrd \
> /usr/local/etc/ndn/certs/localhost_daemons_nrd.ndncert'
sudo -s -- '\
mkdir -p /usr/local/etc/ndn/certs || true; \
export HOME=/usr/local/var/lib/ndn/nfd; \
ndnsec-dump-certificate -i /localhost/daemons/nfd > \
/usr/local/etc/ndn/certs/localhost_daemons_nfd.ndncert; \
'
Enable auto-start
-----------------
sudo launchctl load -w /Library/LaunchDaemons/net.named-data.nfd.plist
sudo launchctl load -w /Library/LaunchDaemons/net.named-data.nrd.plist
Disable auto-start
------------------
sudo launchctl unload -w /Library/LaunchDaemons/net.named-data.nfd.plist
sudo launchctl unload -w /Library/LaunchDaemons/net.named-data.nrd.plist
@@ -1,25 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd" >
<plist version='1.0'>
<dict>
<key>Label</key><string>net.named-data.nrd</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/nrd</string>
<string>--config</string>
<string>/usr/local/etc/ndn/nfd.conf</string>
</array>
<key>UserName</key><string>ndn</string>
<key>GroupName</key><string>ndn</string>
<key>EnvironmentVariables</key>
<dict>
<key>HOME</key><string>/usr/local/var/lib/ndn/nrd</string>
</dict>
<key>Debug</key><true/>
<key>Disabled</key><true/>
<key>KeepAlive</key><true/>
<key>StandardErrorPath</key><string>/usr/local/var/log/ndn/nrd.log</string>
<key>ProcessType</key><string>Background</string>
</dict>
</plist>
+26 -45
View File
@@ -8,26 +8,18 @@ when they die.
Initial setup
-------------
Edit `nfd.conf` and `nrd.conf` correcting paths for `nfd` and `nfd` binaries,
configuration file, and log files.
* Edit `nfd.conf` correcting paths for `nfd` binary, configuration and log files.
# Copy upstart config file for nfd (forwarding daemon)
sudo cp nfd.conf /etc/init/
* Copy upstart config file for NFD
# Copy upstart config file for nrd (RIB management daemon)
sudo cp nrd.conf /etc/init/
# Copy upstart config file for nfd-watcher (will restart NFD when network change detected)
sudo cp nfd-watcher.conf /etc/init/
sudo cp nfd.conf /etc/init/
### Assumptions in the default scripts
* `nfd` and `nrd` are installed into `/usr/local/bin`
* `nfd` is installed into `/usr/local/bin`
* Configuration file is `/usr/local/etc/ndn/nfd.conf`
* `nfd` will be run as root
* `nrd` will be run as user `ndn` and group `ndn`
* Log files will be written to `/usr/local/var/log/ndn` folder, which is owned by user `ndn`
* Whenever network connectivity changes, both `nfd` and `nrd` are restarted
### Creating users
@@ -53,19 +45,15 @@ Folder `/usr/local/var/log/ndn` should be created and assigned proper user and g
sudo mkdir -p /usr/local/var/log/ndn
sudo chown -R ndn:ndn /usr/local/var/log/ndn
`HOME` directories for `nfd` and `nrd` should be created prior to starting. This is
necessary to manage unique security credentials for the deamons.
`HOME` directory for `nfd` should be created prior to starting. This is necessary to manage
unique security credentials for the deamon.
# Create HOME and generate self-signed NDN certificate for nfd
sudo mkdir -p /usr/local/var/lib/ndn/nfd/.ndn
sudo HOME=/usr/local/var/lib/ndn/nfd ndnsec-keygen /localhost/daemons/nfd | \
sudo HOME=/usr/local/var/lib/ndn/nfd ndnsec-install-cert -
# Create HOME and generate self-signed NDN certificate for nrd
sudo mkdir -p /usr/local/var/lib/ndn/nrd/.ndn
sudo chown -R ndn:ndn /usr/local/var/lib/ndn/nrd
sudo -u ndn -g ndn HOME=/usr/local/var/lib/ndn/nrd ndnsec-keygen /localhost/daemons/nrd | \
sudo -u ndn -g ndn HOME=/usr/local/var/lib/ndn/nrd ndnsec-install-cert -
sudo -s -- ' \
mkdir -p /usr/local/var/lib/ndn/nfd/.ndn; \
export HOME=/usr/local/var/lib/ndn/nfd; \
ndnsec-keygen /localhost/daemons/nfd | ndnsec-install-cert -; \
'
### Configuring NFD's security
@@ -81,7 +69,7 @@ section:
{
authorize
{
certfile certs/localhost_daemons_nrd.ndncert
certfile certs/localhost_daemons_nfd.ndncert
privileges
{
faces
@@ -102,43 +90,36 @@ section:
}
While this configuration still allows management of faces and updating strategy choice by
anybody, only NFD's RIB Manager Daemon (`nrd`) is allowed to manage FIB.
anybody, only NFD's RIB Manager (i.e., NFD itself) is allowed to manage FIB.
As the final step to make this configuration work, nrd's self-signed certificate needs to
be exported into `localhost_daemons_nrd.ndncert` file:
As the final step to make this configuration work, nfd's self-signed certificate needs to
be exported into `localhost_daemons_nfd.ndncert` file:
sudo mkdir /usr/local/etc/ndn/certs
sudo sh -c 'sudo -u ndn -g ndn HOME=/usr/local/var/lib/ndn/nrd \
ndnsec-dump-certificate -i /localhost/daemons/nrd \
> /usr/local/etc/ndn/certs/localhost_daemons_nrd.ndncert'
sudo -s -- '\
mkdir -p /usr/local/etc/ndn/certs || true; \
export HOME=/usr/local/var/lib/ndn/nfd; \
ndnsec-dump-certificate -i /localhost/daemons/nfd > \
/usr/local/etc/ndn/certs/localhost_daemons_nfd.ndncert; \
'
Enable auto-start
-----------------
After copying the provided upstart scripts, `nfd` and `nrd` daemons will automatically run
after the reboot. To manually start them, use the following commands:
After copying the provided upstart script, `nfd` daemon will automatically run after the reboot.
To manually start them, use the following commands:
sudo start nfd
# nrd will be automatically started by upstart
Note that an additional upstart job, ``nfd-watcher``, will automatically monitor for
network connectivity changes, such as when network interface gets connected, disconnected,
or IP addresses of the network interface get updated. When ``nfd-watcher`` detects the
event, it will restart `nfd` and `nrd`.
Disable auto-start
------------------
To stop `nrd` and `nfd` daemon, use the following commands:
To stop `nfd` daemon, use the following commands:
sudo stop nfd
# nrd will be automatically stopped by upstart
Note that as long as upstart files are present in `/etc/init/`, the daemons will
automatically start after the reboot. To permanently stop `nfd` and `nrd` daemons, delete
Note that as long as upstart files are present in `/etc/init/`, the daemon will
automatically start after the reboot. To permanently stop `nfd` daemon, delete
the upstart files:
sudo rm /etc/init/nfd.conf
sudo rm /etc/init/nrd.conf
sudo rm /etc/init/nfd-watcher.conf
-13
View File
@@ -1,13 +0,0 @@
# nfd-watcher.conf
#
# Restarting NDN Forwarding Daemon on network connectivity changes
start on (net-device-up or
net-device-removed or
net-device-changed)
task
script
status nfd | grep -q start/ || stop
restart nfd
end script
+9
View File
@@ -14,4 +14,13 @@ env HOME=/usr/local/var/lib/ndn/nfd
export HOME
exec /usr/local/bin/nfd --config /usr/local/etc/ndn/nfd.conf 2>> /usr/local/var/log/ndn/nfd.log
post-start script
if [ -f /usr/local/etc/ndn/nfd-init.sh ]; then
sleep 2 # post-start is executed just after nfd process starts, but there is no guarantee
# that all initialization has been finished
. /usr/local/etc/ndn/nfd-init.sh
fi
end script
post-stop exec sleep 2
-22
View File
@@ -1,22 +0,0 @@
# nrd.conf
#
# NDN RIB Manager Daemon
description "NDN RIB Manager Daemon"
start on started nfd
stop on stopping nfd
respawn
respawn limit unlimited
setuid ndn
setgid ndn
pre-start exec sleep 2
script
export HOME=/usr/local/var/lib/ndn/nrd
/usr/local/bin/nrd --config /usr/local/etc/ndn/nfd.conf 2>> /usr/local/var/log/ndn/nrd.log
end script
post-stop exec sleep 2
+108 -21
View File
@@ -24,6 +24,7 @@
*/
#include "nfd.hpp"
#include "rib/nrd.hpp"
#include "version.hpp"
#include "core/global-io.hpp"
@@ -37,16 +38,33 @@
#include <boost/program_options/variables_map.hpp>
#include <boost/program_options/parsers.hpp>
// boost::thread is used instead of std::thread to guarantee proper cleanup of thread local storage,
// see http://www.boost.org/doc/libs/1_48_0/doc/html/thread/thread_local_storage.html
#include <boost/thread.hpp>
#include <atomic>
#include <condition_variable>
namespace nfd {
NFD_LOG_INIT("NFD");
/** \brief Executes NFD with RIB manager
*
* NFD (main forwarding procedure) and RIB manager execute in two different threads.
* Each thread has its own instances global io_service and global scheduler.
*
* When either of the daemons fails, execution of non-failed daemon will be terminated as
* well. In other words, when NFD fails, RIB manager will be terminated; when RIB manager
* fails, NFD will be terminated.
*/
class NfdRunner : noncopyable
{
public:
explicit
NfdRunner(const std::string& configFile)
: m_nfd(configFile, m_keyChain)
: m_nfd(configFile, m_nfdKeyChain)
, m_configFile(configFile)
, m_terminationSignalSet(getGlobalIoService())
, m_reloadSignalSet(getGlobalIoService())
{
@@ -85,6 +103,91 @@ public:
}
}
void
initialize()
{
m_nfd.initialize();
}
int
run()
{
/** \brief return value
* A non-zero value is assigned when either NFD or RIB manager (running in a separate
* thread) fails.
*/
std::atomic_int retval(0);
boost::asio::io_service* const mainIo = &getGlobalIoService();
boost::asio::io_service* nrdIo = nullptr;
// Mutex and conditional variable to implement synchronization between main and RIB manager
// threads:
// - to block main thread until RIB manager thread starts and initializes nrdIo (to allow
// stopping it later)
std::mutex m;
std::condition_variable cv;
std::string configFile = this->m_configFile; // c++11 lambda cannot capture member variables
boost::thread nrdThread([configFile, &retval, &nrdIo, mainIo, &cv, &m] {
{
std::lock_guard<std::mutex> lock(m);
nrdIo = &getGlobalIoService();
BOOST_ASSERT(nrdIo != mainIo);
}
cv.notify_all(); // notify that nrdIo has been assigned
try {
ndn::KeyChain nrdKeyChain;
// must be created inside a separate thread
rib::Nrd nrd(configFile, nrdKeyChain);
nrd.initialize();
getGlobalIoService().run(); // nrdIo is not thread-safe to use here
}
catch (const std::exception& e) {
NFD_LOG_FATAL(e.what());
retval = 6;
mainIo->stop();
}
{
std::lock_guard<std::mutex> lock(m);
nrdIo = nullptr;
}
});
{
// Wait to guarantee that nrdIo is properly initialized, so it can be used to terminate
// RIB manager thread.
std::unique_lock<std::mutex> lock(m);
cv.wait(lock, [&nrdIo] { return nrdIo != nullptr; });
}
try {
mainIo->run();
}
catch (const std::exception& e) {
NFD_LOG_FATAL(e.what());
retval = 4;
}
catch (const PrivilegeHelper::Error& e) {
NFD_LOG_FATAL(e.what());
retval = 5;
}
{
// nrdIo is guaranteed to be alive at this point
std::lock_guard<std::mutex> lock(m);
if (nrdIo != nullptr) {
nrdIo->stop();
nrdIo = nullptr;
}
}
nrdThread.join();
return retval;
}
void
terminate(const boost::system::error_code& error, int signalNo)
{
@@ -95,12 +198,6 @@ public:
getGlobalIoService().stop();
}
void
initialize()
{
m_nfd.initialize();
}
void
reload(const boost::system::error_code& error, int signalNo)
{
@@ -114,8 +211,10 @@ public:
}
private:
ndn::KeyChain m_keyChain;
ndn::KeyChain m_nfdKeyChain;
Nfd m_nfd;
std::string m_configFile;
boost::asio::signal_set m_terminationSignalSet;
boost::asio::signal_set m_reloadSignalSet;
};
@@ -192,17 +291,5 @@ main(int argc, char** argv)
return 3;
}
try {
getGlobalIoService().run();
}
catch (const std::exception& e) {
NFD_LOG_FATAL(e.what());
return 4;
}
catch (const PrivilegeHelper::Error& e) {
NFD_LOG_FATAL(e.what());
return 5;
}
return 0;
return runner.run();
}
-1
View File
@@ -32,7 +32,6 @@ log
;
; Run:
; nfd --modules
; nrd --modules
;
; Or look for NFD_LOG_INIT(<module name>) statements in .cpp files
;
-187
View File
@@ -1,187 +0,0 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2015, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
* Washington University in St. Louis,
* Beijing Institute of Technology,
* The University of Memphis.
*
* This file is part of NFD (Named Data Networking Forwarding Daemon).
* See AUTHORS.md for complete list of NFD authors and contributors.
*
* NFD is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
#include "nrd.hpp"
#include "version.hpp"
#include "core/logger.hpp"
#include "core/global-io.hpp"
#include <string.h>
#include <boost/filesystem.hpp>
#include <boost/program_options/options_description.hpp>
#include <boost/program_options/variables_map.hpp>
#include <boost/program_options/parsers.hpp>
namespace nfd {
namespace rib {
NFD_LOG_INIT("NRD");
class NrdRunner : noncopyable
{
public:
explicit
NrdRunner(const std::string& configFile)
: m_nrd(configFile, m_keyChain)
, m_terminationSignalSet(getGlobalIoService())
{
m_terminationSignalSet.add(SIGINT);
m_terminationSignalSet.add(SIGTERM);
m_terminationSignalSet.async_wait(bind(&NrdRunner::terminate, this, _1, _2));
}
static void
printUsage(std::ostream& os, const std::string& programName)
{
os << "Usage: \n"
<< " " << programName << " [options]\n"
<< "\n"
<< "Run NRD daemon\n"
<< "\n"
<< "Options:\n"
<< " [--help] - print this help message\n"
<< " [--version] - print version and exit\n"
<< " [--modules] - list available logging modules\n"
<< " [--config /path/to/nfd.conf] - path to configuration file "
<< "(default: " << DEFAULT_CONFIG_FILE << ")\n"
;
}
static void
printModules(std::ostream& os)
{
os << "Available logging modules: \n";
for (const auto& module : LoggerFactory::getInstance().getModules()) {
os << module << "\n";
}
}
void
run()
{
getGlobalIoService().run();
}
void
initialize()
{
m_nrd.initialize();
}
void
terminate(const boost::system::error_code& error, int signalNo)
{
if (error)
return;
NFD_LOG_INFO("Caught signal '" << ::strsignal(signalNo) << "', exiting...");
getGlobalIoService().stop();
}
private:
ndn::KeyChain m_keyChain;
Nrd m_nrd; // must be after m_io and m_keyChain
boost::asio::signal_set m_terminationSignalSet;
};
} // namespace nfd
} // namespace rib
int
main(int argc, char** argv)
{
using namespace nfd::rib;
namespace po = boost::program_options;
po::options_description description;
std::string configFile = DEFAULT_CONFIG_FILE;
description.add_options()
("help,h", "print this help message")
("version,V", "print version and exit")
("modules,m", "list available logging modules")
("config,c", po::value<std::string>(&configFile), "path to configuration file")
;
po::variables_map vm;
try {
po::store(po::command_line_parser(argc, argv).options(description).run(), vm);
po::notify(vm);
}
catch (const std::exception& e) {
std::cerr << "ERROR: " << e.what() << std::endl;
NrdRunner::printUsage(std::cerr, argv[0]);
return 1;
}
if (vm.count("help") > 0) {
NrdRunner::printUsage(std::cout, argv[0]);
return 0;
}
if (vm.count("version") > 0) {
std::cout << NFD_VERSION_BUILD_STRING << std::endl;
return 0;
}
if (vm.count("modules") > 0) {
NrdRunner::printModules(std::cout);
return 0;
}
NrdRunner runner(configFile);
try {
runner.initialize();
}
catch (const boost::filesystem::filesystem_error& e) {
if (e.code() == boost::system::errc::permission_denied) {
NFD_LOG_FATAL("Permissions denied for " << e.path1() << ". " <<
argv[0] << " should be run as superuser");
}
else {
NFD_LOG_FATAL(e.what());
}
return 1;
}
catch (const std::exception& e) {
NFD_LOG_FATAL(e.what());
return 2;
}
try {
runner.run();
}
catch (const std::exception& e) {
NFD_LOG_FATAL(e.what());
return 4;
}
return 0;
}
+10 -8
View File
@@ -6,7 +6,7 @@ case "$1" in
-h)
echo Usage
echo $0
echo " Start NFD and RIB Management daemon"
echo " Start NFD"
exit 0
;;
-V)
@@ -30,11 +30,10 @@ hasProcess() {
}
hasNFD=$(hasProcess nfd)
hasNRD=$(hasProcess nrd)
if [[ -n $hasNFD$hasNRD ]]
if [[ -n $hasNFD ]]
then
echo 'NFD or NRD is already running...'
echo 'NFD is already running...'
exit 1
fi
@@ -49,7 +48,10 @@ then
exit 2
fi
sudo nfd &
sleep 2
nrd &
sleep 2
sudo @BINDIR@/nfd &
if [ -f @SYSCONFDIR@/ndn/nfd-init.sh ]; then
sleep 2 # post-start is executed just after nfd process starts, but there is no guarantee
# that all initialization has been finished
. @SYSCONFDIR@/ndn/nfd-init.sh
fi
+1 -2
View File
@@ -6,7 +6,7 @@ case "$1" in
-h)
echo Usage
echo $0
echo " Stop NFD and RIB Management daemon"
echo " Stop NFD"
exit 0
;;
-V)
@@ -20,5 +20,4 @@ case "$1" in
;;
esac
sudo killall nrd
sudo killall nfd
+5
View File
@@ -0,0 +1,5 @@
#!@BASH@
echo "NDN RIB Management Daemon does not need to be started separately anymore"
sleep 10
exit 0
+4 -11
View File
@@ -208,25 +208,18 @@ def build(bld):
if bld.env['HAVE_WEBSOCKET']:
nfd_objects.source += bld.path.ant_glob('daemon/face/websocket-*.cpp')
bld(target='bin/nfd',
features='cxx cxxprogram',
source='daemon/main.cpp',
use='daemon-objects',
)
rib_objects = bld(
target='rib-objects',
name='rib-objects',
features='cxx',
source=bld.path.ant_glob(['rib/**/*.cpp'],
excl=['rib/main.cpp']),
source=bld.path.ant_glob(['rib/**/*.cpp']),
use='core-objects',
)
bld(target='bin/nrd',
bld(target='bin/nfd',
features='cxx cxxprogram',
source='rib/main.cpp',
use='rib-objects',
source='daemon/main.cpp',
use='daemon-objects rib-objects',
)
bld.recurse("tools")