2
0
mirror of https://gitlab.com/ita1024/waf.git synced 2024-11-22 09:57:15 +01:00
This commit is contained in:
Thomas Nagy 2016-06-25 21:30:32 +02:00
parent fc02c1d42a
commit 4991120891
No known key found for this signature in database
GPG Key ID: 67A565EDFDF90E64
18 changed files with 92 additions and 84 deletions

View File

@ -35,7 +35,6 @@ Support for pure asm programs and libraries should also work::
"""
from waflib import Task
import waflib.Task
from waflib.Tools.ccroot import link_task, stlink_task
from waflib.TaskGen import extension

View File

@ -10,30 +10,30 @@ from waflib.Tools.ccroot import link_task, stlink_task
@TaskGen.extension('.c')
def c_hook(self, node):
"Bind the c file extension to the creation of a :py:class:`waflib.Tools.c.c` instance"
"Binds the c file extensions create :py:class:`waflib.Tools.c.c` instances"
if not self.env.CC and self.env.CXX:
return self.create_compiled_task('cxx', node)
return self.create_compiled_task('c', node)
class c(Task.Task):
"Compile C files into object files"
"Compiles C files into object files"
run_str = '${CC} ${ARCH_ST:ARCH} ${CFLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CC_SRC_F}${SRC} ${CC_TGT_F}${TGT[0].abspath()} ${CPPFLAGS}'
vars = ['CCDEPS'] # unused variable to depend on, just in case
ext_in = ['.h'] # set the build order easily by using ext_out=['.h']
scan = c_preproc.scan
class cprogram(link_task):
"Link object files into a c program"
"Links object files into c programs"
run_str = '${LINK_CC} ${LINKFLAGS} ${CCLNK_SRC_F}${SRC} ${CCLNK_TGT_F}${TGT[0].abspath()} ${RPATH_ST:RPATH} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${FRAMEWORK_ST:FRAMEWORK} ${ARCH_ST:ARCH} ${STLIB_MARKER} ${STLIBPATH_ST:STLIBPATH} ${STLIB_ST:STLIB} ${SHLIB_MARKER} ${LIBPATH_ST:LIBPATH} ${LIB_ST:LIB} ${LDFLAGS}'
ext_out = ['.bin']
vars = ['LINKDEPS']
inst_to = '${BINDIR}'
class cshlib(cprogram):
"Link object files into a c shared library"
"Links object files into c shared libraries"
inst_to = '${LIBDIR}'
class cstlib(stlink_task):
"Link object files into a c static library"
"Links object files into a c static libraries"
pass # do not remove

View File

@ -7,7 +7,7 @@ MacOSX related tools
"""
import os, shutil, platform
from waflib import Task, Utils, Errors
from waflib import Task, Utils
from waflib.TaskGen import taskgen_method, feature, after_method, before_method
app_info = '''
@ -46,7 +46,7 @@ def set_macosx_deployment_target(self):
@taskgen_method
def create_bundle_dirs(self, name, out):
"""
Create bundle folders, used by :py:func:`create_task_macplist` and :py:func:`create_task_macapp`
Creates bundle folders, used by :py:func:`create_task_macplist` and :py:func:`create_task_macapp`
"""
dir = out.parent.find_or_declare(name)
dir.mkdir()
@ -112,7 +112,7 @@ def create_task_macapp(self):
@after_method('apply_link')
def create_task_macplist(self):
"""
Create a :py:class:`waflib.Tools.c_osx.macplist` instance.
Creates a :py:class:`waflib.Tools.c_osx.macplist` instance.
"""
if self.env['MACAPP'] or getattr(self, 'mac_app', False):
out = self.link_task.outputs[0]
@ -169,7 +169,7 @@ app_dirs = ['Contents', 'Contents/MacOS', 'Contents/Resources']
class macapp(Task.Task):
"""
Create mac applications
Creates mac applications
"""
color = 'PINK'
def run(self):
@ -178,7 +178,7 @@ class macapp(Task.Task):
class macplist(Task.Task):
"""
Create plist files
Creates plist files
"""
color = 'PINK'
ext_in = ['.bin']
@ -190,3 +190,4 @@ class macplist(Task.Task):
context = getattr(self, 'context', {})
txt = txt.format(**context)
self.outputs[0].write(txt)

View File

@ -12,7 +12,7 @@ from waflib.Configure import conf
@conf
def find_clang(conf):
"""
Find the program clang and execute it to ensure it really is clang
Finds the program clang and executes it to ensure it really is clang
"""
cc = conf.find_program('clang', var='CC')
conf.get_cc_version(cc, clang=True)

View File

@ -12,7 +12,7 @@ from waflib.Configure import conf
@conf
def find_clangxx(conf):
"""
Find the program clang++, and execute it to ensure it really is clang++
Finds the program clang++, and executes it to ensure it really is clang++
"""
cxx = conf.find_program('clang++', var='CXX')
conf.get_cc_version(cxx, clang=True)

View File

@ -50,7 +50,7 @@ c_compiler = {
'default':['clang', 'gcc'],
}
"""
Dict mapping the platform names to Waf tools finding specific C compilers::
Dict mapping platform names to Waf tools finding specific C compilers::
from waflib.Tools.compiler_c import c_compiler
c_compiler['linux'] = ['gcc', 'icc', 'suncc']
@ -63,10 +63,14 @@ def default_compilers():
def configure(conf):
"""
Try to find a suitable C compiler or raise a :py:class:`waflib.Errors.ConfigurationError`.
Detects a suitable C compiler
:raises: :py:class:`waflib.Errors.ConfigurationError` when no suitable compiler is found
"""
try: test_for_compiler = conf.options.check_c_compiler or default_compilers()
except AttributeError: conf.fatal("Add options(opt): opt.load('compiler_c')")
try:
test_for_compiler = conf.options.check_c_compiler or default_compilers()
except AttributeError:
conf.fatal("Add options(opt): opt.load('compiler_c')")
for compiler in re.split('[ ,]+', test_for_compiler):
conf.env.stash()
@ -78,9 +82,9 @@ def configure(conf):
conf.end_msg(False)
debug('compiler_c: %r', e)
else:
if conf.env['CC']:
if conf.env.CC:
conf.end_msg(conf.env.get_flat('CC'))
conf.env['COMPILER_CC'] = compiler
conf.env.COMPILER_CC = compiler
conf.env.commit()
break
conf.env.revert()
@ -90,7 +94,7 @@ def configure(conf):
def options(opt):
"""
Restrict the compiler detection from the command-line::
This is how to provide compiler preferences on the command-line::
$ waf configure --check-c-compiler=gcc
"""

View File

@ -64,10 +64,14 @@ def default_compilers():
def configure(conf):
"""
Try to find a suitable C++ compiler or raise a :py:class:`waflib.Errors.ConfigurationError`.
Detects a suitable C++ compiler
:raises: :py:class:`waflib.Errors.ConfigurationError` when no suitable compiler is found
"""
try: test_for_compiler = conf.options.check_cxx_compiler or default_compilers()
except AttributeError: conf.fatal("Add options(opt): opt.load('compiler_cxx')")
try:
test_for_compiler = conf.options.check_cxx_compiler or default_compilers()
except AttributeError:
conf.fatal("Add options(opt): opt.load('compiler_cxx')")
for compiler in re.split('[ ,]+', test_for_compiler):
conf.env.stash()
@ -79,9 +83,9 @@ def configure(conf):
conf.end_msg(False)
debug('compiler_cxx: %r', e)
else:
if conf.env['CXX']:
if conf.envCXX:
conf.end_msg(conf.env.get_flat('CXX'))
conf.env['COMPILER_CXX'] = compiler
conf.env.COMPILER_CXX = compiler
conf.env.commit()
break
conf.env.revert()
@ -91,7 +95,7 @@ def configure(conf):
def options(opt):
"""
Restrict the compiler detection from the command-line::
This is how to provide compiler preferences on the command-line::
$ waf configure --check-cxx-compiler=gxx
"""

View File

@ -40,10 +40,14 @@ def default_compilers():
def configure(conf):
"""
Try to find a suitable D compiler or raise a :py:class:`waflib.Errors.ConfigurationError`.
Detects a suitable D compiler
:raises: :py:class:`waflib.Errors.ConfigurationError` when no suitable compiler is found
"""
try: test_for_compiler = conf.options.check_d_compiler or default_compilers()
except AttributeError: conf.fatal("Add options(opt): opt.load('compiler_d')")
try:
test_for_compiler = conf.options.check_d_compiler or default_compilers()
except AttributeError:
conf.fatal("Add options(opt): opt.load('compiler_d')")
for compiler in re.split('[ ,]+', test_for_compiler):
conf.env.stash()
@ -57,7 +61,7 @@ def configure(conf):
else:
if conf.env.D:
conf.end_msg(conf.env.get_flat('D'))
conf.env['COMPILER_D'] = compiler
conf.env.COMPILER_D = compiler
conf.env.commit()
break
conf.env.revert()
@ -67,7 +71,7 @@ def configure(conf):
def options(opt):
"""
Restrict the compiler detection from the command-line::
This is how to provide compiler preferences on the command-line::
$ waf configure --check-d-compiler=dmd
"""

View File

@ -27,10 +27,14 @@ def default_compilers():
def configure(conf):
"""
Try to find a suitable Fortran compiler or raise a :py:class:`waflib.Errors.ConfigurationError`.
Detects a suitable Fortran compiler
:raises: :py:class:`waflib.Errors.ConfigurationError` when no suitable compiler is found
"""
try: test_for_compiler = conf.options.check_fortran_compiler or default_compilers()
except AttributeError: conf.fatal("Add options(opt): opt.load('compiler_fc')")
try:
test_for_compiler = conf.options.check_fortran_compiler or default_compilers()
except AttributeError:
conf.fatal("Add options(opt): opt.load('compiler_fc')")
for compiler in re.split('[ ,]+', test_for_compiler):
conf.env.stash()
conf.start_msg('Checking for %r (Fortran compiler)' % compiler)
@ -41,7 +45,7 @@ def configure(conf):
conf.end_msg(False)
Logs.debug('compiler_fortran: %r', e)
else:
if conf.env['FC']:
if conf.env.FC:
conf.end_msg(conf.env.get_flat('FC'))
conf.env.COMPILER_FORTRAN = compiler
conf.env.commit()
@ -53,7 +57,7 @@ def configure(conf):
def options(opt):
"""
Restrict the compiler detection from the command-line::
This is how to provide compiler preferences on the command-line::
$ waf configure --check-fortran-compiler=ifort
"""

View File

@ -25,7 +25,6 @@ from waflib import Utils, Task, Options, Errors
from waflib.TaskGen import before_method, after_method, feature
from waflib.Tools import ccroot
from waflib.Configure import conf
import os, tempfile
ccroot.USELIB_VARS['cs'] = set(['CSFLAGS', 'ASSEMBLIES', 'RESOURCES'])
ccroot.lib_patterns['csshlib'] = ['%s']

View File

@ -10,31 +10,31 @@ from waflib.Tools.ccroot import link_task, stlink_task
@TaskGen.extension('.cpp','.cc','.cxx','.C','.c++')
def cxx_hook(self, node):
"Bind the c++ file extensions to the creation of a :py:class:`waflib.Tools.cxx.cxx` instance"
"Binds c++ file extensions to create :py:class:`waflib.Tools.cxx.cxx` instances"
return self.create_compiled_task('cxx', node)
if not '.c' in TaskGen.task_gen.mappings:
TaskGen.task_gen.mappings['.c'] = TaskGen.task_gen.mappings['.cpp']
class cxx(Task.Task):
"Compile C++ files into object files"
"Compiles C++ files into object files"
run_str = '${CXX} ${ARCH_ST:ARCH} ${CXXFLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXX_SRC_F}${SRC} ${CXX_TGT_F}${TGT[0].abspath()} ${CPPFLAGS}'
vars = ['CXXDEPS'] # unused variable to depend on, just in case
ext_in = ['.h'] # set the build order easily by using ext_out=['.h']
scan = c_preproc.scan
class cxxprogram(link_task):
"Link object files into a c++ program"
"Links object files into c++ programs"
run_str = '${LINK_CXX} ${LINKFLAGS} ${CXXLNK_SRC_F}${SRC} ${CXXLNK_TGT_F}${TGT[0].abspath()} ${RPATH_ST:RPATH} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${FRAMEWORK_ST:FRAMEWORK} ${ARCH_ST:ARCH} ${STLIB_MARKER} ${STLIBPATH_ST:STLIBPATH} ${STLIB_ST:STLIB} ${SHLIB_MARKER} ${LIBPATH_ST:LIBPATH} ${LIB_ST:LIB} ${LDFLAGS}'
vars = ['LINKDEPS']
ext_out = ['.bin']
inst_to = '${BINDIR}'
class cxxshlib(cxxprogram):
"Link object files into a c++ shared library"
"Links object files into c++ shared libraries"
inst_to = '${LIBDIR}'
class cxxstlib(stlink_task):
"Link object files into a c++ static library"
"Links object files into c++ static libraries"
pass # do not remove

View File

@ -7,7 +7,7 @@ Provide a scanner for finding dependencies on d files
"""
import re
from waflib import Utils, Logs
from waflib import Utils
def filter_comments(filename):
"""

View File

@ -24,7 +24,7 @@ meths_typos = ['__call__', 'program', 'shlib', 'stlib', 'objects']
import sys
from waflib import Logs, Build, Node, Task, TaskGen, ConfigSet, Errors, Utils
import waflib.Tools.ccroot
from waflib.Tools import ccroot
def check_same_targets(self):
mp = Utils.defaultdict(list)

View File

@ -7,7 +7,7 @@
fortran support
"""
from waflib import Utils, Task, Logs
from waflib import Utils, Task
from waflib.Tools import ccroot, fc_config, fc_scan
from waflib.TaskGen import extension
from waflib.Configure import conf
@ -19,13 +19,13 @@ ccroot.USELIB_VARS['fcstlib'] = set(['ARFLAGS', 'LINKDEPS'])
@extension('.f', '.f90', '.F', '.F90', '.for', '.FOR')
def fc_hook(self, node):
"Bind the typical Fortran file extensions to the creation of a :py:class:`waflib.Tools.fc.fc` instance"
"Binds the Fortran file extensions create :py:class:`waflib.Tools.fc.fc` instances"
return self.create_compiled_task('fc', node)
@conf
def modfile(conf, name):
"""
Turn a module name into the right module file name.
Turns a module name into the right module file name.
Defaults to all lower case.
"""
return {'lower' :name.lower() + '.mod',
@ -35,8 +35,10 @@ def modfile(conf, name):
def get_fortran_tasks(tsk):
"""
Obtain all other fortran tasks from the same build group. Those tasks must not have
Obtains all fortran tasks from the same build group. Those tasks must not have
the attribute 'nomod' or 'mod_fortran_done'
:return: a list of :py:class:`waflib.Tools.fc.fc` instances
"""
bld = tsk.generator.bld
tasks = bld.get_tasks_group(bld.get_group_idx(tsk.generator))
@ -44,17 +46,16 @@ def get_fortran_tasks(tsk):
class fc(Task.Task):
"""
The fortran tasks can only run when all fortran tasks in the current group are ready to be executed
This may cause a deadlock if another fortran task is waiting for something that cannot happen (circular dependency)
in this case, set the 'nomod=True' on those tasks instances to break the loop
Fortran tasks can only run when all fortran tasks in the current group are ready to be executed
This may cause a deadlock if some fortran task is waiting for something that cannot happen (circular dependency)
Should this ever happen, set the 'nomod=True' on those tasks instances to break the loop
"""
color = 'GREEN'
run_str = '${FC} ${FCFLAGS} ${FCINCPATH_ST:INCPATHS} ${FCDEFINES_ST:DEFINES} ${_FCMODOUTFLAGS} ${FC_TGT_F}${TGT[0].abspath()} ${FC_SRC_F}${SRC[0].abspath()} ${FCPPFLAGS}'
vars = ["FORTRANMODPATHFLAG"]
def scan(self):
"""scanner for fortran dependencies"""
"""Scanner for fortran dependencies"""
tmp = fc_scan.fortran_parser(self.generator.includes_nodes)
tmp.task = self
tmp.start(self.inputs[0])
@ -62,7 +63,7 @@ class fc(Task.Task):
def runnable_status(self):
"""
Set the mod file outputs and the dependencies on the mod files over all the fortran tasks
Sets the mod file outputs and the dependencies on the mod files over all Fortran tasks
executed by the main thread so there are no concurrency issues
"""
if getattr(self, 'mod_fortran_done', None):
@ -140,17 +141,21 @@ class fc(Task.Task):
return super(fc, self).runnable_status()
class fcprogram(ccroot.link_task):
"""Link fortran programs"""
"""Links fortran programs"""
color = 'YELLOW'
run_str = '${FC} ${LINKFLAGS} ${FCLNK_SRC_F}${SRC} ${FCLNK_TGT_F}${TGT[0].abspath()} ${RPATH_ST:RPATH} ${FCSTLIB_MARKER} ${FCSTLIBPATH_ST:STLIBPATH} ${FCSTLIB_ST:STLIB} ${FCSHLIB_MARKER} ${FCLIBPATH_ST:LIBPATH} ${FCLIB_ST:LIB} ${LDFLAGS}'
inst_to = '${BINDIR}'
class fcshlib(fcprogram):
"""Link fortran libraries"""
"""Links fortran libraries"""
inst_to = '${LIBDIR}'
class fcstlib(ccroot.stlink_task):
"""Links fortran static libraries (uses ar by default)"""
pass # do not remove the pass statement
class fcprogram_test(fcprogram):
"""Custom link task to obtain the compiler outputs for fortran configuration tests"""
"""Custom link task to obtain compiler outputs for Fortran configuration tests"""
def runnable_status(self):
"""This task is always executed"""
@ -160,7 +165,7 @@ class fcprogram_test(fcprogram):
return ret
def exec_command(self, cmd, **kw):
"""Store the compiler std our/err onto the build context, to bld.out + bld.err"""
"""Stores the compiler std our/err onto the build context, to bld.out + bld.err"""
bld = self.generator.bld
kw['shell'] = isinstance(cmd, str)
@ -181,7 +186,3 @@ class fcprogram_test(fcprogram):
if bld.err:
bld.to_log("err: %s\n" % bld.err)
class fcstlib(ccroot.stlink_task):
"""Link fortran static libraries (uses ar by default)"""
pass # do not remove the pass statement

View File

@ -15,13 +15,12 @@ re_mod = re.compile(MOD_REGEX, re.I)
class fortran_parser(object):
"""
This parser will return:
This parser returns:
* the nodes corresponding to the module names that will be produced
* the nodes corresponding to the module names to produce
* the nodes corresponding to the include files used
* the module names used by the fortran file
* the module names used by the fortran files
"""
def __init__(self, incpaths):
self.seen = []
"""Files already parsed"""
@ -37,7 +36,7 @@ class fortran_parser(object):
def find_deps(self, node):
"""
Parse a fortran file to read the dependencies used and provided
Parses a Fortran file to obtain the dependencies used/provided
:param node: fortran file to read
:type node: :py:class:`waflib.Node.Node`
@ -63,7 +62,7 @@ class fortran_parser(object):
def start(self, node):
"""
Start the parsing. Use the stack self.waiting to hold the nodes to iterate on
Start parsing. Use the stack ``self.waiting`` to hold nodes to iterate on
:param node: fortran file
:type node: :py:class:`waflib.Node.Node`
@ -75,8 +74,8 @@ class fortran_parser(object):
def iter(self, node):
"""
Process a single file in the search for dependencies, extract the files used
the modules used, and the modules provided.
Processes a single file during dependency parsing. Extracts files used
modules used and modules provided.
"""
incs, uses, mods = self.find_deps(node)
for x in incs:
@ -97,7 +96,7 @@ class fortran_parser(object):
def tryfind_header(self, filename):
"""
Try to find an include and add it the nodes to process
Adds an include file to the list of nodes to process
:param filename: file name
:type filename: string
@ -113,4 +112,3 @@ class fortran_parser(object):
if not filename in self.names:
self.names.append(filename)

View File

@ -3,10 +3,11 @@
# DC 2008
# Thomas Nagy 2016 (ita)
import re
from waflib import Utils
from waflib.Tools import fc, fc_config, fc_scan, ar
import os, re
from waflib import Utils, Logs, Errors
from waflib.Tools import fc, fc_config, fc_scan, ar, ccroot
from waflib.Configure import conf
from waflib.TaskGen import after_method, feature
@conf
def find_ifort(conf):
@ -94,13 +95,6 @@ def configure(conf):
conf.fc_add_flags()
conf.ifort_modifier_platform()
import os, re
from waflib import Task, Logs, Errors
from waflib.TaskGen import after_method, feature
from waflib.Configure import conf
from waflib.Tools import ccroot, ar
all_ifort_platforms = [ ('intel64', 'amd64'), ('em64t', 'amd64'), ('ia32', 'x86'), ('Itanium', 'ia64')]
"""List of icl platforms"""

View File

@ -53,7 +53,7 @@ Setting PYTHONUNBUFFERED gives the unbuffered output.
"""
import os, sys, re
from waflib import Utils, Task, Logs, Options, Errors
from waflib import Utils, Logs, Options, Errors
from waflib.TaskGen import after_method, feature
from waflib.Configure import conf

View File

@ -5,7 +5,7 @@
"Process *.rc* files for C/C++: X{.rc -> [.res|.rc.o]}"
import re
from waflib import Task, Logs, Utils
from waflib import Task
from waflib.TaskGen import extension
from waflib.Tools import c_preproc