Added autoconf build system. Removed waf-tools.
This commit is contained in:
1 parent
2931040ef2
commit
ff092f54ee
8 files changed
+64
-362
No files matched your search
+25
@@ -0,0 +1,25 @@
|
||||
## Helloworld C++: an example project using Automake
|
||||
|
||||
## Place generated object files (.o) into the same directory as their source
|
||||
## files, in order to avoid collisions when non-recursive make is used.
|
||||
AUTOMAKE_OPTIONS = subdir-objects
|
||||
|
||||
## Additional flags to pass to aclocal when it is invoked automatically at
|
||||
## make time. The ${ACLOCAL_FLAGS} variable is picked up from the environment
|
||||
## to provide a way for the user to supply additional arguments.
|
||||
ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS}
|
||||
|
||||
## Define an executable target "hello", which will be installed into the
|
||||
## directory named by the predefined variable $(bindir).
|
||||
bin_PROGRAMS = test1
|
||||
|
||||
## Define the list of source files for the "hello" target. The file extension
|
||||
## .cpp is recognized by Automake, and causes it to produce rules which invoke
|
||||
## the C++ compiler to produce an object file (.o) from each source file. The
|
||||
## header files (.h) do not result in object files by themselves, but will be
|
||||
## included in distribution archives of the project.
|
||||
test1_SOURCES = test/test1.cpp
|
||||
|
||||
## Define an independent executable script for inclusion in the distribution
|
||||
## archive. It will not be installed on an end user's system, however.
|
||||
dist_noinst_SCRIPTS = autogen.sh
|
||||
Executable
+6
@@ -0,0 +1,6 @@
|
||||
#!/bin/sh -e
|
||||
|
||||
test -n "$srcdir" || srcdir=`dirname "$0"`
|
||||
test -n "$srcdir" || srcdir=.
|
||||
autoreconf --force --install --verbose "$srcdir"
|
||||
test -n "$NOCONFIGURE" || "$srcdir/configure" "$@"
|
||||
@@ -0,0 +1,33 @@
|
||||
AC_INIT([ndn-cpp], [0.5], [],
|
||||
[ndn-cpp], [https://github.com/named-data/ndn-cpp])
|
||||
AC_PREREQ([2.59])
|
||||
AM_INIT_AUTOMAKE([1.10 -Wall no-define foreign])
|
||||
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_PROG_CXX
|
||||
AC_LANG([C++])
|
||||
|
||||
AC_MSG_CHECKING([for std::shared_ptr])
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
|
||||
[[#include <memory>]]
|
||||
[[std::shared_ptr<int> have_shared_ptr;]])
|
||||
], [
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE_UNQUOTED([HAVE_STD_SHARED_PTR], 1, [1 if have the `std::shared_ptr' class.])
|
||||
], [
|
||||
AC_MSG_RESULT([no])
|
||||
AC_DEFINE_UNQUOTED([HAVE_STD_SHARED_PTR], 0, [1 if have the `std::shared_ptr' class.])
|
||||
])
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
|
||||
[[#include <boost/shared_ptr.hpp>]]
|
||||
[[boost::shared_ptr<int> have_shared_ptr;]])
|
||||
], [
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE_UNQUOTED([HAVE_BOOST_SHARED_PTR], 1, [1 if have the `boost::shared_ptr' class.])
|
||||
], [
|
||||
AC_MSG_RESULT([no])
|
||||
AC_DEFINE_UNQUOTED([HAVE_BOOST_SHARED_PTR], 0, [1 if have the `boost::shared_ptr' class.])
|
||||
])
|
||||
|
||||
AC_CONFIG_FILES([Makefile])
|
||||
AC_OUTPUT
|
||||
@@ -1,9 +0,0 @@
|
||||
prefix=@PREFIX@
|
||||
libdir=@LIBDIR@
|
||||
includedir=@INCLUDEDIR@
|
||||
|
||||
Name: libccnx-cpp
|
||||
Description: C++ NDN API (currently a wrapper on top of CCNx C library)
|
||||
Version: @VERSION@
|
||||
Libs: -L${libdir} -lndn.cxx
|
||||
Cflags: -I${includedir}
|
||||
@@ -1,108 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
# Hans-Martin von Gaudecker, 2012
|
||||
|
||||
"""
|
||||
Create Sphinx documentation. Currently only LaTeX and HTML are supported.
|
||||
|
||||
The source file **must** be the conf.py file used by Sphinx. Everything
|
||||
else has defaults, passing in the parameters is optional.
|
||||
|
||||
Usage for getting both html and pdf docs:
|
||||
|
||||
ctx(features='sphinx', source='docs/conf.py')
|
||||
ctx(features='sphinx', source='docs/conf.py', buildername='latex')
|
||||
|
||||
Optional parameters and their defaults:
|
||||
|
||||
* buildername: html
|
||||
* srcdir: confdir (the directory where conf.py lives)
|
||||
* outdir: confdir/buildername (in the build directory tree)
|
||||
* doctreedir: outdir/.doctrees
|
||||
* type: pdflatex (only applies to 'latex' builder)
|
||||
|
||||
"""
|
||||
|
||||
|
||||
import os
|
||||
from waflib import Task, TaskGen, Errors, Logs
|
||||
|
||||
class RunSphinxBuild(Task.Task):
|
||||
def scan(self):
|
||||
"""Use Sphinx' internal environment to find the dependencies."""
|
||||
s = self.sphinx_instance
|
||||
msg, dummy, iterator = s.env.update(s.config, s.srcdir, s.doctreedir, s)
|
||||
s.info(msg)
|
||||
dep_nodes = []
|
||||
for docname in s.builder.status_iterator(iterator, "reading sources... "):
|
||||
filename = docname + s.config.source_suffix
|
||||
dep_nodes.append(self.srcdir.find_node(filename))
|
||||
for dep in s.env.dependencies.values():
|
||||
# Need the 'str' call because Sphinx might return Unicode strings.
|
||||
[dep_nodes.append(self.srcdir.find_node(str(d))) for d in dep]
|
||||
return (dep_nodes, [])
|
||||
|
||||
def run(self):
|
||||
"""Run the Sphinx build."""
|
||||
self.sphinx_instance.build(force_all=False, filenames=None)
|
||||
return None
|
||||
|
||||
def post_run(self):
|
||||
"""Add everything found in the output directory tree as an output.
|
||||
Not elegant, but pragmatic."""
|
||||
for n in self.outdir.ant_glob("**", quiet=True, remove=False):
|
||||
if n not in self.outputs: self.set_outputs(n)
|
||||
super(RunSphinxBuild, self).post_run()
|
||||
|
||||
|
||||
def _get_main_targets(tg, s):
|
||||
"""Return some easy targets known from the Sphinx build environment **s.env**."""
|
||||
out_dir = tg.bld.root.find_node(s.outdir)
|
||||
tgt_nodes = []
|
||||
if s.builder.name == "latex":
|
||||
for tgt_info in s.env.config.latex_documents:
|
||||
tgt_nodes.append(out_dir.find_or_declare(tgt_info[1]))
|
||||
elif s.builder.name == "html":
|
||||
suffix = getattr(s.env.config, "html_file_suffix", ".html")
|
||||
tgt_name = s.env.config.master_doc + suffix
|
||||
tgt_nodes.append(out_dir.find_or_declare(tgt_name))
|
||||
else:
|
||||
raise Errors.WafError("Sphinx builder not implemented: %s" % s.builder.name)
|
||||
return tgt_nodes
|
||||
|
||||
|
||||
@TaskGen.feature("sphinx")
|
||||
@TaskGen.before_method("process_source")
|
||||
def apply_sphinx(tg):
|
||||
"""Set up the task generator with a Sphinx instance and create a task."""
|
||||
|
||||
from sphinx.application import Sphinx
|
||||
|
||||
# Put together the configuration based on defaults and tg attributes.
|
||||
conf = tg.path.find_node(tg.source)
|
||||
confdir = conf.parent.abspath()
|
||||
buildername = getattr(tg, "buildername", "html")
|
||||
srcdir = getattr(tg, "srcdir", confdir)
|
||||
outdir = tg.path.find_or_declare (getattr(tg, "outdir", os.path.join(conf.parent.get_bld().abspath(), buildername))).abspath ()
|
||||
|
||||
doctreedir = getattr(tg, "doctreedir", os.path.join(outdir, ".doctrees"))
|
||||
|
||||
# Set up the Sphinx instance.
|
||||
s = Sphinx (srcdir, confdir, outdir, doctreedir, buildername, status=None)
|
||||
|
||||
# Get the main targets of the Sphinx build.
|
||||
tgt_nodes = _get_main_targets(tg, s)
|
||||
|
||||
# Create the task and set the required attributes.
|
||||
task = tg.create_task("RunSphinxBuild", src=conf, tgt=tgt_nodes)
|
||||
task.srcdir = tg.bld.root.find_node(s.srcdir)
|
||||
task.outdir = tg.bld.root.find_node(s.outdir)
|
||||
task.sphinx_instance = s
|
||||
|
||||
# Build pdf if we have the LaTeX builder, allow for building with xelatex.
|
||||
if s.builder.name == "latex":
|
||||
compile_type = getattr(tg, "type", "pdflatex")
|
||||
tg.bld(features="tex", type=compile_type, source=tgt_nodes, name="sphinx_pdf", prompt=0)
|
||||
|
||||
# Bypass the execution of process_source by setting the source to an empty list
|
||||
tg.source = []
|
||||
@@ -1,76 +0,0 @@
|
||||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
'''
|
||||
|
||||
When using this tool, the wscript will look like:
|
||||
|
||||
def options(opt):
|
||||
opt.tool_options('tinyxml', tooldir=["waf-tools"])
|
||||
|
||||
def configure(conf):
|
||||
conf.load('compiler_cxx tiny')
|
||||
|
||||
def build(bld):
|
||||
bld(source='main.cpp', target='app', use='TINYXML')
|
||||
|
||||
Options are generated, in order to specify the location of tinyxml includes/libraries.
|
||||
|
||||
|
||||
'''
|
||||
import sys
|
||||
import re
|
||||
from waflib import Utils,Logs,Errors
|
||||
from waflib.Configure import conf
|
||||
TINYXML_DIR=['/usr','/usr/local','/opt/local','/sw']
|
||||
TINYXML_VERSION_FILE='tinyxml.h'
|
||||
TINYXML_VERSION_CODE='''
|
||||
#include <iostream>
|
||||
#include <tinyxml.h>
|
||||
int main() { std::cout << TIXML_MAJOR_VERSION << "." << TIXML_MINOR_VERSION << "." << TIXML_PATCH_VERSION; }
|
||||
'''
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--tinyxml',type='string',default='',dest='tinyxml_dir',help='''path to where TinyXML is installed, e.g. /usr/local''')
|
||||
@conf
|
||||
def __tinyxml_get_version_file(self,dir):
|
||||
try:
|
||||
return self.root.find_dir(dir).find_node('%s/%s' % ('include', TINYXML_VERSION_FILE))
|
||||
except:
|
||||
return None
|
||||
@conf
|
||||
def tinyxml_get_version(self,dir):
|
||||
val=self.check_cxx(fragment=TINYXML_VERSION_CODE,includes=['%s/%s' % (dir, 'include')], execute=True, define_ret = True, mandatory=True)
|
||||
return val
|
||||
@conf
|
||||
def tinyxml_get_root(self,*k,**kw):
|
||||
root=k and k[0]or kw.get('path',None)
|
||||
# Logs.pprint ('RED', ' %s' %root)
|
||||
if root and self.__tinyxml_get_version_file(root):
|
||||
return root
|
||||
for dir in TINYXML_DIR:
|
||||
if self.__tinyxml_get_version_file(dir):
|
||||
return dir
|
||||
if root:
|
||||
self.fatal('TinyXML not found in %s'%root)
|
||||
else:
|
||||
self.fatal('TinyXML not found, please provide a --tinyxml argument (see help)')
|
||||
@conf
|
||||
def check_tinyxml(self,*k,**kw):
|
||||
if not self.env['CXX']:
|
||||
self.fatal('load a c++ compiler first, conf.load("compiler_cxx")')
|
||||
|
||||
var=kw.get('uselib_store','TINYXML')
|
||||
self.start_msg('Checking TinyXML')
|
||||
root = self.tinyxml_get_root(*k,**kw);
|
||||
self.env.TINYXML_VERSION=self.tinyxml_get_version(root)
|
||||
|
||||
self.env['INCLUDES_%s'%var]= '%s/%s' % (root, "include");
|
||||
self.env['LIB_%s'%var] = "tinyxml"
|
||||
self.env['LIBPATH_%s'%var] = '%s/%s' % (root, "lib")
|
||||
|
||||
self.end_msg(self.env.TINYXML_VERSION)
|
||||
if Logs.verbose:
|
||||
Logs.pprint('CYAN',' TinyXML include : %s'%self.env['INCLUDES_%s'%var])
|
||||
Logs.pprint('CYAN',' TinyXML lib : %s'%self.env['LIB_%s'%var])
|
||||
Logs.pprint('CYAN',' TinyXML libpath : %s'%self.env['LIBPATH_%s'%var])
|
||||
@@ -1,169 +0,0 @@
|
||||
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
VERSION='0.6.0'
|
||||
|
||||
from waflib import Build, Logs, Utils, Task, TaskGen, Configure
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--debug',action='store_true',default=False,dest='debug',help='''debugging mode''')
|
||||
opt.add_option('--test', action='store_true',default=False,dest='_test',help='''build unit tests''')
|
||||
opt.add_option('--log4cxx', action='store_true',default=False,dest='log4cxx',help='''Compile with log4cxx logging support''')
|
||||
|
||||
opt.load('compiler_c compiler_cxx boost ccnx doxygen gnu_dirs c_osx')
|
||||
opt.load('tinyxml', tooldir=['waf-tools'])
|
||||
|
||||
def configure(conf):
|
||||
conf.load("compiler_c compiler_cxx boost ccnx gnu_dirs tinyxml doxygen c_osx")
|
||||
|
||||
if conf.options.debug:
|
||||
conf.define ('_DEBUG', 1)
|
||||
conf.add_supported_cxxflags (cxxflags = ['-O0',
|
||||
'-Wall',
|
||||
'-Wno-unused-variable',
|
||||
'-g3',
|
||||
'-Wno-unused-private-field', # only clang supports
|
||||
'-fcolor-diagnostics', # only clang supports
|
||||
'-Qunused-arguments' # only clang supports
|
||||
])
|
||||
else:
|
||||
conf.add_supported_cxxflags (cxxflags = ['-O3', '-g'])
|
||||
|
||||
# if Utils.unversioned_sys_platform () == "darwin":
|
||||
# conf.check_cxx(framework_name='Foundation', uselib_store='OSX_FOUNDATION', mandatory=True, compile_filename='test.mm')
|
||||
# # conf.check_cxx(framework_name='AppKit', uselib_store='OSX_APPKIT', mandatory=True, compile_filename='test.mm')
|
||||
# conf.check_cxx(framework_name='Security', uselib_store='OSX_SECURITY', define_name='HAVE_SECURITY',
|
||||
# use="OSX_FOUNDATION", mandatory=True, compile_filename='test.mm')
|
||||
|
||||
conf.define ("NDN_CXX_VERSION", VERSION)
|
||||
|
||||
conf.check_cfg(package='libevent', args=['--cflags', '--libs'], uselib_store='LIBEVENT', mandatory=True)
|
||||
conf.check_cfg(package='libevent_pthreads', args=['--cflags', '--libs'], uselib_store='LIBEVENT_PTHREADS', mandatory=True)
|
||||
|
||||
if not conf.check_cfg(package='openssl', args=['--cflags', '--libs'], uselib_store='SSL', mandatory=False):
|
||||
libcrypto = conf.check_cc(lib='crypto',
|
||||
header_name='openssl/crypto.h',
|
||||
define_name='HAVE_SSL',
|
||||
uselib_store='SSL')
|
||||
else:
|
||||
conf.define ("HAVE_SSL", 1)
|
||||
if not conf.get_define ("HAVE_SSL"):
|
||||
conf.fatal ("Cannot find SSL libraries")
|
||||
|
||||
conf.check_cfg(package="libcrypto", args=['--cflags', '--libs'], uselib_store='CRYPTO', mandatory=True)
|
||||
|
||||
if conf.options.log4cxx:
|
||||
conf.check_cfg(package='liblog4cxx', args=['--cflags', '--libs'], uselib_store='LOG4CXX', mandatory=True)
|
||||
conf.define ("HAVE_LOG4CXX", 1)
|
||||
|
||||
conf.check_tinyxml(path=conf.options.tinyxml_dir)
|
||||
conf.check_doxygen(mandatory=False)
|
||||
|
||||
conf.check_boost(lib='system test iostreams filesystem thread date_time')
|
||||
|
||||
boost_version = conf.env.BOOST_VERSION.split('_')
|
||||
if int(boost_version[0]) < 1 or int(boost_version[1]) < 46:
|
||||
Logs.error ("Minumum required boost version is 1.46")
|
||||
return
|
||||
|
||||
conf.check_ccnx (path=conf.options.ccnx_dir)
|
||||
|
||||
if conf.options._test:
|
||||
conf.define ('_TESTS', 1)
|
||||
conf.env.TEST = 1
|
||||
|
||||
conf.write_config_header('config.h')
|
||||
|
||||
def build (bld):
|
||||
executor = bld.objects (
|
||||
target = "executor",
|
||||
features = ["cxx"],
|
||||
cxxflags = "-fPIC",
|
||||
source = bld.path.ant_glob(['executor/**/*.cc']),
|
||||
use = 'BOOST BOOST_THREAD LIBEVENT LIBEVENT_PTHREADS LOG4CXX',
|
||||
includes = ".",
|
||||
)
|
||||
|
||||
scheduler = bld.objects (
|
||||
target = "scheduler",
|
||||
features = ["cxx"],
|
||||
cxxflags = "-fPIC",
|
||||
source = bld.path.ant_glob(['scheduler/**/*.cc']),
|
||||
use = 'BOOST BOOST_THREAD LIBEVENT LIBEVENT_PTHREADS LOG4CXX executor',
|
||||
includes = ".",
|
||||
)
|
||||
|
||||
libndn_cxx = bld (
|
||||
target="ndn.cxx",
|
||||
features=['cxx', 'cxxshlib'],
|
||||
source = bld.path.ant_glob(['ndn.cxx/**/*.cpp', 'ndn.cxx/**/*.cc',
|
||||
'logging.cc',
|
||||
'libndn.cxx.pc.in']),
|
||||
use = 'CRYPTO TINYXML BOOST BOOST_THREAD SSL CCNX LOG4CXX scheduler executor',
|
||||
includes = ".",
|
||||
)
|
||||
|
||||
# if Utils.unversioned_sys_platform () == "darwin":
|
||||
# libndn_cxx.mac_app = True
|
||||
# libndn_cxx.source += bld.path.ant_glob (['platforms/osx/**/*.mm'])
|
||||
# libndn_cxx.use += " OSX_FOUNDATION OSX_SECURITY"
|
||||
|
||||
# Unit tests
|
||||
if bld.env['TEST']:
|
||||
unittests = bld.program (
|
||||
target="unit-tests",
|
||||
features = "cxx cxxprogram",
|
||||
defines = "WAF",
|
||||
source = bld.path.ant_glob(['test/*.cc']),
|
||||
use = 'BOOST_TEST BOOST_FILESYSTEM BOOST_DATE_TIME LOG4CXX ndn.cxx',
|
||||
includes = ".",
|
||||
install_prefix = None,
|
||||
)
|
||||
|
||||
headers = bld.path.ant_glob(['ndn.cxx.h', 'ndn.cxx/**/*.h'])
|
||||
bld.install_files("%s" % bld.env['INCLUDEDIR'], headers, relative_trick=True)
|
||||
|
||||
@Configure.conf
|
||||
def add_supported_cxxflags(self, cxxflags):
|
||||
"""
|
||||
Check which cxxflags are supported by compiler and add them to env.CXXFLAGS variable
|
||||
"""
|
||||
self.start_msg('Checking allowed flags for c++ compiler')
|
||||
|
||||
supportedFlags = []
|
||||
for flag in cxxflags:
|
||||
if self.check_cxx (cxxflags=[flag], mandatory=False):
|
||||
supportedFlags += [flag]
|
||||
|
||||
self.end_msg (' '.join (supportedFlags))
|
||||
self.env.CXXFLAGS += supportedFlags
|
||||
|
||||
|
||||
# doxygen docs
|
||||
from waflib.Build import BuildContext
|
||||
class doxy (BuildContext):
|
||||
cmd = "doxygen"
|
||||
fun = "doxygen"
|
||||
|
||||
def doxygen (bld):
|
||||
if not bld.env.DOXYGEN:
|
||||
bld.fatal ("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
|
||||
bld (features="doxygen",
|
||||
doxyfile='doc/doxygen.conf')
|
||||
|
||||
# doxygen docs
|
||||
from waflib.Build import BuildContext
|
||||
class sphinx (BuildContext):
|
||||
cmd = "sphinx"
|
||||
fun = "sphinx"
|
||||
|
||||
def sphinx (bld):
|
||||
bld.load('sphinx_build', tooldir=['waf-tools'])
|
||||
|
||||
bld (features="sphinx",
|
||||
outdir = "doc/html",
|
||||
source = "doc/source/conf.py")
|
||||
|
||||
|
||||
@TaskGen.extension('.mm')
|
||||
def mm_hook(self, node):
|
||||
"""Alias .mm files to be compiled the same as .cc files, gcc will do the right thing."""
|
||||
return self.create_compiled_task('cxx', node)
|
||||
Reference in new issue
Block a user