- added svn export
- prepared tool for eol conversion
diff --git a/devtools/wscript b/devtools/wscript
new file mode 100644
index 0000000..61b5183
--- /dev/null
+++ b/devtools/wscript
@@ -0,0 +1,225 @@
+VERSION='0.1.0'
+APPNAME='CppUnit2'
+srcdir = '.'
+blddir = 'build'
+
+import Options
+import Logs
+import UnitTest
+import Utils
+import os.path
+import sys
+import glob
+
+CPPUT_EXAMPLES = '''
+ checking_assertions
+ ignore_failure_demo
+ input_test
+ light_fixture
+ log_demo
+ parametrized_test
+ stringize_demo
+ test_function
+ '''.split()
+
+BROKEN_CPPUT_EXAMPLES = '''
+ input_based_test
+ opentest_demo
+ table_fixture
+ '''.split()
+
+def _get_example_dirs():
+ return [ os.path.join( 'examples', d )
+ for d in CPPUT_EXAMPLES ]
+
+def _get_main_script_dir():
+ """Gets the path of the directory containing this script."""
+ # The main script path is only valid once the it has been executed, hence this can not be a global var.
+ assert Utils.g_module is not None
+ return os.path.split( Utils.g_module.root_path )[0]
+
+def _fix_import_path():
+ """Adds the main script directory to be able to import waftools modules."""
+ import_dir = _get_main_script_dir()
+ if import_dir not in sys.path:
+ sys.path.append( import_dir )
+
+def _get_tool_dir():
+ return os.path.join( main_script_dir, 'waftools' )
+
+def set_options(opt):
+ """Always called first during the build."""
+ _fix_import_path()
+ import waftools.log_output
+ waftools.log_output.set_options( opt )
+
+ # Adds command-line options for compiler
+ opt.tool_options('compiler_cxx')
+
+ # from compiler_cxx tools, set_options
+ import Tools.ccroot as ccroot
+ opt.add_option('-d', '--debug-level',
+ action = 'store',
+ default = ccroot.DEBUG_LEVELS.RELEASE,
+ help = "Specify the debug level, does nothing if CXXFLAGS is set in the environment. [Allowed Values: '%s'] " % "', '".join(ccroot.DEBUG_LEVELS.ALL) +
+ "[default: %default]",
+ choices = ccroot.DEBUG_LEVELS.ALL,
+ dest = 'debug_level')
+
+def init():
+ """Called set_options() once the command-line has been parsed.
+ Command-line options value are accessed through Options.options.
+ """
+ import waftools.log_output
+ waftools.log_output.init()
+
+
+def configure(conf):
+ # There is a link issue with msvc 9!
+ conf.env['MSVC_VERSIONS'] = ['msvc 8.0']
+
+ # CXX=g++-3.0 ./waf.py configure will use g++-3.0 instead of 'g++'
+ conf.check_tool('compiler_cxx')
+
+ # Select debug/optimize flags
+ debug_level = Options.options.debug_level.upper()
+ conf.env.append_unique('CXXFLAGS', conf.env['CXXFLAGS_' + debug_level])
+
+ compiler = conf.env['COMPILER_CXX']
+ if compiler == 'msvc': # Microsoft Visual Studio specifics
+ # Select run-time library variant
+ if 'DEBUG' in debug_level:
+ crt_variant = 'MULTITHREADED_DLL_DBG'
+ else:
+ crt_variant = 'MULTITHREADED_DLL'
+ # MULTITHREADED, MULTITHREADED_DLL, MULTITHREADED_DBG, MULTITHREADED_DLL_DBG
+ conf.env.append_unique('CPPFLAGS', conf.env['CPPFLAGS_CRT_' + crt_variant])
+ conf.env.append_unique('CPPDEFINES', conf.env['CPPDEFINES_CRT_' + crt_variant])
+
+ ## batched builds can be enabled by including the module optim_cc
+ # conf.check_tool('batched_cc')
+
+
+# WAF command:
+
+def build(bld):
+ # process subfolders from here
+ bld.add_subdirs('''src/cpptl
+ src/cpput
+ src/cpputtest''')
+
+ bld.add_subdirs( _get_example_dirs() )
+
+def gen_examples_wscript(ctx):
+ for example_dir in _get_example_dirs():
+ wscript_path = os.path.join( example_dir, 'wscript_build' )
+ sources = glob.glob( os.path.join( example_dir, '*.cpp' ) )
+ Logs.info( 'Generating "%s"' % wscript_path )
+ open( wscript_path, 'wb' ).write( """\
+#! /usr/bin/env python
+# encoding: utf-8
+# Baptiste Lepilleur, 2009
+
+bld.new_task_gen(
+ features = 'cxx cprogram',
+ source = '''%(sources)s''',
+ includes = '../.. ../../include', # for examples/common
+ uselib_local = 'cpptl cpput',
+ name = 'example_%(name)s',
+ target = 'example_%(name)s' )
+""" % {
+ 'sources': ' '.join( [os.path.basename(s) for s in sources] ),
+ 'name': os.path.basename( example_dir )
+ } )
+
+def _fix_python_source( path, is_dry_run = True, verbose = True ):
+ """Makes sure that all sources have unix EOL and replace tabs with 4 spaces."""
+ from waftools import reindent
+ if not os.path.isfile( path ):
+ raise ValueError( 'Path "%s" is not a file' % path )
+ try:
+ f = open(path, 'rb')
+ except IOError, msg:
+ print >> sys.stderr, "%s: I/O Error: %s" % (file, str(msg))
+ return False
+
+ if verbose:
+ print '%s =>' % path,
+ try:
+ r = reindent.Reindenter(f)
+ finally:
+ f.close()
+ if r.run(): # File need to be fixed ?
+ if not is_dry_run:
+ f = open(path, "wb")
+ try:
+ r.write(f)
+ finally:
+ f.close()
+ if verbose:
+ print is_dry_run and ' NEED FIX' or ' FIXED'
+ elif verbose:
+ print ' OK'
+ return True
+
+def _fix_source_eol( path, is_dry_run = True, verbose = True, eol = '\n' ):
+ """Makes sure that all sources have the specified eol sequence (default: unix)."""
+ if not os.path.isfile( path ):
+ raise ValueError( 'Path "%s" is not a file' % path )
+ try:
+ f = open(path, 'rb')
+ except IOError, msg:
+ print >> sys.stderr, "%s: I/O Error: %s" % (file, str(msg))
+ return False
+ try:
+ raw_lines = f.readlines()
+ finally:
+ f.close()
+ fixed_lines = [line.rstrip('\r\n') + eol for line in raw_lines]
+ if raw_lines != fixed_lines:
+ print '%s =>' % path,
+ if not is_dry_run:
+ f = open(path, "wb")
+ try:
+ f.writelines(fixed_lines)
+ finally:
+ f.close()
+ if verbose:
+ print is_dry_run and ' NEED FIX' or ' FIXED'
+ return True
+
+
+
+def _do_fix( is_dry_run = True ):
+ from waftools import antglob
+ python_sources = antglob.glob( '.',
+ includes = '**/*.py **/wscript **/wscript_build',
+ excludes = antglob.default_excludes + './waf.py',
+ prune_dirs = antglob.prune_dirs + 'waf-* ./build' )
+ for path in python_sources:
+ _fix_python_source( path, is_dry_run )
+
+ cpp_sources = antglob.glob( '.',
+ includes = '**/*.cpp **/*.h **/*.inl',
+ prune_dirs = antglob.prune_dirs + 'waf-* ./build' )
+ for path in cpp_sources:
+ _fix_source_eol( path, is_dry_run )
+
+
+def dry_fix(context):
+ _do_fix( is_dry_run = True )
+
+def fix(context):
+ _do_fix( is_dry_run = False )
+
+def shutdown():
+ pass
+
+def check(context):
+ # Unit tests are run when "check" target is used
+ ut = UnitTest.unit_test()
+ ut.change_to_testfile_dir = True
+ ut.want_to_see_test_output = True
+ ut.want_to_see_test_error = True
+ ut.run()
+ ut.print_results()