mirror of https://github.com/lukechilds/node.git
Ryan Dahl
15 years ago
23 changed files with 0 additions and 4204 deletions
@ -1,342 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# |
|
||||
# partially based on boost.py written by Gernot Vormayr |
|
||||
# written by Ruediger Sonderfeld <ruediger@c-plusplus.de>, 2008 |
|
||||
# modified by Bjoern Michaelsen, 2008 |
|
||||
# modified by Luca Fossati, 2008 |
|
||||
# rewritten for waf 1.5.1, Thomas Nagy, 2008 |
|
||||
# |
|
||||
#def set_options(opt): |
|
||||
# opt.tool_options('boost') |
|
||||
# # ... |
|
||||
# |
|
||||
#def configure(conf): |
|
||||
# # ... (e.g. conf.check_tool('g++')) |
|
||||
# conf.check_tool('boost') |
|
||||
# conf.check_boost(lib='signals filesystem', static='onlystatic', score_version=(-1000, 1000), tag_minscore=1000) |
|
||||
# |
|
||||
#def build(bld): |
|
||||
# bld(source='main.c', target='bar', uselib="BOOST BOOST_SYSTEM") |
|
||||
# |
|
||||
#ISSUES: |
|
||||
# * find_includes should be called only once! |
|
||||
# * support mandatory |
|
||||
|
|
||||
######## boost update ########### |
|
||||
## ITA: * the method get_boost_version_number does work |
|
||||
## * the rest of the code has not really been tried |
|
||||
# * make certain a demo is provided (in demos/adv for example) |
|
||||
|
|
||||
# TODO: bad and underdocumented code -> boost.py will be removed in waf 1.6 to be rewritten later |
|
||||
|
|
||||
import os.path, glob, types, re, sys |
|
||||
import Configure, config_c, Options, Utils, Logs |
|
||||
from Logs import warn |
|
||||
from Configure import conf |
|
||||
|
|
||||
boost_code = ''' |
|
||||
#include <iostream> |
|
||||
#include <boost/version.hpp> |
|
||||
int main() { std::cout << BOOST_VERSION << std::endl; } |
|
||||
''' |
|
||||
|
|
||||
boost_libpath = ['/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib'] |
|
||||
boost_cpppath = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include'] |
|
||||
|
|
||||
STATIC_NOSTATIC = 'nostatic' |
|
||||
STATIC_BOTH = 'both' |
|
||||
STATIC_ONLYSTATIC = 'onlystatic' |
|
||||
|
|
||||
is_versiontag = re.compile('^\d+_\d+_?\d*$') |
|
||||
is_threadingtag = re.compile('^mt$') |
|
||||
is_abitag = re.compile('^[sgydpn]+$') |
|
||||
is_toolsettag = re.compile('^(acc|borland|como|cw|dmc|darwin|gcc|hp_cxx|intel|kylix|vc|mgw|qcc|sun|vacpp)\d*$') |
|
||||
is_pythontag=re.compile('^py[0-9]{2}$') |
|
||||
|
|
||||
def set_options(opt): |
|
||||
opt.add_option('--boost-includes', type='string', default='', dest='boostincludes', help='path to the boost directory where the includes are e.g. /usr/local/include/boost-1_35') |
|
||||
opt.add_option('--boost-libs', type='string', default='', dest='boostlibs', help='path to the directory where the boost libs are e.g. /usr/local/lib') |
|
||||
|
|
||||
def string_to_version(s): |
|
||||
version = s.split('.') |
|
||||
if len(version) < 3: return 0 |
|
||||
return int(version[0])*100000 + int(version[1])*100 + int(version[2]) |
|
||||
|
|
||||
def version_string(version): |
|
||||
major = version / 100000 |
|
||||
minor = version / 100 % 1000 |
|
||||
minor_minor = version % 100 |
|
||||
if minor_minor == 0: |
|
||||
return "%d_%d" % (major, minor) |
|
||||
else: |
|
||||
return "%d_%d_%d" % (major, minor, minor_minor) |
|
||||
|
|
||||
def libfiles(lib, pattern, lib_paths): |
|
||||
result = [] |
|
||||
for lib_path in lib_paths: |
|
||||
libname = pattern % ('boost_%s[!_]*' % lib) |
|
||||
result += glob.glob(os.path.join(lib_path, libname)) |
|
||||
return result |
|
||||
|
|
||||
@conf |
|
||||
def get_boost_version_number(self, dir): |
|
||||
"""silently retrieve the boost version number""" |
|
||||
try: |
|
||||
return self.run_c_code(compiler='cxx', code=boost_code, includes=dir, execute=1, env=self.env.copy(), type='cprogram', compile_mode='cxx', compile_filename='test.cpp') |
|
||||
except Configure.ConfigurationError, e: |
|
||||
return -1 |
|
||||
|
|
||||
def set_default(kw, var, val): |
|
||||
if not var in kw: |
|
||||
kw[var] = val |
|
||||
|
|
||||
def tags_score(tags, kw): |
|
||||
""" |
|
||||
checks library tags |
|
||||
|
|
||||
see http://www.boost.org/doc/libs/1_35_0/more/getting_started/unix-variants.html 6.1 |
|
||||
""" |
|
||||
score = 0 |
|
||||
needed_tags = { |
|
||||
'threading': kw['tag_threading'], |
|
||||
'abi': kw['tag_abi'], |
|
||||
'toolset': kw['tag_toolset'], |
|
||||
'version': kw['tag_version'], |
|
||||
'python': kw['tag_python'] |
|
||||
} |
|
||||
|
|
||||
if kw['tag_toolset'] is None: |
|
||||
v = kw['env'] |
|
||||
toolset = v['CXX_NAME'] |
|
||||
if v['CXX_VERSION']: |
|
||||
version_no = v['CXX_VERSION'].split('.') |
|
||||
toolset += version_no[0] |
|
||||
if len(version_no) > 1: |
|
||||
toolset += version_no[1] |
|
||||
needed_tags['toolset'] = toolset |
|
||||
|
|
||||
found_tags = {} |
|
||||
for tag in tags: |
|
||||
if is_versiontag.match(tag): found_tags['version'] = tag |
|
||||
if is_threadingtag.match(tag): found_tags['threading'] = tag |
|
||||
if is_abitag.match(tag): found_tags['abi'] = tag |
|
||||
if is_toolsettag.match(tag): found_tags['toolset'] = tag |
|
||||
if is_pythontag.match(tag): found_tags['python'] = tag |
|
||||
|
|
||||
for tagname in needed_tags.iterkeys(): |
|
||||
if needed_tags[tagname] is not None and tagname in found_tags: |
|
||||
if re.compile(needed_tags[tagname]).match(found_tags[tagname]): |
|
||||
score += kw['score_' + tagname][0] |
|
||||
else: |
|
||||
score += kw['score_' + tagname][1] |
|
||||
return score |
|
||||
|
|
||||
@conf |
|
||||
def validate_boost(self, kw): |
|
||||
ver = kw.get('version', '') |
|
||||
|
|
||||
for x in 'min_version max_version version'.split(): |
|
||||
set_default(kw, x, ver) |
|
||||
|
|
||||
set_default(kw, 'lib', '') |
|
||||
kw['lib'] = Utils.to_list(kw['lib']) |
|
||||
|
|
||||
set_default(kw, 'env', self.env) |
|
||||
|
|
||||
set_default(kw, 'libpath', boost_libpath) |
|
||||
set_default(kw, 'cpppath', boost_cpppath) |
|
||||
|
|
||||
for x in 'tag_threading tag_version tag_toolset'.split(): |
|
||||
set_default(kw, x, None) |
|
||||
set_default(kw, 'tag_abi', '^[^d]*$') |
|
||||
|
|
||||
set_default(kw, 'python', str(sys.version_info[0]) + str(sys.version_info[1]) ) |
|
||||
set_default(kw, 'tag_python', '^py' + kw['python'] + '$') |
|
||||
|
|
||||
set_default(kw, 'score_threading', (10, -10)) |
|
||||
set_default(kw, 'score_abi', (10, -10)) |
|
||||
set_default(kw, 'score_python', (10,-10)) |
|
||||
set_default(kw, 'score_toolset', (1, -1)) |
|
||||
set_default(kw, 'score_version', (100, -100)) |
|
||||
|
|
||||
set_default(kw, 'score_min', 0) |
|
||||
set_default(kw, 'static', STATIC_NOSTATIC) |
|
||||
set_default(kw, 'found_includes', False) |
|
||||
set_default(kw, 'min_score', 0) |
|
||||
|
|
||||
set_default(kw, 'errmsg', 'not found') |
|
||||
set_default(kw, 'okmsg', 'ok') |
|
||||
|
|
||||
@conf |
|
||||
def find_boost_includes(self, kw): |
|
||||
""" |
|
||||
check every path in kw['cpppath'] for subdir |
|
||||
that either starts with boost- or is named boost. |
|
||||
|
|
||||
Then the version is checked and selected accordingly to |
|
||||
min_version/max_version. The highest possible version number is |
|
||||
selected! |
|
||||
|
|
||||
If no versiontag is set the versiontag is set accordingly to the |
|
||||
selected library and CPPPATH_BOOST is set. |
|
||||
""" |
|
||||
boostPath = getattr(Options.options, 'boostincludes', '') |
|
||||
if boostPath: |
|
||||
boostPath = [os.path.normpath(os.path.expandvars(os.path.expanduser(boostPath)))] |
|
||||
else: |
|
||||
boostPath = Utils.to_list(kw['cpppath']) |
|
||||
|
|
||||
min_version = string_to_version(kw.get('min_version', '')) |
|
||||
max_version = string_to_version(kw.get('max_version', '')) or (sys.maxint - 1) |
|
||||
|
|
||||
version = 0 |
|
||||
for include_path in boostPath: |
|
||||
boost_paths = glob.glob(os.path.join(include_path, 'boost*')) |
|
||||
for path in boost_paths: |
|
||||
pathname = os.path.split(path)[-1] |
|
||||
ret = -1 |
|
||||
if pathname == 'boost': |
|
||||
path = include_path |
|
||||
ret = self.get_boost_version_number(path) |
|
||||
elif pathname.startswith('boost-'): |
|
||||
ret = self.get_boost_version_number(path) |
|
||||
ret = int(ret) |
|
||||
|
|
||||
if ret != -1 and ret >= min_version and ret <= max_version and ret > version: |
|
||||
boost_path = path |
|
||||
version = ret |
|
||||
if not version: |
|
||||
self.fatal('boost headers not found! (required version min: %s max: %s)' |
|
||||
% (kw['min_version'], kw['max_version'])) |
|
||||
return False |
|
||||
|
|
||||
found_version = version_string(version) |
|
||||
versiontag = '^' + found_version + '$' |
|
||||
if kw['tag_version'] is None: |
|
||||
kw['tag_version'] = versiontag |
|
||||
elif kw['tag_version'] != versiontag: |
|
||||
warn('boost header version %r and tag_version %r do not match!' % (versiontag, kw['tag_version'])) |
|
||||
env = self.env |
|
||||
env['CPPPATH_BOOST'] = boost_path |
|
||||
env['BOOST_VERSION'] = found_version |
|
||||
self.found_includes = 1 |
|
||||
ret = 'Version %s (%s)' % (found_version, boost_path) |
|
||||
return ret |
|
||||
|
|
||||
@conf |
|
||||
def find_boost_library(self, lib, kw): |
|
||||
|
|
||||
def find_library_from_list(lib, files): |
|
||||
lib_pattern = re.compile('.*boost_(.*?)\..*') |
|
||||
result = (None, None) |
|
||||
resultscore = kw['min_score'] - 1 |
|
||||
for file in files: |
|
||||
m = lib_pattern.search(file, 1) |
|
||||
if m: |
|
||||
libname = m.group(1) |
|
||||
libtags = libname.split('-')[1:] |
|
||||
currentscore = tags_score(libtags, kw) |
|
||||
if currentscore > resultscore: |
|
||||
result = (libname, file) |
|
||||
resultscore = currentscore |
|
||||
return result |
|
||||
|
|
||||
lib_paths = getattr(Options.options, 'boostlibs', '') |
|
||||
if lib_paths: |
|
||||
lib_paths = [os.path.normpath(os.path.expandvars(os.path.expanduser(lib_paths)))] |
|
||||
else: |
|
||||
lib_paths = Utils.to_list(kw['libpath']) |
|
||||
|
|
||||
v = kw.get('env', self.env) |
|
||||
|
|
||||
(libname, file) = (None, None) |
|
||||
if kw['static'] in [STATIC_NOSTATIC, STATIC_BOTH]: |
|
||||
st_env_prefix = 'LIB' |
|
||||
files = libfiles(lib, v['shlib_PATTERN'], lib_paths) |
|
||||
(libname, file) = find_library_from_list(lib, files) |
|
||||
if libname is None and kw['static'] in [STATIC_ONLYSTATIC, STATIC_BOTH]: |
|
||||
st_env_prefix = 'STATICLIB' |
|
||||
staticLibPattern = v['staticlib_PATTERN'] |
|
||||
if self.env['CC_NAME'] == 'msvc': |
|
||||
staticLibPattern = 'lib' + staticLibPattern |
|
||||
files = libfiles(lib, staticLibPattern, lib_paths) |
|
||||
(libname, file) = find_library_from_list(lib, files) |
|
||||
if libname is not None: |
|
||||
v['LIBPATH_BOOST_' + lib.upper()] = [os.path.split(file)[0]] |
|
||||
if self.env['CC_NAME'] == 'msvc' and os.path.splitext(file)[1] == '.lib': |
|
||||
v[st_env_prefix + '_BOOST_' + lib.upper()] = ['libboost_'+libname] |
|
||||
else: |
|
||||
v[st_env_prefix + '_BOOST_' + lib.upper()] = ['boost_'+libname] |
|
||||
return |
|
||||
self.fatal('lib boost_' + lib + ' not found!') |
|
||||
|
|
||||
@conf |
|
||||
def check_boost(self, *k, **kw): |
|
||||
""" |
|
||||
This should be the main entry point |
|
||||
|
|
||||
- min_version |
|
||||
- max_version |
|
||||
- version |
|
||||
- include_path |
|
||||
- lib_path |
|
||||
- lib |
|
||||
- toolsettag - None or a regexp |
|
||||
- threadingtag - None or a regexp |
|
||||
- abitag - None or a regexp |
|
||||
- versiontag - WARNING: you should rather use version or min_version/max_version |
|
||||
- static - look for static libs (values: |
|
||||
'nostatic' or STATIC_NOSTATIC - ignore static libs (default) |
|
||||
'both' or STATIC_BOTH - find static libs, too |
|
||||
'onlystatic' or STATIC_ONLYSTATIC - find only static libs |
|
||||
- score_version |
|
||||
- score_abi |
|
||||
- scores_threading |
|
||||
- score_toolset |
|
||||
* the scores are tuples (match_score, nomatch_score) |
|
||||
match_score is the added to the score if the tag is matched |
|
||||
nomatch_score is added when a tag is found and does not match |
|
||||
- min_score |
|
||||
""" |
|
||||
|
|
||||
if not self.env['CXX']: |
|
||||
self.fatal('load a c++ compiler tool first, for example conf.check_tool("g++")') |
|
||||
self.validate_boost(kw) |
|
||||
ret = None |
|
||||
try: |
|
||||
if not kw.get('found_includes', None): |
|
||||
self.check_message_1(kw.get('msg_includes', 'boost headers')) |
|
||||
ret = self.find_boost_includes(kw) |
|
||||
|
|
||||
except Configure.ConfigurationError, e: |
|
||||
if 'errmsg' in kw: |
|
||||
self.check_message_2(kw['errmsg'], 'YELLOW') |
|
||||
if 'mandatory' in kw: |
|
||||
if Logs.verbose > 1: |
|
||||
raise |
|
||||
else: |
|
||||
self.fatal('the configuration failed (see %r)' % self.log.name) |
|
||||
else: |
|
||||
if 'okmsg' in kw: |
|
||||
self.check_message_2(kw.get('okmsg_includes', ret)) |
|
||||
|
|
||||
for lib in kw['lib']: |
|
||||
self.check_message_1('library boost_'+lib) |
|
||||
try: |
|
||||
self.find_boost_library(lib, kw) |
|
||||
except Configure.ConfigurationError, e: |
|
||||
ret = False |
|
||||
if 'errmsg' in kw: |
|
||||
self.check_message_2(kw['errmsg'], 'YELLOW') |
|
||||
if 'mandatory' in kw: |
|
||||
if Logs.verbose > 1: |
|
||||
raise |
|
||||
else: |
|
||||
self.fatal('the configuration failed (see %r)' % self.log.name) |
|
||||
else: |
|
||||
if 'okmsg' in kw: |
|
||||
self.check_message_2(kw['okmsg']) |
|
||||
|
|
||||
return ret |
|
||||
|
|
@ -1,27 +0,0 @@ |
|||||
#!/usr/bin/python |
|
||||
# encoding: utf-8 |
|
||||
# Grygoriy Fuchedzhy 2009 |
|
||||
|
|
||||
""" |
|
||||
Compile fluid files (fltk graphic library). Use the 'fluid' feature in conjuction with the 'cxx' feature. |
|
||||
""" |
|
||||
|
|
||||
import Task |
|
||||
from TaskGen import extension |
|
||||
|
|
||||
Task.simple_task_type('fluid', '${FLUID} -c -o ${TGT[0].abspath(env)} -h ${TGT[1].abspath(env)} ${SRC}', 'BLUE', shell=False, ext_out='.cxx') |
|
||||
|
|
||||
@extension('.fl') |
|
||||
def fluid(self, node): |
|
||||
"""add the .fl to the source list; the cxx file generated will be compiled when possible""" |
|
||||
cpp = node.change_ext('.cpp') |
|
||||
hpp = node.change_ext('.hpp') |
|
||||
self.create_task('fluid', node, [cpp, hpp]) |
|
||||
|
|
||||
if 'cxx' in self.features: |
|
||||
self.allnodes.append(cpp) |
|
||||
|
|
||||
def detect(conf): |
|
||||
fluid = conf.find_program('fluid', var='FLUID', mandatory=True) |
|
||||
conf.check_cfg(path='fltk-config', package='', args='--cxxflags --ldflags', uselib_store='FLTK', mandatory=True) |
|
||||
|
|
@ -1,128 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# Thomas Nagy, 2008-2010 (ita) |
|
||||
|
|
||||
""" |
|
||||
Execute the tasks with gcc -MD, read the dependencies from the .d file |
|
||||
and prepare the dependency calculation for the next run |
|
||||
""" |
|
||||
|
|
||||
import os, re, threading |
|
||||
import Task, Logs, Utils, preproc |
|
||||
from TaskGen import before, after, feature |
|
||||
|
|
||||
lock = threading.Lock() |
|
||||
|
|
||||
preprocessor_flag = '-MD' |
|
||||
|
|
||||
@feature('cc') |
|
||||
@before('apply_core') |
|
||||
def add_mmd_cc(self): |
|
||||
if self.env.get_flat('CCFLAGS').find(preprocessor_flag) < 0: |
|
||||
self.env.append_value('CCFLAGS', preprocessor_flag) |
|
||||
|
|
||||
@feature('cxx') |
|
||||
@before('apply_core') |
|
||||
def add_mmd_cxx(self): |
|
||||
if self.env.get_flat('CXXFLAGS').find(preprocessor_flag) < 0: |
|
||||
self.env.append_value('CXXFLAGS', preprocessor_flag) |
|
||||
|
|
||||
def scan(self): |
|
||||
"the scanner does not do anything initially" |
|
||||
nodes = self.generator.bld.node_deps.get(self.unique_id(), []) |
|
||||
names = [] |
|
||||
return (nodes, names) |
|
||||
|
|
||||
re_o = re.compile("\.o$") |
|
||||
re_src = re.compile("^(\.\.)[\\/](.*)$") |
|
||||
|
|
||||
def post_run(self): |
|
||||
# The following code is executed by threads, it is not safe, so a lock is needed... |
|
||||
|
|
||||
if getattr(self, 'cached', None): |
|
||||
return Task.Task.post_run(self) |
|
||||
|
|
||||
name = self.outputs[0].abspath(self.env) |
|
||||
name = re_o.sub('.d', name) |
|
||||
txt = Utils.readf(name) |
|
||||
#os.unlink(name) |
|
||||
|
|
||||
txt = txt.replace('\\\n', '') |
|
||||
|
|
||||
lst = txt.strip().split(':') |
|
||||
val = ":".join(lst[1:]) |
|
||||
val = val.split() |
|
||||
|
|
||||
nodes = [] |
|
||||
bld = self.generator.bld |
|
||||
|
|
||||
f = re.compile("^("+self.env.variant()+"|\.\.)[\\/](.*)$") |
|
||||
for x in val: |
|
||||
if os.path.isabs(x): |
|
||||
|
|
||||
if not preproc.go_absolute: |
|
||||
continue |
|
||||
|
|
||||
lock.acquire() |
|
||||
try: |
|
||||
node = bld.root.find_resource(x) |
|
||||
finally: |
|
||||
lock.release() |
|
||||
else: |
|
||||
g = re.search(re_src, x) |
|
||||
if g: |
|
||||
x = g.group(2) |
|
||||
lock.acquire() |
|
||||
try: |
|
||||
node = bld.bldnode.parent.find_resource(x) |
|
||||
finally: |
|
||||
lock.release() |
|
||||
else: |
|
||||
g = re.search(f, x) |
|
||||
if g: |
|
||||
x = g.group(2) |
|
||||
lock.acquire() |
|
||||
try: |
|
||||
node = bld.srcnode.find_resource(x) |
|
||||
finally: |
|
||||
lock.release() |
|
||||
|
|
||||
if id(node) == id(self.inputs[0]): |
|
||||
# ignore the source file, it is already in the dependencies |
|
||||
# this way, successful config tests may be retrieved from the cache |
|
||||
continue |
|
||||
|
|
||||
if not node: |
|
||||
raise ValueError('could not find %r for %r' % (x, self)) |
|
||||
else: |
|
||||
nodes.append(node) |
|
||||
|
|
||||
Logs.debug('deps: real scanner for %s returned %s' % (str(self), str(nodes))) |
|
||||
|
|
||||
bld.node_deps[self.unique_id()] = nodes |
|
||||
bld.raw_deps[self.unique_id()] = [] |
|
||||
|
|
||||
try: |
|
||||
del self.cache_sig |
|
||||
except: |
|
||||
pass |
|
||||
|
|
||||
Task.Task.post_run(self) |
|
||||
|
|
||||
import Constants, Utils |
|
||||
def sig_implicit_deps(self): |
|
||||
try: |
|
||||
return Task.Task.sig_implicit_deps(self) |
|
||||
except Utils.WafError: |
|
||||
return Constants.SIG_NIL |
|
||||
|
|
||||
for name in 'cc cxx'.split(): |
|
||||
try: |
|
||||
cls = Task.TaskBase.classes[name] |
|
||||
except KeyError: |
|
||||
pass |
|
||||
else: |
|
||||
cls.post_run = post_run |
|
||||
cls.scan = scan |
|
||||
cls.sig_implicit_deps = sig_implicit_deps |
|
||||
|
|
@ -1,97 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# go.py - Waf tool for the Go programming language |
|
||||
# By: Tom Wambold <tom5760@gmail.com> |
|
||||
|
|
||||
import platform |
|
||||
|
|
||||
import Task |
|
||||
import Utils |
|
||||
from TaskGen import feature, extension, after |
|
||||
|
|
||||
Task.simple_task_type('gocompile', '${GOC} ${GOCFLAGS} -o ${TGT} ${SRC}', shell=False) |
|
||||
Task.simple_task_type('gopack', '${GOP} grc ${TGT} ${SRC}', shell=False) |
|
||||
Task.simple_task_type('golink', '${GOL} ${GOLFLAGS} -o ${TGT} ${SRC}', shell=False) |
|
||||
|
|
||||
def detect(conf): |
|
||||
|
|
||||
def set_def(var, val): |
|
||||
if not conf.env[var]: |
|
||||
conf.env[var] = val |
|
||||
|
|
||||
set_def('GO_PLATFORM', platform.machine()) |
|
||||
|
|
||||
if conf.env.GO_PLATFORM == 'x86_64': |
|
||||
set_def('GO_COMPILER', '6g') |
|
||||
set_def('GO_LINKER', '6l') |
|
||||
set_def('GO_EXTENSION', '.6') |
|
||||
elif conf.env.GO_PLATFORM == 'i386': |
|
||||
set_def('GO_COMPILER', '8g') |
|
||||
set_def('GO_LINKER', '8l') |
|
||||
set_def('GO_EXTENSION', '.8') |
|
||||
|
|
||||
if not (conf.env.GO_COMPILER or conf.env.GO_LINKER or conf.env.GO_EXTENSION): |
|
||||
raise conf.fatal('Unsupported platform ' + platform.machine()) |
|
||||
|
|
||||
set_def('GO_PACK', 'gopack') |
|
||||
set_def('GO_PACK_EXTENSION', '.a') |
|
||||
|
|
||||
conf.find_program(conf.env.GO_COMPILER, var='GOC', mandatory=True) |
|
||||
conf.find_program(conf.env.GO_LINKER, var='GOL', mandatory=True) |
|
||||
conf.find_program(conf.env.GO_PACK, var='GOP', mandatory=True) |
|
||||
|
|
||||
@extension('.go') |
|
||||
def compile_go(self, node): |
|
||||
try: |
|
||||
self.go_nodes.append(node) |
|
||||
except AttributeError: |
|
||||
self.go_nodes = [node] |
|
||||
|
|
||||
@feature('go') |
|
||||
@after('apply_core') |
|
||||
def apply_compile_go(self): |
|
||||
try: |
|
||||
nodes = self.go_nodes |
|
||||
except AttributeError: |
|
||||
self.go_compile_task = None |
|
||||
else: |
|
||||
self.go_compile_task = self.create_task('gocompile', |
|
||||
nodes, |
|
||||
[self.path.find_or_declare(self.target + self.env.GO_EXTENSION)]) |
|
||||
|
|
||||
@feature('gopackage', 'goprogram') |
|
||||
@after('apply_compile_go') |
|
||||
def apply_goinc(self): |
|
||||
if not getattr(self, 'go_compile_task', None): |
|
||||
return |
|
||||
|
|
||||
names = self.to_list(getattr(self, 'uselib_local', [])) |
|
||||
for name in names: |
|
||||
obj = self.name_to_obj(name) |
|
||||
if not obj: |
|
||||
raise Utils.WafError('object %r was not found in uselib_local ' |
|
||||
'(required by %r)' % (lib_name, self.name)) |
|
||||
obj.post() |
|
||||
self.go_compile_task.set_run_after(obj.go_package_task) |
|
||||
self.go_compile_task.deps_nodes.extend(obj.go_package_task.outputs) |
|
||||
self.env.append_unique('GOCFLAGS', '-I' + obj.path.abspath(obj.env)) |
|
||||
self.env.append_unique('GOLFLAGS', '-L' + obj.path.abspath(obj.env)) |
|
||||
|
|
||||
@feature('gopackage') |
|
||||
@after('apply_goinc') |
|
||||
def apply_gopackage(self): |
|
||||
self.go_package_task = self.create_task('gopack', |
|
||||
self.go_compile_task.outputs[0], |
|
||||
self.path.find_or_declare(self.target + self.env.GO_PACK_EXTENSION)) |
|
||||
self.go_package_task.set_run_after(self.go_compile_task) |
|
||||
self.go_package_task.deps_nodes.extend(self.go_compile_task.outputs) |
|
||||
|
|
||||
@feature('goprogram') |
|
||||
@after('apply_goinc') |
|
||||
def apply_golink(self): |
|
||||
self.go_link_task = self.create_task('golink', |
|
||||
self.go_compile_task.outputs[0], |
|
||||
self.path.find_or_declare(self.target)) |
|
||||
self.go_link_task.set_run_after(self.go_compile_task) |
|
||||
self.go_link_task.deps_nodes.extend(self.go_compile_task.outputs) |
|
||||
|
|
@ -1,199 +0,0 @@ |
|||||
#! /usr/bin/env python |
|
||||
# encoding: UTF-8 |
|
||||
# Petar Forai |
|
||||
# Thomas Nagy 2008 |
|
||||
|
|
||||
import re |
|
||||
import Task, Utils, Logs |
|
||||
from TaskGen import extension, taskgen, feature, after |
|
||||
from Configure import conf |
|
||||
import preproc |
|
||||
|
|
||||
""" |
|
||||
Welcome in the hell of adding tasks dynamically |
|
||||
|
|
||||
swig interface files may be created at runtime, the module name may be unknown in advance |
|
||||
|
|
||||
rev 5859 is much more simple |
|
||||
""" |
|
||||
|
|
||||
SWIG_EXTS = ['.swig', '.i'] |
|
||||
|
|
||||
swig_str = '${SWIG} ${SWIGFLAGS} ${SRC}' |
|
||||
cls = Task.simple_task_type('swig', swig_str, color='BLUE', ext_in='.i .h', ext_out='.o .c .cxx', shell=False) |
|
||||
|
|
||||
def runnable_status(self): |
|
||||
for t in self.run_after: |
|
||||
if not t.hasrun: |
|
||||
return ASK_LATER |
|
||||
|
|
||||
if not getattr(self, 'init_outputs', None): |
|
||||
self.init_outputs = True |
|
||||
if not getattr(self, 'module', None): |
|
||||
# search the module name |
|
||||
txt = self.inputs[0].read(self.env) |
|
||||
m = re_module.search(txt) |
|
||||
if not m: |
|
||||
raise ValueError("could not find the swig module name") |
|
||||
self.module = m.group(1) |
|
||||
|
|
||||
swig_c(self) |
|
||||
|
|
||||
# add the language-specific output files as nodes |
|
||||
# call funs in the dict swig_langs |
|
||||
for x in self.env['SWIGFLAGS']: |
|
||||
# obtain the language |
|
||||
x = x[1:] |
|
||||
try: |
|
||||
fun = swig_langs[x] |
|
||||
except KeyError: |
|
||||
pass |
|
||||
else: |
|
||||
fun(self) |
|
||||
|
|
||||
return Task.Task.runnable_status(self) |
|
||||
setattr(cls, 'runnable_status', runnable_status) |
|
||||
|
|
||||
re_module = re.compile('%module(?:\s*\(.*\))?\s+(.+)', re.M) |
|
||||
|
|
||||
re_1 = re.compile(r'^%module.*?\s+([\w]+)\s*?$', re.M) |
|
||||
re_2 = re.compile('%include "(.*)"', re.M) |
|
||||
re_3 = re.compile('#include "(.*)"', re.M) |
|
||||
|
|
||||
def scan(self): |
|
||||
"scan for swig dependencies, climb the .i files" |
|
||||
env = self.env |
|
||||
|
|
||||
lst_src = [] |
|
||||
|
|
||||
seen = [] |
|
||||
to_see = [self.inputs[0]] |
|
||||
|
|
||||
while to_see: |
|
||||
node = to_see.pop(0) |
|
||||
if node.id in seen: |
|
||||
continue |
|
||||
seen.append(node.id) |
|
||||
lst_src.append(node) |
|
||||
|
|
||||
# read the file |
|
||||
code = node.read(env) |
|
||||
code = preproc.re_nl.sub('', code) |
|
||||
code = preproc.re_cpp.sub(preproc.repl, code) |
|
||||
|
|
||||
# find .i files and project headers |
|
||||
names = re_2.findall(code) + re_3.findall(code) |
|
||||
for n in names: |
|
||||
for d in self.generator.swig_dir_nodes + [node.parent]: |
|
||||
u = d.find_resource(n) |
|
||||
if u: |
|
||||
to_see.append(u) |
|
||||
break |
|
||||
else: |
|
||||
Logs.warn('could not find %r' % n) |
|
||||
|
|
||||
# list of nodes this one depends on, and module name if present |
|
||||
if Logs.verbose: |
|
||||
Logs.debug('deps: deps for %s: %s' % (str(self), str(lst_src))) |
|
||||
return (lst_src, []) |
|
||||
cls.scan = scan |
|
||||
|
|
||||
# provide additional language processing |
|
||||
swig_langs = {} |
|
||||
def swig(fun): |
|
||||
swig_langs[fun.__name__.replace('swig_', '')] = fun |
|
||||
|
|
||||
def swig_c(self): |
|
||||
ext = '.swigwrap_%d.c' % self.generator.idx |
|
||||
flags = self.env['SWIGFLAGS'] |
|
||||
if '-c++' in flags: |
|
||||
ext += 'xx' |
|
||||
out_node = self.inputs[0].parent.find_or_declare(self.module + ext) |
|
||||
|
|
||||
if '-c++' in flags: |
|
||||
task = self.generator.cxx_hook(out_node) |
|
||||
else: |
|
||||
task = self.generator.cc_hook(out_node) |
|
||||
|
|
||||
task.set_run_after(self) |
|
||||
|
|
||||
ge = self.generator.bld.generator |
|
||||
ge.outstanding.insert(0, task) |
|
||||
ge.total += 1 |
|
||||
|
|
||||
try: |
|
||||
ltask = self.generator.link_task |
|
||||
except AttributeError: |
|
||||
pass |
|
||||
else: |
|
||||
ltask.inputs.append(task.outputs[0]) |
|
||||
|
|
||||
self.outputs.append(out_node) |
|
||||
|
|
||||
if not '-o' in self.env['SWIGFLAGS']: |
|
||||
self.env.append_value('SWIGFLAGS', '-o') |
|
||||
self.env.append_value('SWIGFLAGS', self.outputs[0].abspath(self.env)) |
|
||||
|
|
||||
@swig |
|
||||
def swig_python(tsk): |
|
||||
tsk.set_outputs(tsk.inputs[0].parent.find_or_declare(tsk.module + '.py')) |
|
||||
|
|
||||
@swig |
|
||||
def swig_ocaml(tsk): |
|
||||
tsk.set_outputs(tsk.inputs[0].parent.find_or_declare(tsk.module + '.ml')) |
|
||||
tsk.set_outputs(tsk.inputs[0].parent.find_or_declare(tsk.module + '.mli')) |
|
||||
|
|
||||
@taskgen |
|
||||
@feature('swig') |
|
||||
@after('apply_incpaths') |
|
||||
def add_swig_paths(self): |
|
||||
"""the attribute 'after' is not used here, the method is added directly at the end""" |
|
||||
|
|
||||
self.swig_dir_nodes = self.env['INC_PATHS'] |
|
||||
include_flags = self.env['_CXXINCFLAGS'] or self.env['_CCINCFLAGS'] |
|
||||
self.env.append_unique('SWIGFLAGS', [f.replace("/I", "-I") for f in include_flags]) |
|
||||
|
|
||||
@extension(SWIG_EXTS) |
|
||||
def i_file(self, node): |
|
||||
if not 'add_swig_paths' in self.meths: |
|
||||
self.meths.append('add_swig_paths') |
|
||||
|
|
||||
# the task instance |
|
||||
tsk = self.create_task('swig') |
|
||||
tsk.set_inputs(node) |
|
||||
tsk.module = getattr(self, 'swig_module', None) |
|
||||
|
|
||||
flags = self.to_list(getattr(self, 'swig_flags', [])) |
|
||||
tsk.env['SWIGFLAGS'] = flags |
|
||||
|
|
||||
if not '-outdir' in flags: |
|
||||
flags.append('-outdir') |
|
||||
flags.append(node.parent.abspath(self.env)) |
|
||||
|
|
||||
@conf |
|
||||
def check_swig_version(conf, minver=None): |
|
||||
"""Check for a minimum swig version like conf.check_swig_version('1.3.28') |
|
||||
or conf.check_swig_version((1,3,28)) """ |
|
||||
reg_swig = re.compile(r'SWIG Version\s(.*)', re.M) |
|
||||
|
|
||||
swig_out = Utils.cmd_output('%s -version' % conf.env['SWIG']) |
|
||||
|
|
||||
swigver = [int(s) for s in reg_swig.findall(swig_out)[0].split('.')] |
|
||||
if isinstance(minver, basestring): |
|
||||
minver = [int(s) for s in minver.split(".")] |
|
||||
if isinstance(minver, tuple): |
|
||||
minver = [int(s) for s in minver] |
|
||||
result = (minver is None) or (minver[:3] <= swigver[:3]) |
|
||||
swigver_full = '.'.join(map(str, swigver)) |
|
||||
if result: |
|
||||
conf.env['SWIG_VERSION'] = swigver_full |
|
||||
minver_str = '.'.join(map(str, minver)) |
|
||||
if minver is None: |
|
||||
conf.check_message_custom('swig version', '', swigver_full) |
|
||||
else: |
|
||||
conf.check_message('swig version', '>= %s' % (minver_str,), result, option=swigver_full) |
|
||||
return result |
|
||||
|
|
||||
def detect(conf): |
|
||||
swig = conf.find_program('swig', var='SWIG', mandatory=True) |
|
||||
|
|
@ -1,113 +0,0 @@ |
|||||
#! /usr/bin/env python |
|
||||
# encoding: UTF-8 |
|
||||
# Nicolas Joseph 2009 |
|
||||
|
|
||||
from fnmatch import fnmatchcase |
|
||||
import os, os.path, re, stat |
|
||||
import Task, Utils, Node, Constants |
|
||||
from TaskGen import feature, extension, after |
|
||||
from Logs import debug, warn, error |
|
||||
|
|
||||
VALADOC_STR = '${VALADOC}' |
|
||||
|
|
||||
class valadoc_task(Task.Task): |
|
||||
|
|
||||
vars = ['VALADOC', 'VALADOCFLAGS'] |
|
||||
color = 'BLUE' |
|
||||
after = 'cxx_link cc_link' |
|
||||
quiet = True |
|
||||
|
|
||||
output_dir = '' |
|
||||
doclet = '' |
|
||||
package_name = '' |
|
||||
package_version = '' |
|
||||
files = [] |
|
||||
protected = False |
|
||||
private = False |
|
||||
inherit = False |
|
||||
deps = False |
|
||||
enable_non_null_experimental = False |
|
||||
force = False |
|
||||
|
|
||||
def runnable_status(self): |
|
||||
return True |
|
||||
|
|
||||
def run(self): |
|
||||
if self.env['VALADOC']: |
|
||||
if not self.env['VALADOCFLAGS']: |
|
||||
self.env['VALADOCFLAGS'] = '' |
|
||||
cmd = [Utils.subst_vars(VALADOC_STR, self.env)] |
|
||||
cmd.append ('-o %s' % self.output_dir) |
|
||||
if getattr(self, 'doclet', None): |
|
||||
cmd.append ('--doclet %s' % self.doclet) |
|
||||
cmd.append ('--package-name %s' % self.package_name) |
|
||||
if getattr(self, 'version', None): |
|
||||
cmd.append ('--package-version %s' % self.package_version) |
|
||||
if getattr(self, 'packages', None): |
|
||||
for package in self.packages: |
|
||||
cmd.append ('--pkg %s' % package) |
|
||||
if getattr(self, 'vapi_dirs', None): |
|
||||
for vapi_dir in self.vapi_dirs: |
|
||||
cmd.append ('--vapidir %s' % vapi_dir) |
|
||||
if getattr(self, 'protected', None): |
|
||||
cmd.append ('--protected') |
|
||||
if getattr(self, 'private', None): |
|
||||
cmd.append ('--private') |
|
||||
if getattr(self, 'inherit', None): |
|
||||
cmd.append ('--inherit') |
|
||||
if getattr(self, 'deps', None): |
|
||||
cmd.append ('--deps') |
|
||||
if getattr(self, 'enable_non_null_experimental', None): |
|
||||
cmd.append ('--enable-non-null-experimental') |
|
||||
if getattr(self, 'force', None): |
|
||||
cmd.append ('--force') |
|
||||
cmd.append (' '.join ([x.relpath_gen (self.generator.bld.bldnode) for x in self.files])) |
|
||||
return self.generator.bld.exec_command(' '.join(cmd)) |
|
||||
else: |
|
||||
error ('You must install valadoc <http://live.gnome.org/Valadoc> for generate the API documentation') |
|
||||
return -1 |
|
||||
|
|
||||
@feature('valadoc') |
|
||||
def process_valadoc(self): |
|
||||
task = getattr(self, 'task', None) |
|
||||
if not task: |
|
||||
task = self.create_task('valadoc') |
|
||||
self.task = task |
|
||||
if getattr(self, 'output_dir', None): |
|
||||
task.output_dir = self.output_dir |
|
||||
else: |
|
||||
Utils.WafError('no output directory') |
|
||||
if getattr(self, 'doclet', None): |
|
||||
task.doclet = self.doclet |
|
||||
else: |
|
||||
Utils.WafError('no doclet directory') |
|
||||
if getattr(self, 'package_name', None): |
|
||||
task.package_name = self.package_name |
|
||||
else: |
|
||||
Utils.WafError('no package name') |
|
||||
if getattr(self, 'package_version', None): |
|
||||
task.package_version = self.package_version |
|
||||
if getattr(self, 'packages', None): |
|
||||
task.packages = Utils.to_list(self.packages) |
|
||||
if getattr(self, 'vapi_dirs', None): |
|
||||
task.vapi_dirs = Utils.to_list(self.vapi_dirs) |
|
||||
if getattr(self, 'files', None): |
|
||||
task.files = self.files |
|
||||
else: |
|
||||
Utils.WafError('no input file') |
|
||||
if getattr(self, 'protected', None): |
|
||||
task.protected = self.protected |
|
||||
if getattr(self, 'private', None): |
|
||||
task.private = self.private |
|
||||
if getattr(self, 'inherit', None): |
|
||||
task.inherit = self.inherit |
|
||||
if getattr(self, 'deps', None): |
|
||||
task.deps = self.deps |
|
||||
if getattr(self, 'enable_non_null_experimental', None): |
|
||||
task.enable_non_null_experimental = self.enable_non_null_experimental |
|
||||
if getattr(self, 'force', None): |
|
||||
task.force = self.force |
|
||||
|
|
||||
def detect(conf): |
|
||||
conf.find_program('valadoc', var='VALADOC', mandatory=False) |
|
||||
|
|
@ -1,35 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# ita 2010 |
|
||||
|
|
||||
import Logs, Utils, Build, Task |
|
||||
|
|
||||
def say(txt): |
|
||||
Logs.warn("^o^: %s" % txt) |
|
||||
|
|
||||
try: |
|
||||
ret = Utils.cmd_output('which cowsay 2> /dev/null').strip() |
|
||||
except Exception, e: |
|
||||
pass |
|
||||
else: |
|
||||
def say(txt): |
|
||||
f = Utils.cmd_output([ret, txt]) |
|
||||
Utils.pprint('PINK', f) |
|
||||
|
|
||||
say('you make the errors, we detect them') |
|
||||
|
|
||||
def check_task_classes(self): |
|
||||
for x in Task.TaskBase.classes: |
|
||||
if isinstance(x, Task.Task): |
|
||||
if not getattr(cls, 'ext_in', None) or getattr(cls, 'before', None): |
|
||||
say('class %s has no precedence constraints (ext_in/before)') |
|
||||
if not getattr(cls, 'ext_out', None) or getattr(cls, 'after', None): |
|
||||
say('class %s has no precedence constraints (ext_out/after)') |
|
||||
|
|
||||
comp = Build.BuildContext.compile |
|
||||
def compile(self): |
|
||||
if not getattr(self, 'magic', None): |
|
||||
check_task_classes(self) |
|
||||
return comp(self) |
|
||||
Build.BuildContext.compile = compile |
|
||||
|
|
@ -1,38 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# John O'Meara, 2006 |
|
||||
# Thomas Nagy 2009 |
|
||||
|
|
||||
"Bison processing" |
|
||||
|
|
||||
import Task |
|
||||
from TaskGen import extension |
|
||||
|
|
||||
bison = '${BISON} ${BISONFLAGS} ${SRC[0].abspath()} -o ${TGT[0].name}' |
|
||||
cls = Task.simple_task_type('bison', bison, 'GREEN', ext_in='.yc .y .yy', ext_out='.c .cxx .h .l', shell=False) |
|
||||
|
|
||||
@extension(['.y', '.yc', '.yy']) |
|
||||
def big_bison(self, node): |
|
||||
"""when it becomes complicated (unlike flex), the old recipes work better (cwd)""" |
|
||||
has_h = '-d' in self.env['BISONFLAGS'] |
|
||||
|
|
||||
outs = [] |
|
||||
if node.name.endswith('.yc'): |
|
||||
outs.append(node.change_ext('.tab.cc')) |
|
||||
if has_h: |
|
||||
outs.append(node.change_ext('.tab.hh')) |
|
||||
else: |
|
||||
outs.append(node.change_ext('.tab.c')) |
|
||||
if has_h: |
|
||||
outs.append(node.change_ext('.tab.h')) |
|
||||
|
|
||||
tsk = self.create_task('bison', node, outs) |
|
||||
tsk.cwd = node.bld_dir(tsk.env) |
|
||||
|
|
||||
# and the c/cxx file must be compiled too |
|
||||
self.allnodes.append(outs[0]) |
|
||||
|
|
||||
def detect(conf): |
|
||||
bison = conf.find_program('bison', var='BISON', mandatory=True) |
|
||||
conf.env['BISONFLAGS'] = '-d' |
|
||||
|
|
@ -1,68 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# Thomas Nagy, 2006 (ita) |
|
||||
|
|
||||
"C# support" |
|
||||
|
|
||||
import TaskGen, Utils, Task, Options |
|
||||
from Logs import error |
|
||||
from TaskGen import before, after, taskgen, feature |
|
||||
|
|
||||
flag_vars= ['FLAGS', 'ASSEMBLIES'] |
|
||||
|
|
||||
@feature('cs') |
|
||||
def init_cs(self): |
|
||||
Utils.def_attrs(self, |
|
||||
flags = '', |
|
||||
assemblies = '', |
|
||||
resources = '', |
|
||||
uselib = '') |
|
||||
|
|
||||
@feature('cs') |
|
||||
@after('init_cs') |
|
||||
def apply_uselib_cs(self): |
|
||||
if not self.uselib: |
|
||||
return |
|
||||
global flag_vars |
|
||||
for var in self.to_list(self.uselib): |
|
||||
for v in self.flag_vars: |
|
||||
val = self.env[v+'_'+var] |
|
||||
if val: self.env.append_value(v, val) |
|
||||
|
|
||||
@feature('cs') |
|
||||
@after('apply_uselib_cs') |
|
||||
@before('apply_core') |
|
||||
def apply_cs(self): |
|
||||
try: self.meths.remove('apply_core') |
|
||||
except ValueError: pass |
|
||||
|
|
||||
# process the flags for the assemblies |
|
||||
for i in self.to_list(self.assemblies) + self.env['ASSEMBLIES']: |
|
||||
self.env.append_unique('_ASSEMBLIES', '/r:'+i) |
|
||||
|
|
||||
# process the flags for the resources |
|
||||
for i in self.to_list(self.resources): |
|
||||
self.env.append_unique('_RESOURCES', '/resource:'+i) |
|
||||
|
|
||||
# what kind of assembly are we generating? |
|
||||
self.env['_TYPE'] = getattr(self, 'type', 'exe') |
|
||||
|
|
||||
# additional flags |
|
||||
self.env.append_unique('_FLAGS', self.to_list(self.flags)) |
|
||||
self.env.append_unique('_FLAGS', self.env.FLAGS) |
|
||||
|
|
||||
# process the sources |
|
||||
nodes = [self.path.find_resource(i) for i in self.to_list(self.source)] |
|
||||
self.create_task('mcs', nodes, self.path.find_or_declare(self.target)) |
|
||||
|
|
||||
Task.simple_task_type('mcs', '${MCS} ${SRC} /target:${_TYPE} /out:${TGT} ${_FLAGS} ${_ASSEMBLIES} ${_RESOURCES}', color='YELLOW') |
|
||||
|
|
||||
def detect(conf): |
|
||||
csc = getattr(Options.options, 'cscbinary', None) |
|
||||
if csc: |
|
||||
conf.env.MCS = csc |
|
||||
conf.find_program(['gmcs', 'mcs'], var='MCS') |
|
||||
|
|
||||
def set_options(opt): |
|
||||
opt.add_option('--with-csc-binary', type='string', dest='cscbinary') |
|
||||
|
|
@ -1,34 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# Ali Sabil, 2007 |
|
||||
|
|
||||
import Task, Utils |
|
||||
from TaskGen import taskgen, before, after, feature |
|
||||
|
|
||||
@taskgen |
|
||||
def add_dbus_file(self, filename, prefix, mode): |
|
||||
if not hasattr(self, 'dbus_lst'): |
|
||||
self.dbus_lst = [] |
|
||||
self.meths.append('process_dbus') |
|
||||
self.dbus_lst.append([filename, prefix, mode]) |
|
||||
|
|
||||
@before('apply_core') |
|
||||
def process_dbus(self): |
|
||||
for filename, prefix, mode in getattr(self, 'dbus_lst', []): |
|
||||
node = self.path.find_resource(filename) |
|
||||
|
|
||||
if not node: |
|
||||
raise Utils.WafError('file not found ' + filename) |
|
||||
|
|
||||
tsk = self.create_task('dbus_binding_tool', node, node.change_ext('.h')) |
|
||||
|
|
||||
tsk.env.DBUS_BINDING_TOOL_PREFIX = prefix |
|
||||
tsk.env.DBUS_BINDING_TOOL_MODE = mode |
|
||||
|
|
||||
Task.simple_task_type('dbus_binding_tool', |
|
||||
'${DBUS_BINDING_TOOL} --prefix=${DBUS_BINDING_TOOL_PREFIX} --mode=${DBUS_BINDING_TOOL_MODE} --output=${TGT} ${SRC}', |
|
||||
color='BLUE', before='cc') |
|
||||
|
|
||||
def detect(conf): |
|
||||
dbus_binding_tool = conf.find_program('dbus-binding-tool', var='DBUS_BINDING_TOOL') |
|
||||
|
|
@ -1,25 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# John O'Meara, 2006 |
|
||||
# Thomas Nagy, 2006-2008 |
|
||||
|
|
||||
"Flex processing" |
|
||||
|
|
||||
import TaskGen |
|
||||
|
|
||||
def decide_ext(self, node): |
|
||||
if 'cxx' in self.features: return '.lex.cc' |
|
||||
else: return '.lex.c' |
|
||||
|
|
||||
TaskGen.declare_chain( |
|
||||
name = 'flex', |
|
||||
rule = '${FLEX} -o${TGT} ${FLEXFLAGS} ${SRC}', |
|
||||
ext_in = '.l', |
|
||||
ext_out = '.c .cxx' |
|
||||
decider = decide_ext, |
|
||||
) |
|
||||
|
|
||||
def detect(conf): |
|
||||
conf.find_program('flex', var='FLEX', mandatory=True) |
|
||||
conf.env['FLEXFLAGS'] = '' |
|
||||
|
|
@ -1,164 +0,0 @@ |
|||||
#! /usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# Thomas Nagy, 2006-2008 (ita) |
|
||||
|
|
||||
"GLib2 support" |
|
||||
|
|
||||
import Task, Utils |
|
||||
from TaskGen import taskgen, before, after, feature |
|
||||
|
|
||||
# |
|
||||
# glib-genmarshal |
|
||||
# |
|
||||
|
|
||||
@taskgen |
|
||||
def add_marshal_file(self, filename, prefix): |
|
||||
if not hasattr(self, 'marshal_list'): |
|
||||
self.marshal_list = [] |
|
||||
self.meths.append('process_marshal') |
|
||||
self.marshal_list.append((filename, prefix)) |
|
||||
|
|
||||
@before('apply_core') |
|
||||
def process_marshal(self): |
|
||||
for f, prefix in getattr(self, 'marshal_list', []): |
|
||||
node = self.path.find_resource(f) |
|
||||
|
|
||||
if not node: |
|
||||
raise Utils.WafError('file not found %r' % f) |
|
||||
|
|
||||
h_node = node.change_ext('.h') |
|
||||
c_node = node.change_ext('.c') |
|
||||
|
|
||||
task = self.create_task('glib_genmarshal', node, [h_node, c_node]) |
|
||||
task.env.GLIB_GENMARSHAL_PREFIX = prefix |
|
||||
self.allnodes.append(c_node) |
|
||||
|
|
||||
def genmarshal_func(self): |
|
||||
|
|
||||
bld = self.inputs[0].__class__.bld |
|
||||
|
|
||||
get = self.env.get_flat |
|
||||
cmd1 = "%s %s --prefix=%s --header > %s" % ( |
|
||||
get('GLIB_GENMARSHAL'), |
|
||||
self.inputs[0].srcpath(self.env), |
|
||||
get('GLIB_GENMARSHAL_PREFIX'), |
|
||||
self.outputs[0].abspath(self.env) |
|
||||
) |
|
||||
|
|
||||
ret = bld.exec_command(cmd1) |
|
||||
if ret: return ret |
|
||||
|
|
||||
#print self.outputs[1].abspath(self.env) |
|
||||
f = open(self.outputs[1].abspath(self.env), 'wb') |
|
||||
c = '''#include "%s"\n''' % self.outputs[0].name |
|
||||
f.write(c) |
|
||||
f.close() |
|
||||
|
|
||||
cmd2 = "%s %s --prefix=%s --body >> %s" % ( |
|
||||
get('GLIB_GENMARSHAL'), |
|
||||
self.inputs[0].srcpath(self.env), |
|
||||
get('GLIB_GENMARSHAL_PREFIX'), |
|
||||
self.outputs[1].abspath(self.env) |
|
||||
) |
|
||||
ret = Utils.exec_command(cmd2) |
|
||||
if ret: return ret |
|
||||
|
|
||||
# |
|
||||
# glib-mkenums |
|
||||
# |
|
||||
|
|
||||
@taskgen |
|
||||
def add_enums_from_template(self, source='', target='', template='', comments=''): |
|
||||
if not hasattr(self, 'enums_list'): |
|
||||
self.enums_list = [] |
|
||||
self.meths.append('process_enums') |
|
||||
self.enums_list.append({'source': source, |
|
||||
'target': target, |
|
||||
'template': template, |
|
||||
'file-head': '', |
|
||||
'file-prod': '', |
|
||||
'file-tail': '', |
|
||||
'enum-prod': '', |
|
||||
'value-head': '', |
|
||||
'value-prod': '', |
|
||||
'value-tail': '', |
|
||||
'comments': comments}) |
|
||||
|
|
||||
@taskgen |
|
||||
def add_enums(self, source='', target='', |
|
||||
file_head='', file_prod='', file_tail='', enum_prod='', |
|
||||
value_head='', value_prod='', value_tail='', comments=''): |
|
||||
if not hasattr(self, 'enums_list'): |
|
||||
self.enums_list = [] |
|
||||
self.meths.append('process_enums') |
|
||||
self.enums_list.append({'source': source, |
|
||||
'template': '', |
|
||||
'target': target, |
|
||||
'file-head': file_head, |
|
||||
'file-prod': file_prod, |
|
||||
'file-tail': file_tail, |
|
||||
'enum-prod': enum_prod, |
|
||||
'value-head': value_head, |
|
||||
'value-prod': value_prod, |
|
||||
'value-tail': value_tail, |
|
||||
'comments': comments}) |
|
||||
|
|
||||
@before('apply_core') |
|
||||
def process_enums(self): |
|
||||
for enum in getattr(self, 'enums_list', []): |
|
||||
task = self.create_task('glib_mkenums') |
|
||||
env = task.env |
|
||||
|
|
||||
inputs = [] |
|
||||
|
|
||||
# process the source |
|
||||
source_list = self.to_list(enum['source']) |
|
||||
if not source_list: |
|
||||
raise Utils.WafError('missing source ' + str(enum)) |
|
||||
source_list = [self.path.find_resource(k) for k in source_list] |
|
||||
inputs += source_list |
|
||||
env['GLIB_MKENUMS_SOURCE'] = [k.srcpath(env) for k in source_list] |
|
||||
|
|
||||
# find the target |
|
||||
if not enum['target']: |
|
||||
raise Utils.WafError('missing target ' + str(enum)) |
|
||||
tgt_node = self.path.find_or_declare(enum['target']) |
|
||||
if tgt_node.name.endswith('.c'): |
|
||||
self.allnodes.append(tgt_node) |
|
||||
env['GLIB_MKENUMS_TARGET'] = tgt_node.abspath(env) |
|
||||
|
|
||||
|
|
||||
options = [] |
|
||||
|
|
||||
if enum['template']: # template, if provided |
|
||||
template_node = self.path.find_resource(enum['template']) |
|
||||
options.append('--template %s' % (template_node.abspath(env))) |
|
||||
inputs.append(template_node) |
|
||||
params = {'file-head' : '--fhead', |
|
||||
'file-prod' : '--fprod', |
|
||||
'file-tail' : '--ftail', |
|
||||
'enum-prod' : '--eprod', |
|
||||
'value-head' : '--vhead', |
|
||||
'value-prod' : '--vprod', |
|
||||
'value-tail' : '--vtail', |
|
||||
'comments': '--comments'} |
|
||||
for param, option in params.iteritems(): |
|
||||
if enum[param]: |
|
||||
options.append('%s %r' % (option, enum[param])) |
|
||||
|
|
||||
env['GLIB_MKENUMS_OPTIONS'] = ' '.join(options) |
|
||||
|
|
||||
# update the task instance |
|
||||
task.set_inputs(inputs) |
|
||||
task.set_outputs(tgt_node) |
|
||||
|
|
||||
Task.task_type_from_func('glib_genmarshal', func=genmarshal_func, vars=['GLIB_GENMARSHAL_PREFIX', 'GLIB_GENMARSHAL'], |
|
||||
color='BLUE', before='cc cxx') |
|
||||
Task.simple_task_type('glib_mkenums', |
|
||||
'${GLIB_MKENUMS} ${GLIB_MKENUMS_OPTIONS} ${GLIB_MKENUMS_SOURCE} > ${GLIB_MKENUMS_TARGET}', |
|
||||
color='PINK', before='cc cxx') |
|
||||
|
|
||||
def detect(conf): |
|
||||
glib_genmarshal = conf.find_program('glib-genmarshal', var='GLIB_GENMARSHAL') |
|
||||
mk_enums_tool = conf.find_program('glib-mkenums', var='GLIB_MKENUMS') |
|
||||
|
|
@ -1,223 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# Thomas Nagy, 2006-2008 (ita) |
|
||||
|
|
||||
"Gnome support" |
|
||||
|
|
||||
import os, re |
|
||||
import TaskGen, Utils, Runner, Task, Build, Options, Logs |
|
||||
import cc |
|
||||
from Logs import error |
|
||||
from TaskGen import taskgen, before, after, feature |
|
||||
|
|
||||
n1_regexp = re.compile('<refentrytitle>(.*)</refentrytitle>', re.M) |
|
||||
n2_regexp = re.compile('<manvolnum>(.*)</manvolnum>', re.M) |
|
||||
|
|
||||
def postinstall_schemas(prog_name): |
|
||||
if Build.bld.is_install: |
|
||||
dir = Build.bld.get_install_path('${PREFIX}/etc/gconf/schemas/%s.schemas' % prog_name) |
|
||||
if not Options.options.destdir: |
|
||||
# add the gconf schema |
|
||||
Utils.pprint('YELLOW', 'Installing GConf schema') |
|
||||
command = 'gconftool-2 --install-schema-file=%s 1> /dev/null' % dir |
|
||||
ret = Utils.exec_command(command) |
|
||||
else: |
|
||||
Utils.pprint('YELLOW', 'GConf schema not installed. After install, run this:') |
|
||||
Utils.pprint('YELLOW', 'gconftool-2 --install-schema-file=%s' % dir) |
|
||||
|
|
||||
def postinstall_icons(): |
|
||||
dir = Build.bld.get_install_path('${DATADIR}/icons/hicolor') |
|
||||
if Build.bld.is_install: |
|
||||
if not Options.options.destdir: |
|
||||
# update the pixmap cache directory |
|
||||
Utils.pprint('YELLOW', "Updating Gtk icon cache.") |
|
||||
command = 'gtk-update-icon-cache -q -f -t %s' % dir |
|
||||
ret = Utils.exec_command(command) |
|
||||
else: |
|
||||
Utils.pprint('YELLOW', 'Icon cache not updated. After install, run this:') |
|
||||
Utils.pprint('YELLOW', 'gtk-update-icon-cache -q -f -t %s' % dir) |
|
||||
|
|
||||
def postinstall_scrollkeeper(prog_name): |
|
||||
if Build.bld.is_install: |
|
||||
# now the scrollkeeper update if we can write to the log file |
|
||||
if os.access('/var/log/scrollkeeper.log', os.W_OK): |
|
||||
dir1 = Build.bld.get_install_path('${PREFIX}/var/scrollkeeper') |
|
||||
dir2 = Build.bld.get_install_path('${DATADIR}/omf/%s' % prog_name) |
|
||||
command = 'scrollkeeper-update -q -p %s -o %s' % (dir1, dir2) |
|
||||
ret = Utils.exec_command(command) |
|
||||
|
|
||||
def postinstall(prog_name='myapp', schemas=1, icons=1, scrollkeeper=1): |
|
||||
if schemas: postinstall_schemas(prog_name) |
|
||||
if icons: postinstall_icons() |
|
||||
if scrollkeeper: postinstall_scrollkeeper(prog_name) |
|
||||
|
|
||||
# OBSOLETE |
|
||||
class gnome_doc_taskgen(TaskGen.task_gen): |
|
||||
def __init__(self, *k, **kw): |
|
||||
TaskGen.task_gen.__init__(self, *k, **kw) |
|
||||
|
|
||||
@feature('gnome_doc') |
|
||||
def init_gnome_doc(self): |
|
||||
self.default_install_path = '${PREFIX}/share' |
|
||||
|
|
||||
@feature('gnome_doc') |
|
||||
@after('init_gnome_doc') |
|
||||
def apply_gnome_doc(self): |
|
||||
self.env['APPNAME'] = self.doc_module |
|
||||
lst = self.to_list(self.doc_linguas) |
|
||||
bld = self.bld |
|
||||
lst.append('C') |
|
||||
|
|
||||
for x in lst: |
|
||||
if not x == 'C': |
|
||||
tsk = self.create_task('xml2po') |
|
||||
node = self.path.find_resource(x+'/'+x+'.po') |
|
||||
src = self.path.find_resource('C/%s.xml' % self.doc_module) |
|
||||
out = self.path.find_or_declare('%s/%s.xml' % (x, self.doc_module)) |
|
||||
tsk.set_inputs([node, src]) |
|
||||
tsk.set_outputs(out) |
|
||||
else: |
|
||||
out = self.path.find_resource('%s/%s.xml' % (x, self.doc_module)) |
|
||||
|
|
||||
tsk2 = self.create_task('xsltproc2po') |
|
||||
out2 = self.path.find_or_declare('%s/%s-%s.omf' % (x, self.doc_module, x)) |
|
||||
tsk2.set_outputs(out2) |
|
||||
node = self.path.find_resource(self.doc_module+".omf.in") |
|
||||
tsk2.inputs = [node, out] |
|
||||
|
|
||||
tsk2.run_after.append(tsk) |
|
||||
|
|
||||
if bld.is_install: |
|
||||
path = self.install_path + '/gnome/help/%s/%s' % (self.doc_module, x) |
|
||||
bld.install_files(self.install_path + '/omf', out2, env=self.env) |
|
||||
for y in self.to_list(self.doc_figures): |
|
||||
try: |
|
||||
os.stat(self.path.abspath() + '/' + x + '/' + y) |
|
||||
bld.install_as(path + '/' + y, self.path.abspath() + '/' + x + '/' + y) |
|
||||
except: |
|
||||
bld.install_as(path + '/' + y, self.path.abspath() + '/C/' + y) |
|
||||
bld.install_as(path + '/%s.xml' % self.doc_module, out.abspath(self.env)) |
|
||||
if x == 'C': |
|
||||
xmls = self.to_list(self.doc_includes) |
|
||||
xmls.append(self.doc_entities) |
|
||||
for z in xmls: |
|
||||
out = self.path.find_resource('%s/%s' % (x, z)) |
|
||||
bld.install_as(path + '/%s' % z, out.abspath(self.env)) |
|
||||
|
|
||||
# OBSOLETE |
|
||||
class xml_to_taskgen(TaskGen.task_gen): |
|
||||
def __init__(self, *k, **kw): |
|
||||
TaskGen.task_gen.__init__(self, *k, **kw) |
|
||||
|
|
||||
@feature('xml_to') |
|
||||
def init_xml_to(self): |
|
||||
Utils.def_attrs(self, |
|
||||
source = 'xmlfile', |
|
||||
xslt = 'xlsltfile', |
|
||||
target = 'hey', |
|
||||
default_install_path = '${PREFIX}', |
|
||||
task_created = None) |
|
||||
|
|
||||
@feature('xml_to') |
|
||||
@after('init_xml_to') |
|
||||
def apply_xml_to(self): |
|
||||
xmlfile = self.path.find_resource(self.source) |
|
||||
xsltfile = self.path.find_resource(self.xslt) |
|
||||
tsk = self.create_task('xmlto', [xmlfile, xsltfile], xmlfile.change_ext('html')) |
|
||||
tsk.install_path = self.install_path |
|
||||
|
|
||||
def sgml_scan(self): |
|
||||
node = self.inputs[0] |
|
||||
|
|
||||
env = self.env |
|
||||
variant = node.variant(env) |
|
||||
|
|
||||
fi = open(node.abspath(env), 'r') |
|
||||
content = fi.read() |
|
||||
fi.close() |
|
||||
|
|
||||
# we should use a sgml parser :-/ |
|
||||
name = n1_regexp.findall(content)[0] |
|
||||
num = n2_regexp.findall(content)[0] |
|
||||
|
|
||||
doc_name = name+'.'+num |
|
||||
|
|
||||
if not self.outputs: |
|
||||
self.outputs = [self.generator.path.find_or_declare(doc_name)] |
|
||||
|
|
||||
return ([], [doc_name]) |
|
||||
|
|
||||
class gnome_sgml2man_taskgen(TaskGen.task_gen): |
|
||||
def __init__(self, *k, **kw): |
|
||||
TaskGen.task_gen.__init__(self, *k, **kw) |
|
||||
|
|
||||
@feature('gnome_sgml2man') |
|
||||
def apply_gnome_sgml2man(self): |
|
||||
""" |
|
||||
we could make it more complicated, but for now we just scan the document each time |
|
||||
""" |
|
||||
assert(getattr(self, 'appname', None)) |
|
||||
|
|
||||
def install_result(task): |
|
||||
out = task.outputs[0] |
|
||||
name = out.name |
|
||||
ext = name[-1] |
|
||||
env = task.env |
|
||||
self.bld.install_files('${DATADIR}/man/man%s/' % ext, out, env) |
|
||||
|
|
||||
self.bld.rescan(self.path) |
|
||||
for name in self.bld.cache_dir_contents[self.path.id]: |
|
||||
base, ext = os.path.splitext(name) |
|
||||
if ext != '.sgml': continue |
|
||||
|
|
||||
task = self.create_task('sgml2man') |
|
||||
task.set_inputs(self.path.find_resource(name)) |
|
||||
task.task_generator = self |
|
||||
if self.bld.is_install: task.install = install_result |
|
||||
# no outputs, the scanner does it |
|
||||
# no caching for now, this is not a time-critical feature |
|
||||
# in the future the scanner can be used to do more things (find dependencies, etc) |
|
||||
task.scan() |
|
||||
|
|
||||
cls = Task.simple_task_type('sgml2man', '${SGML2MAN} -o ${TGT[0].bld_dir(env)} ${SRC} > /dev/null', color='BLUE') |
|
||||
cls.scan = sgml_scan |
|
||||
cls.quiet = 1 |
|
||||
|
|
||||
Task.simple_task_type('xmlto', '${XMLTO} html -m ${SRC[1].abspath(env)} ${SRC[0].abspath(env)}') |
|
||||
|
|
||||
Task.simple_task_type('xml2po', '${XML2PO} ${XML2POFLAGS} ${SRC} > ${TGT}', color='BLUE') |
|
||||
|
|
||||
# how do you expect someone to understand this?! |
|
||||
xslt_magic = """${XSLTPROC2PO} -o ${TGT[0].abspath(env)} \ |
|
||||
--stringparam db2omf.basename ${APPNAME} \ |
|
||||
--stringparam db2omf.format docbook \ |
|
||||
--stringparam db2omf.lang ${TGT[0].abspath(env)[:-4].split('-')[-1]} \ |
|
||||
--stringparam db2omf.dtd '-//OASIS//DTD DocBook XML V4.3//EN' \ |
|
||||
--stringparam db2omf.omf_dir ${PREFIX}/share/omf \ |
|
||||
--stringparam db2omf.help_dir ${PREFIX}/share/gnome/help \ |
|
||||
--stringparam db2omf.omf_in ${SRC[0].abspath(env)} \ |
|
||||
--stringparam db2omf.scrollkeeper_cl ${SCROLLKEEPER_DATADIR}/Templates/C/scrollkeeper_cl.xml \ |
|
||||
${DB2OMF} ${SRC[1].abspath(env)}""" |
|
||||
|
|
||||
#--stringparam db2omf.dtd '-//OASIS//DTD DocBook XML V4.3//EN' \ |
|
||||
Task.simple_task_type('xsltproc2po', xslt_magic, color='BLUE') |
|
||||
|
|
||||
def detect(conf): |
|
||||
conf.check_tool('gnu_dirs glib2 dbus') |
|
||||
sgml2man = conf.find_program('docbook2man', var='SGML2MAN') |
|
||||
|
|
||||
def getstr(varname): |
|
||||
return getattr(Options.options, varname, '') |
|
||||
|
|
||||
# addefine also sets the variable to the env |
|
||||
conf.define('GNOMELOCALEDIR', os.path.join(conf.env['DATADIR'], 'locale')) |
|
||||
|
|
||||
xml2po = conf.find_program('xml2po', var='XML2PO') |
|
||||
xsltproc2po = conf.find_program('xsltproc', var='XSLTPROC2PO') |
|
||||
conf.env['XML2POFLAGS'] = '-e -p' |
|
||||
conf.env['SCROLLKEEPER_DATADIR'] = Utils.cmd_output("scrollkeeper-config --pkgdatadir", silent=1).strip() |
|
||||
conf.env['DB2OMF'] = Utils.cmd_output("/usr/bin/pkg-config --variable db2omf gnome-doc-utils", silent=1).strip() |
|
||||
|
|
||||
def set_options(opt): |
|
||||
opt.add_option('--want-rpath', type='int', default=1, dest='want_rpath', help='set rpath to 1 or 0 [Default 1]') |
|
||||
|
|
@ -1,254 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# Thomas Nagy, 2006-2008 (ita) |
|
||||
|
|
||||
""" |
|
||||
Java support |
|
||||
|
|
||||
Javac is one of the few compilers that behaves very badly: |
|
||||
* it outputs files where it wants to (-d is only for the package root) |
|
||||
* it recompiles files silently behind your back |
|
||||
* it outputs an undefined amount of files (inner classes) |
|
||||
|
|
||||
Fortunately, the convention makes it possible to use the build dir without |
|
||||
too many problems for the moment |
|
||||
|
|
||||
Inner classes must be located and cleaned when a problem arise, |
|
||||
for the moment waf does not track the production of inner classes. |
|
||||
|
|
||||
Adding all the files to a task and executing it if any of the input files |
|
||||
change is only annoying for the compilation times |
|
||||
|
|
||||
Compilation can be run using Jython[1] rather than regular Python. Instead of |
|
||||
running one of the following commands: |
|
||||
./waf configure |
|
||||
python waf configure |
|
||||
You would have to run: |
|
||||
java -jar /path/to/jython.jar waf configure |
|
||||
|
|
||||
[1] http://www.jython.org/ |
|
||||
""" |
|
||||
|
|
||||
import os, re |
|
||||
from Configure import conf |
|
||||
import TaskGen, Task, Utils, Options, Build |
|
||||
from TaskGen import feature, before, taskgen |
|
||||
|
|
||||
class_check_source = ''' |
|
||||
public class Test { |
|
||||
public static void main(String[] argv) { |
|
||||
Class lib; |
|
||||
if (argv.length < 1) { |
|
||||
System.err.println("Missing argument"); |
|
||||
System.exit(77); |
|
||||
} |
|
||||
try { |
|
||||
lib = Class.forName(argv[0]); |
|
||||
} catch (ClassNotFoundException e) { |
|
||||
System.err.println("ClassNotFoundException"); |
|
||||
System.exit(1); |
|
||||
} |
|
||||
lib = null; |
|
||||
System.exit(0); |
|
||||
} |
|
||||
} |
|
||||
''' |
|
||||
|
|
||||
@feature('jar') |
|
||||
@before('apply_core') |
|
||||
def jar_files(self): |
|
||||
basedir = getattr(self, 'basedir', '.') |
|
||||
destfile = getattr(self, 'destfile', 'test.jar') |
|
||||
jaropts = getattr(self, 'jaropts', []) |
|
||||
jarcreate = getattr(self, 'jarcreate', 'cf') |
|
||||
|
|
||||
dir = self.path.find_dir(basedir) |
|
||||
if not dir: raise |
|
||||
|
|
||||
jaropts.append('-C') |
|
||||
jaropts.append(dir.abspath(self.env)) |
|
||||
jaropts.append('.') |
|
||||
|
|
||||
out = self.path.find_or_declare(destfile) |
|
||||
|
|
||||
tsk = self.create_task('jar_create') |
|
||||
tsk.set_outputs(out) |
|
||||
tsk.inputs = [x for x in dir.find_iter(src=0, bld=1) if x.id != out.id] |
|
||||
tsk.env['JAROPTS'] = jaropts |
|
||||
tsk.env['JARCREATE'] = jarcreate |
|
||||
|
|
||||
@feature('javac') |
|
||||
@before('apply_core') |
|
||||
def apply_java(self): |
|
||||
Utils.def_attrs(self, jarname='', jaropts='', classpath='', |
|
||||
sourcepath='.', srcdir='.', source_re='**/*.java', |
|
||||
jar_mf_attributes={}, jar_mf_classpath=[]) |
|
||||
|
|
||||
if getattr(self, 'source_root', None): |
|
||||
# old stuff |
|
||||
self.srcdir = self.source_root |
|
||||
|
|
||||
|
|
||||
nodes_lst = [] |
|
||||
|
|
||||
if not self.classpath: |
|
||||
if not self.env['CLASSPATH']: |
|
||||
self.env['CLASSPATH'] = '..' + os.pathsep + '.' |
|
||||
else: |
|
||||
self.env['CLASSPATH'] = self.classpath |
|
||||
|
|
||||
srcdir_node = self.path.find_dir(self.srcdir) |
|
||||
if not srcdir_node: |
|
||||
raise Utils.WafError('could not find srcdir %r' % self.srcdir) |
|
||||
|
|
||||
src_nodes = [x for x in srcdir_node.ant_glob(self.source_re, flat=False)] |
|
||||
bld_nodes = [x.change_ext('.class') for x in src_nodes] |
|
||||
|
|
||||
self.env['OUTDIR'] = [srcdir_node.abspath(self.env)] |
|
||||
|
|
||||
tsk = self.create_task('javac') |
|
||||
tsk.set_inputs(src_nodes) |
|
||||
tsk.set_outputs(bld_nodes) |
|
||||
|
|
||||
if getattr(self, 'compat', None): |
|
||||
tsk.env.append_value('JAVACFLAGS', ['-source', self.compat]) |
|
||||
|
|
||||
if hasattr(self, 'sourcepath'): |
|
||||
fold = [self.path.find_dir(x) for x in self.to_list(self.sourcepath)] |
|
||||
names = os.pathsep.join([x.srcpath() for x in fold]) |
|
||||
else: |
|
||||
names = srcdir_node.srcpath() |
|
||||
|
|
||||
if names: |
|
||||
tsk.env.append_value('JAVACFLAGS', ['-sourcepath', names]) |
|
||||
|
|
||||
if self.jarname: |
|
||||
jtsk = self.create_task('jar_create', bld_nodes, self.path.find_or_declare(self.jarname)) |
|
||||
jtsk.set_run_after(tsk) |
|
||||
|
|
||||
if not self.env.JAROPTS: |
|
||||
if self.jaropts: |
|
||||
self.env.JAROPTS = self.jaropts |
|
||||
else: |
|
||||
dirs = '.' |
|
||||
self.env.JAROPTS = ['-C', ''.join(self.env['OUTDIR']), dirs] |
|
||||
|
|
||||
Task.simple_task_type('jar_create', '${JAR} ${JARCREATE} ${TGT} ${JAROPTS}', color='GREEN') |
|
||||
cls = Task.simple_task_type('javac', '${JAVAC} -classpath ${CLASSPATH} -d ${OUTDIR} ${JAVACFLAGS} ${SRC}') |
|
||||
cls.color = 'BLUE' |
|
||||
def post_run_javac(self): |
|
||||
"""this is for cleaning the folder |
|
||||
javac creates single files for inner classes |
|
||||
but it is not possible to know which inner classes in advance""" |
|
||||
|
|
||||
par = {} |
|
||||
for x in self.inputs: |
|
||||
par[x.parent.id] = x.parent |
|
||||
|
|
||||
inner = {} |
|
||||
for k in par.values(): |
|
||||
path = k.abspath(self.env) |
|
||||
lst = os.listdir(path) |
|
||||
|
|
||||
for u in lst: |
|
||||
if u.find('$') >= 0: |
|
||||
inner_class_node = k.find_or_declare(u) |
|
||||
inner[inner_class_node.id] = inner_class_node |
|
||||
|
|
||||
to_add = set(inner.keys()) - set([x.id for x in self.outputs]) |
|
||||
for x in to_add: |
|
||||
self.outputs.append(inner[x]) |
|
||||
|
|
||||
return Task.Task.post_run(self) |
|
||||
cls.post_run = post_run_javac |
|
||||
|
|
||||
def detect(conf): |
|
||||
# If JAVA_PATH is set, we prepend it to the path list |
|
||||
java_path = conf.environ['PATH'].split(os.pathsep) |
|
||||
v = conf.env |
|
||||
|
|
||||
if 'JAVA_HOME' in conf.environ: |
|
||||
java_path = [os.path.join(conf.environ['JAVA_HOME'], 'bin')] + java_path |
|
||||
conf.env['JAVA_HOME'] = [conf.environ['JAVA_HOME']] |
|
||||
|
|
||||
for x in 'javac java jar'.split(): |
|
||||
conf.find_program(x, var=x.upper(), path_list=java_path) |
|
||||
conf.env[x.upper()] = conf.cmd_to_list(conf.env[x.upper()]) |
|
||||
v['JAVA_EXT'] = ['.java'] |
|
||||
|
|
||||
if 'CLASSPATH' in conf.environ: |
|
||||
v['CLASSPATH'] = conf.environ['CLASSPATH'] |
|
||||
|
|
||||
if not v['JAR']: conf.fatal('jar is required for making java packages') |
|
||||
if not v['JAVAC']: conf.fatal('javac is required for compiling java classes') |
|
||||
v['JARCREATE'] = 'cf' # can use cvf |
|
||||
|
|
||||
@conf |
|
||||
def check_java_class(self, classname, with_classpath=None): |
|
||||
"""Check if the specified java class is installed""" |
|
||||
|
|
||||
import shutil |
|
||||
|
|
||||
javatestdir = '.waf-javatest' |
|
||||
|
|
||||
classpath = javatestdir |
|
||||
if self.env['CLASSPATH']: |
|
||||
classpath += os.pathsep + self.env['CLASSPATH'] |
|
||||
if isinstance(with_classpath, str): |
|
||||
classpath += os.pathsep + with_classpath |
|
||||
|
|
||||
shutil.rmtree(javatestdir, True) |
|
||||
os.mkdir(javatestdir) |
|
||||
|
|
||||
java_file = open(os.path.join(javatestdir, 'Test.java'), 'w') |
|
||||
java_file.write(class_check_source) |
|
||||
java_file.close() |
|
||||
|
|
||||
# Compile the source |
|
||||
Utils.exec_command(self.env['JAVAC'] + [os.path.join(javatestdir, 'Test.java')], shell=False) |
|
||||
|
|
||||
# Try to run the app |
|
||||
cmd = self.env['JAVA'] + ['-cp', classpath, 'Test', classname] |
|
||||
self.log.write("%s\n" % str(cmd)) |
|
||||
found = Utils.exec_command(cmd, shell=False, log=self.log) |
|
||||
|
|
||||
self.check_message('Java class %s' % classname, "", not found) |
|
||||
|
|
||||
shutil.rmtree(javatestdir, True) |
|
||||
|
|
||||
return found |
|
||||
|
|
||||
@conf |
|
||||
def check_jni_headers(conf): |
|
||||
""" |
|
||||
Check for jni headers and libraries |
|
||||
|
|
||||
On success the environment variable xxx_JAVA is added for uselib |
|
||||
""" |
|
||||
|
|
||||
if not conf.env.CC_NAME and not conf.env.CXX_NAME: |
|
||||
conf.fatal('load a compiler first (gcc, g++, ..)') |
|
||||
|
|
||||
if not conf.env.JAVA_HOME: |
|
||||
conf.fatal('set JAVA_HOME in the system environment') |
|
||||
|
|
||||
# jni requires the jvm |
|
||||
javaHome = conf.env['JAVA_HOME'][0] |
|
||||
|
|
||||
b = Build.BuildContext() |
|
||||
b.load_dirs(conf.srcdir, conf.blddir) |
|
||||
dir = b.root.find_dir(conf.env.JAVA_HOME[0] + '/include') |
|
||||
f = dir.ant_glob('**/(jni|jni_md).h', flat=False) |
|
||||
incDirs = [x.parent.abspath() for x in f] |
|
||||
|
|
||||
dir = b.root.find_dir(conf.env.JAVA_HOME[0]) |
|
||||
f = dir.ant_glob('**/*jvm.(so|dll)', flat=False) |
|
||||
libDirs = [x.parent.abspath() for x in f] or [javaHome] |
|
||||
|
|
||||
for i, d in enumerate(libDirs): |
|
||||
if conf.check(header_name='jni.h', define_name='HAVE_JNI_H', lib='jvm', |
|
||||
libpath=d, includes=incDirs, uselib_store='JAVA', uselib='JAVA'): |
|
||||
break |
|
||||
else: |
|
||||
conf.fatal('could not find lib jvm in %r (see config.log)' % libDirs) |
|
||||
|
|
@ -1,74 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# Thomas Nagy, 2006 (ita) |
|
||||
|
|
||||
import os, sys, re |
|
||||
import Options, TaskGen, Task, Utils |
|
||||
from TaskGen import taskgen, feature, after |
|
||||
|
|
||||
class msgfmt_taskgen(TaskGen.task_gen): |
|
||||
def __init__(self, *k, **kw): |
|
||||
TaskGen.task_gen.__init__(self, *k, **kw) |
|
||||
|
|
||||
@feature('msgfmt') |
|
||||
def init_msgfmt(self): |
|
||||
#langs = '' # for example "foo/fr foo/br" |
|
||||
self.default_install_path = '${KDE4_LOCALE_INSTALL_DIR}' |
|
||||
|
|
||||
@feature('msgfmt') |
|
||||
@after('init_msgfmt') |
|
||||
def apply_msgfmt(self): |
|
||||
for lang in self.to_list(self.langs): |
|
||||
node = self.path.find_resource(lang+'.po') |
|
||||
task = self.create_task('msgfmt', node, node.change_ext('.mo')) |
|
||||
|
|
||||
if not self.bld.is_install: continue |
|
||||
langname = lang.split('/') |
|
||||
langname = langname[-1] |
|
||||
task.install_path = self.install_path + os.sep + langname + os.sep + 'LC_MESSAGES' |
|
||||
task.filename = getattr(self, 'appname', 'set_your_appname') + '.mo' |
|
||||
task.chmod = self.chmod |
|
||||
|
|
||||
def detect(conf): |
|
||||
kdeconfig = conf.find_program('kde4-config') |
|
||||
if not kdeconfig: |
|
||||
conf.fatal('we need kde4-config') |
|
||||
prefix = Utils.cmd_output('%s --prefix' % kdeconfig, silent=True).strip() |
|
||||
file = '%s/share/apps/cmake/modules/KDELibsDependencies.cmake' % prefix |
|
||||
try: os.stat(file) |
|
||||
except OSError: |
|
||||
file = '%s/share/kde4/apps/cmake/modules/KDELibsDependencies.cmake' % prefix |
|
||||
try: os.stat(file) |
|
||||
except OSError: conf.fatal('could not open %s' % file) |
|
||||
|
|
||||
try: |
|
||||
txt = Utils.readf(file) |
|
||||
except (OSError, IOError): |
|
||||
conf.fatal('could not read %s' % file) |
|
||||
|
|
||||
txt = txt.replace('\\\n', '\n') |
|
||||
fu = re.compile('#(.*)\n') |
|
||||
txt = fu.sub('', txt) |
|
||||
|
|
||||
setregexp = re.compile('([sS][eE][tT]\s*\()\s*([^\s]+)\s+\"([^"]+)\"\)') |
|
||||
found = setregexp.findall(txt) |
|
||||
|
|
||||
for (_, key, val) in found: |
|
||||
#print key, val |
|
||||
conf.env[key] = val |
|
||||
|
|
||||
# well well, i could just write an interpreter for cmake files |
|
||||
conf.env['LIB_KDECORE']='kdecore' |
|
||||
conf.env['LIB_KDEUI'] ='kdeui' |
|
||||
conf.env['LIB_KIO'] ='kio' |
|
||||
conf.env['LIB_KHTML'] ='khtml' |
|
||||
conf.env['LIB_KPARTS'] ='kparts' |
|
||||
|
|
||||
conf.env['LIBPATH_KDECORE'] = conf.env['KDE4_LIB_INSTALL_DIR'] |
|
||||
conf.env['CPPPATH_KDECORE'] = conf.env['KDE4_INCLUDE_INSTALL_DIR'] |
|
||||
conf.env.append_value('CPPPATH_KDECORE', conf.env['KDE4_INCLUDE_INSTALL_DIR']+"/KDE") |
|
||||
|
|
||||
conf.env['MSGFMT'] = conf.find_program('msgfmt') |
|
||||
|
|
||||
Task.simple_task_type('msgfmt', '${MSGFMT} ${SRC} -o ${TGT}', color='BLUE', shell=False) |
|
||||
|
|
@ -1,25 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# Sebastian Schlingmann, 2008 |
|
||||
# Thomas Nagy, 2008 (ita) |
|
||||
|
|
||||
import TaskGen |
|
||||
from TaskGen import taskgen, feature |
|
||||
from Constants import * |
|
||||
|
|
||||
TaskGen.declare_chain( |
|
||||
name = 'luac', |
|
||||
rule = '${LUAC} -s -o ${TGT} ${SRC}', |
|
||||
ext_in = '.lua', |
|
||||
ext_out = '.luac', |
|
||||
reentrant = False, |
|
||||
install = 'LUADIR', # env variable |
|
||||
) |
|
||||
|
|
||||
@feature('lua') |
|
||||
def init_lua(self): |
|
||||
self.default_chmod = O755 |
|
||||
|
|
||||
def detect(conf): |
|
||||
conf.find_program('luac', var='LUAC', mandatory = True) |
|
||||
|
|
@ -1,792 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# Carlos Rafael Giani, 2006 (dv) |
|
||||
# Tamas Pal, 2007 (folti) |
|
||||
# Nicolas Mercier, 2009 |
|
||||
# Microsoft Visual C++/Intel C++ compiler support - beta, needs more testing |
|
||||
|
|
||||
# usage: |
|
||||
# |
|
||||
# conf.env['MSVC_VERSIONS'] = ['msvc 9.0', 'msvc 8.0', 'wsdk 7.0', 'intel 11', 'PocketPC 9.0', 'Smartphone 8.0'] |
|
||||
# conf.env['MSVC_TARGETS'] = ['x64'] |
|
||||
# conf.check_tool('msvc') |
|
||||
# OR conf.check_tool('msvc', funs='no_autodetect') |
|
||||
# conf.check_lib_msvc('gdi32') |
|
||||
# conf.check_libs_msvc('kernel32 user32', mandatory=true) |
|
||||
# ... |
|
||||
# obj.uselib = 'KERNEL32 USER32 GDI32' |
|
||||
# |
|
||||
# platforms and targets will be tested in the order they appear; |
|
||||
# the first good configuration will be used |
|
||||
# supported platforms : |
|
||||
# ia64, x64, x86, x86_amd64, x86_ia64 |
|
||||
|
|
||||
# compilers supported : |
|
||||
# msvc => Visual Studio, versions 7.1 (2003), 8,0 (2005), 9.0 (2008) |
|
||||
# wsdk => Windows SDK, versions 6.0, 6.1, 7.0 |
|
||||
# icl => Intel compiler, versions 9,10,11 |
|
||||
# Smartphone => Compiler/SDK for Smartphone devices (armv4/v4i) |
|
||||
# PocketPC => Compiler/SDK for PocketPC devices (armv4/v4i) |
|
||||
|
|
||||
|
|
||||
import os, sys, re, string, optparse |
|
||||
import Utils, TaskGen, Runner, Configure, Task, Options |
|
||||
from Logs import debug, info, warn, error |
|
||||
from TaskGen import after, before, feature |
|
||||
|
|
||||
from Configure import conftest, conf |
|
||||
import ccroot, cc, cxx, ar, winres |
|
||||
from libtool import read_la_file |
|
||||
|
|
||||
import _winreg |
|
||||
|
|
||||
pproc = Utils.pproc |
|
||||
|
|
||||
# importlibs provided by MSVC/Platform SDK. Do NOT search them.... |
|
||||
g_msvc_systemlibs = """ |
|
||||
aclui activeds ad1 adptif adsiid advapi32 asycfilt authz bhsupp bits bufferoverflowu cabinet |
|
||||
cap certadm certidl ciuuid clusapi comctl32 comdlg32 comsupp comsuppd comsuppw comsuppwd comsvcs |
|
||||
credui crypt32 cryptnet cryptui d3d8thk daouuid dbgeng dbghelp dciman32 ddao35 ddao35d |
|
||||
ddao35u ddao35ud delayimp dhcpcsvc dhcpsapi dlcapi dnsapi dsprop dsuiext dtchelp |
|
||||
faultrep fcachdll fci fdi framedyd framedyn gdi32 gdiplus glauxglu32 gpedit gpmuuid |
|
||||
gtrts32w gtrtst32hlink htmlhelp httpapi icm32 icmui imagehlp imm32 iphlpapi iprop |
|
||||
kernel32 ksguid ksproxy ksuser libcmt libcmtd libcpmt libcpmtd loadperf lz32 mapi |
|
||||
mapi32 mgmtapi minidump mmc mobsync mpr mprapi mqoa mqrt msacm32 mscms mscoree |
|
||||
msdasc msimg32 msrating mstask msvcmrt msvcurt msvcurtd mswsock msxml2 mtx mtxdm |
|
||||
netapi32 nmapinmsupp npptools ntdsapi ntdsbcli ntmsapi ntquery odbc32 odbcbcp |
|
||||
odbccp32 oldnames ole32 oleacc oleaut32 oledb oledlgolepro32 opends60 opengl32 |
|
||||
osptk parser pdh penter pgobootrun pgort powrprof psapi ptrustm ptrustmd ptrustu |
|
||||
ptrustud qosname rasapi32 rasdlg rassapi resutils riched20 rpcndr rpcns4 rpcrt4 rtm |
|
||||
rtutils runtmchk scarddlg scrnsave scrnsavw secur32 sensapi setupapi sfc shell32 |
|
||||
shfolder shlwapi sisbkup snmpapi sporder srclient sti strsafe svcguid tapi32 thunk32 |
|
||||
traffic unicows url urlmon user32 userenv usp10 uuid uxtheme vcomp vcompd vdmdbg |
|
||||
version vfw32 wbemuuid webpost wiaguid wininet winmm winscard winspool winstrm |
|
||||
wintrust wldap32 wmiutils wow32 ws2_32 wsnmp32 wsock32 wst wtsapi32 xaswitch xolehlp |
|
||||
""".split() |
|
||||
|
|
||||
|
|
||||
all_msvc_platforms = [ ('x64', 'amd64'), ('x86', 'x86'), ('ia64', 'ia64'), ('x86_amd64', 'amd64'), ('x86_ia64', 'ia64') ] |
|
||||
all_wince_platforms = [ ('armv4', 'arm'), ('armv4i', 'arm'), ('mipsii', 'mips'), ('mipsii_fp', 'mips'), ('mipsiv', 'mips'), ('mipsiv_fp', 'mips'), ('sh4', 'sh'), ('x86', 'cex86') ] |
|
||||
all_icl_platforms = [ ('intel64', 'amd64'), ('em64t', 'amd64'), ('ia32', 'x86'), ('Itanium', 'ia64')] |
|
||||
|
|
||||
def setup_msvc(conf, versions): |
|
||||
platforms = Utils.to_list(conf.env['MSVC_TARGETS']) or [i for i,j in all_msvc_platforms+all_icl_platforms+all_wince_platforms] |
|
||||
desired_versions = conf.env['MSVC_VERSIONS'] or [v for v,_ in versions][::-1] |
|
||||
versiondict = dict(versions) |
|
||||
|
|
||||
for version in desired_versions: |
|
||||
try: |
|
||||
targets = dict(versiondict [version]) |
|
||||
for target in platforms: |
|
||||
try: |
|
||||
arch,(p1,p2,p3) = targets[target] |
|
||||
compiler,revision = version.split() |
|
||||
return compiler,revision,p1,p2,p3 |
|
||||
except KeyError: continue |
|
||||
except KeyError: continue |
|
||||
conf.fatal('msvc: Impossible to find a valid architecture for building (in setup_msvc)') |
|
||||
|
|
||||
@conf |
|
||||
def get_msvc_version(conf, compiler, version, target, vcvars): |
|
||||
debug('msvc: get_msvc_version: %r %r %r', compiler, version, target) |
|
||||
batfile = os.path.join(conf.blddir, 'waf-print-msvc.bat') |
|
||||
f = open(batfile, 'w') |
|
||||
f.write("""@echo off |
|
||||
set INCLUDE= |
|
||||
set LIB= |
|
||||
call "%s" %s |
|
||||
echo PATH=%%PATH%% |
|
||||
echo INCLUDE=%%INCLUDE%% |
|
||||
echo LIB=%%LIB%% |
|
||||
""" % (vcvars,target)) |
|
||||
f.close() |
|
||||
sout = Utils.cmd_output(['cmd', '/E:on', '/V:on', '/C', batfile]) |
|
||||
lines = sout.splitlines() |
|
||||
|
|
||||
for x in ('Setting environment', 'Setting SDK environment', 'Intel(R) C++ Compiler'): |
|
||||
if lines[0].find(x) != -1: |
|
||||
break |
|
||||
else: |
|
||||
debug('msvc: get_msvc_version: %r %r %r -> not found', compiler, version, target) |
|
||||
conf.fatal('msvc: Impossible to find a valid architecture for building (in get_msvc_version)') |
|
||||
|
|
||||
for line in lines[1:]: |
|
||||
if line.startswith('PATH='): |
|
||||
path = line[5:] |
|
||||
MSVC_PATH = path.split(';') |
|
||||
elif line.startswith('INCLUDE='): |
|
||||
MSVC_INCDIR = [i for i in line[8:].split(';') if i] |
|
||||
elif line.startswith('LIB='): |
|
||||
MSVC_LIBDIR = [i for i in line[4:].split(';') if i] |
|
||||
|
|
||||
# Check if the compiler is usable at all. |
|
||||
# The detection may return 64-bit versions even on 32-bit systems, and these would fail to run. |
|
||||
env = {} |
|
||||
env.update(os.environ) |
|
||||
env.update(PATH = path) |
|
||||
compiler_name, linker_name, lib_name = _get_prog_names(conf, compiler) |
|
||||
cxx = conf.find_program(compiler_name, path_list=MSVC_PATH) |
|
||||
# delete CL if exists. because it could contain parameters wich can change cl's behaviour rather catastrophically. |
|
||||
if env.has_key('CL'): |
|
||||
del(env['CL']) |
|
||||
|
|
||||
try: |
|
||||
p = pproc.Popen([cxx, '/help'], env=env, stdout=pproc.PIPE, stderr=pproc.PIPE) |
|
||||
out, err = p.communicate() |
|
||||
if p.returncode != 0: |
|
||||
raise Exception('return code: %r: %r' % (p.returncode, err)) |
|
||||
except Exception, e: |
|
||||
debug('msvc: get_msvc_version: %r %r %r -> failure', compiler, version, target) |
|
||||
debug(str(e)) |
|
||||
conf.fatal('msvc: cannot run the compiler (in get_msvc_version)') |
|
||||
else: |
|
||||
debug('msvc: get_msvc_version: %r %r %r -> OK', compiler, version, target) |
|
||||
|
|
||||
return (MSVC_PATH, MSVC_INCDIR, MSVC_LIBDIR) |
|
||||
|
|
||||
@conf |
|
||||
def gather_wsdk_versions(conf, versions): |
|
||||
version_pattern = re.compile('^v..?.?\...?.?') |
|
||||
try: |
|
||||
all_versions = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Wow6432node\\Microsoft\\Microsoft SDKs\\Windows') |
|
||||
except WindowsError: |
|
||||
try: |
|
||||
all_versions = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows') |
|
||||
except WindowsError: |
|
||||
return |
|
||||
index = 0 |
|
||||
while 1: |
|
||||
try: |
|
||||
version = _winreg.EnumKey(all_versions, index) |
|
||||
except WindowsError: |
|
||||
break |
|
||||
index = index + 1 |
|
||||
if not version_pattern.match(version): |
|
||||
continue |
|
||||
try: |
|
||||
msvc_version = _winreg.OpenKey(all_versions, version) |
|
||||
path,type = _winreg.QueryValueEx(msvc_version,'InstallationFolder') |
|
||||
except WindowsError: |
|
||||
continue |
|
||||
if os.path.isfile(os.path.join(path, 'bin', 'SetEnv.cmd')): |
|
||||
targets = [] |
|
||||
for target,arch in all_msvc_platforms: |
|
||||
try: |
|
||||
targets.append((target, (arch, conf.get_msvc_version('wsdk', version, '/'+target, os.path.join(path, 'bin', 'SetEnv.cmd'))))) |
|
||||
except Configure.ConfigurationError: |
|
||||
pass |
|
||||
versions.append(('wsdk ' + version[1:], targets)) |
|
||||
|
|
||||
@conf |
|
||||
def gather_msvc_versions(conf, versions): |
|
||||
# checks SmartPhones SDKs |
|
||||
try: |
|
||||
ce_sdk = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Wow6432node\\Microsoft\\Windows CE Tools\\SDKs') |
|
||||
except WindowsError: |
|
||||
try: |
|
||||
ce_sdk = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Microsoft\\Windows CE Tools\\SDKs') |
|
||||
except WindowsError: |
|
||||
ce_sdk = '' |
|
||||
if ce_sdk: |
|
||||
supported_wince_platforms = [] |
|
||||
ce_index = 0 |
|
||||
while 1: |
|
||||
try: |
|
||||
sdk_device = _winreg.EnumKey(ce_sdk, ce_index) |
|
||||
except WindowsError: |
|
||||
break |
|
||||
ce_index = ce_index + 1 |
|
||||
sdk = _winreg.OpenKey(ce_sdk, sdk_device) |
|
||||
path,type = _winreg.QueryValueEx(sdk, 'SDKRootDir') |
|
||||
path=str(path) |
|
||||
path,device = os.path.split(path) |
|
||||
if not device: |
|
||||
path,device = os.path.split(path) |
|
||||
for arch,compiler in all_wince_platforms: |
|
||||
platforms = [] |
|
||||
if os.path.isdir(os.path.join(path, device, 'Lib', arch)): |
|
||||
platforms.append((arch, compiler, os.path.join(path, device, 'Include', arch), os.path.join(path, device, 'Lib', arch))) |
|
||||
if platforms: |
|
||||
supported_wince_platforms.append((device, platforms)) |
|
||||
# checks MSVC |
|
||||
version_pattern = re.compile('^..?\...?') |
|
||||
for vcver,vcvar in [('VCExpress','exp'), ('VisualStudio','')]: |
|
||||
try: |
|
||||
all_versions = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Wow6432node\\Microsoft\\'+vcver) |
|
||||
except WindowsError: |
|
||||
try: |
|
||||
all_versions = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Microsoft\\'+vcver) |
|
||||
except WindowsError: |
|
||||
continue |
|
||||
index = 0 |
|
||||
while 1: |
|
||||
try: |
|
||||
version = _winreg.EnumKey(all_versions, index) |
|
||||
except WindowsError: |
|
||||
break |
|
||||
index = index + 1 |
|
||||
if not version_pattern.match(version): |
|
||||
continue |
|
||||
try: |
|
||||
msvc_version = _winreg.OpenKey(all_versions, version + "\\Setup\\VS") |
|
||||
path,type = _winreg.QueryValueEx(msvc_version, 'ProductDir') |
|
||||
path=str(path) |
|
||||
targets = [] |
|
||||
if ce_sdk: |
|
||||
for device,platforms in supported_wince_platforms: |
|
||||
cetargets = [] |
|
||||
for platform,compiler,include,lib in platforms: |
|
||||
winCEpath = os.path.join(path, 'VC', 'ce') |
|
||||
if os.path.isdir(winCEpath): |
|
||||
common_bindirs,_1,_2 = conf.get_msvc_version('msvc', version, 'x86', os.path.join(path, 'Common7', 'Tools', 'vsvars32.bat')) |
|
||||
if os.path.isdir(os.path.join(winCEpath, 'lib', platform)): |
|
||||
bindirs = [os.path.join(winCEpath, 'bin', compiler), os.path.join(winCEpath, 'bin', 'x86_'+compiler)] + common_bindirs |
|
||||
incdirs = [include, os.path.join(winCEpath, 'include'), os.path.join(winCEpath, 'atlmfc', 'include')] |
|
||||
libdirs = [lib, os.path.join(winCEpath, 'lib', platform), os.path.join(winCEpath, 'atlmfc', 'lib', platform)] |
|
||||
cetargets.append((platform, (platform, (bindirs,incdirs,libdirs)))) |
|
||||
versions.append((device+' '+version, cetargets)) |
|
||||
if os.path.isfile(os.path.join(path, 'VC', 'vcvarsall.bat')): |
|
||||
for target,realtarget in all_msvc_platforms[::-1]: |
|
||||
try: |
|
||||
targets.append((target, (realtarget, conf.get_msvc_version('msvc', version, target, os.path.join(path, 'VC', 'vcvarsall.bat'))))) |
|
||||
except: |
|
||||
pass |
|
||||
elif os.path.isfile(os.path.join(path, 'Common7', 'Tools', 'vsvars32.bat')): |
|
||||
try: |
|
||||
targets.append(('x86', ('x86', conf.get_msvc_version('msvc', version, 'x86', os.path.join(path, 'Common7', 'Tools', 'vsvars32.bat'))))) |
|
||||
except Configure.ConfigurationError: |
|
||||
pass |
|
||||
versions.append(('msvc '+version, targets)) |
|
||||
|
|
||||
except WindowsError: |
|
||||
continue |
|
||||
|
|
||||
@conf |
|
||||
def gather_icl_versions(conf, versions): |
|
||||
version_pattern = re.compile('^...?.?\....?.?') |
|
||||
try: |
|
||||
all_versions = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Wow6432node\\Intel\\Compilers\\C++') |
|
||||
except WindowsError: |
|
||||
try: |
|
||||
all_versions = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Intel\\Compilers\\C++') |
|
||||
except WindowsError: |
|
||||
return |
|
||||
index = 0 |
|
||||
while 1: |
|
||||
try: |
|
||||
version = _winreg.EnumKey(all_versions, index) |
|
||||
except WindowsError: |
|
||||
break |
|
||||
index = index + 1 |
|
||||
if not version_pattern.match(version): |
|
||||
continue |
|
||||
targets = [] |
|
||||
for target,arch in all_icl_platforms: |
|
||||
try: |
|
||||
icl_version = _winreg.OpenKey(all_versions, version+'\\'+target) |
|
||||
path,type = _winreg.QueryValueEx(icl_version,'ProductDir') |
|
||||
if os.path.isfile(os.path.join(path, 'bin', 'iclvars.bat')): |
|
||||
try: |
|
||||
targets.append((target, (arch, conf.get_msvc_version('intel', version, target, os.path.join(path, 'bin', 'iclvars.bat'))))) |
|
||||
except Configure.ConfigurationError: |
|
||||
pass |
|
||||
except WindowsError: |
|
||||
continue |
|
||||
major = version[0:2] |
|
||||
versions.append(('intel ' + major, targets)) |
|
||||
|
|
||||
@conf |
|
||||
def get_msvc_versions(conf): |
|
||||
if not conf.env.MSVC_INSTALLED_VERSIONS: |
|
||||
lst = [] |
|
||||
conf.gather_msvc_versions(lst) |
|
||||
conf.gather_wsdk_versions(lst) |
|
||||
conf.gather_icl_versions(lst) |
|
||||
conf.env.MSVC_INSTALLED_VERSIONS = lst |
|
||||
return conf.env.MSVC_INSTALLED_VERSIONS |
|
||||
|
|
||||
@conf |
|
||||
def print_all_msvc_detected(conf): |
|
||||
for version,targets in conf.env['MSVC_INSTALLED_VERSIONS']: |
|
||||
info(version) |
|
||||
for target,l in targets: |
|
||||
info("\t"+target) |
|
||||
|
|
||||
def detect_msvc(conf): |
|
||||
versions = get_msvc_versions(conf) |
|
||||
return setup_msvc(conf, versions) |
|
||||
|
|
||||
@conf |
|
||||
def find_lt_names_msvc(self, libname, is_static=False): |
|
||||
""" |
|
||||
Win32/MSVC specific code to glean out information from libtool la files. |
|
||||
this function is not attached to the task_gen class |
|
||||
""" |
|
||||
lt_names=[ |
|
||||
'lib%s.la' % libname, |
|
||||
'%s.la' % libname, |
|
||||
] |
|
||||
|
|
||||
for path in self.env['LIBPATH']: |
|
||||
for la in lt_names: |
|
||||
laf=os.path.join(path,la) |
|
||||
dll=None |
|
||||
if os.path.exists(laf): |
|
||||
ltdict=read_la_file(laf) |
|
||||
lt_libdir=None |
|
||||
if ltdict.get('libdir', ''): |
|
||||
lt_libdir = ltdict['libdir'] |
|
||||
if not is_static and ltdict.get('library_names', ''): |
|
||||
dllnames=ltdict['library_names'].split() |
|
||||
dll=dllnames[0].lower() |
|
||||
dll=re.sub('\.dll$', '', dll) |
|
||||
return (lt_libdir, dll, False) |
|
||||
elif ltdict.get('old_library', ''): |
|
||||
olib=ltdict['old_library'] |
|
||||
if os.path.exists(os.path.join(path,olib)): |
|
||||
return (path, olib, True) |
|
||||
elif lt_libdir != '' and os.path.exists(os.path.join(lt_libdir,olib)): |
|
||||
return (lt_libdir, olib, True) |
|
||||
else: |
|
||||
return (None, olib, True) |
|
||||
else: |
|
||||
raise Utils.WafError('invalid libtool object file: %s' % laf) |
|
||||
return (None, None, None) |
|
||||
|
|
||||
@conf |
|
||||
def libname_msvc(self, libname, is_static=False, mandatory=False): |
|
||||
lib = libname.lower() |
|
||||
lib = re.sub('\.lib$','',lib) |
|
||||
|
|
||||
if lib in g_msvc_systemlibs: |
|
||||
return lib |
|
||||
|
|
||||
lib=re.sub('^lib','',lib) |
|
||||
|
|
||||
if lib == 'm': |
|
||||
return None |
|
||||
|
|
||||
(lt_path, lt_libname, lt_static) = self.find_lt_names_msvc(lib, is_static) |
|
||||
|
|
||||
if lt_path != None and lt_libname != None: |
|
||||
if lt_static == True: |
|
||||
# file existance check has been made by find_lt_names |
|
||||
return os.path.join(lt_path,lt_libname) |
|
||||
|
|
||||
if lt_path != None: |
|
||||
_libpaths=[lt_path] + self.env['LIBPATH'] |
|
||||
else: |
|
||||
_libpaths=self.env['LIBPATH'] |
|
||||
|
|
||||
static_libs=[ |
|
||||
'lib%ss.lib' % lib, |
|
||||
'lib%s.lib' % lib, |
|
||||
'%ss.lib' % lib, |
|
||||
'%s.lib' %lib, |
|
||||
] |
|
||||
|
|
||||
dynamic_libs=[ |
|
||||
'lib%s.dll.lib' % lib, |
|
||||
'lib%s.dll.a' % lib, |
|
||||
'%s.dll.lib' % lib, |
|
||||
'%s.dll.a' % lib, |
|
||||
'lib%s_d.lib' % lib, |
|
||||
'%s_d.lib' % lib, |
|
||||
'%s.lib' %lib, |
|
||||
] |
|
||||
|
|
||||
libnames=static_libs |
|
||||
if not is_static: |
|
||||
libnames=dynamic_libs + static_libs |
|
||||
|
|
||||
for path in _libpaths: |
|
||||
for libn in libnames: |
|
||||
if os.path.exists(os.path.join(path, libn)): |
|
||||
debug('msvc: lib found: %s', os.path.join(path,libn)) |
|
||||
return re.sub('\.lib$', '',libn) |
|
||||
|
|
||||
#if no lib can be found, just return the libname as msvc expects it |
|
||||
if mandatory: |
|
||||
self.fatal("The library %r could not be found" % libname) |
|
||||
return re.sub('\.lib$', '', libname) |
|
||||
|
|
||||
@conf |
|
||||
def check_lib_msvc(self, libname, is_static=False, uselib_store=None, mandatory=False): |
|
||||
"This is the api to use" |
|
||||
libn = self.libname_msvc(libname, is_static, mandatory) |
|
||||
|
|
||||
if not uselib_store: |
|
||||
uselib_store = libname.upper() |
|
||||
|
|
||||
# Note: ideally we should be able to place the lib in the right env var, either STATICLIB or LIB, |
|
||||
# but we don't distinguish static libs from shared libs. |
|
||||
# This is ok since msvc doesn't have any special linker flag to select static libs (no env['STATICLIB_MARKER']) |
|
||||
if False and is_static: # disabled |
|
||||
self.env['STATICLIB_' + uselib_store] = [libn] |
|
||||
else: |
|
||||
self.env['LIB_' + uselib_store] = [libn] |
|
||||
|
|
||||
@conf |
|
||||
def check_libs_msvc(self, libnames, is_static=False, mandatory=False): |
|
||||
for libname in Utils.to_list(libnames): |
|
||||
self.check_lib_msvc(libname, is_static, mandatory=mandatory) |
|
||||
|
|
||||
@conftest |
|
||||
def no_autodetect(conf): |
|
||||
conf.eval_rules(detect.replace('autodetect', '')) |
|
||||
|
|
||||
|
|
||||
detect = ''' |
|
||||
autodetect |
|
||||
find_msvc |
|
||||
msvc_common_flags |
|
||||
cc_load_tools |
|
||||
cxx_load_tools |
|
||||
cc_add_flags |
|
||||
cxx_add_flags |
|
||||
link_add_flags |
|
||||
''' |
|
||||
|
|
||||
@conftest |
|
||||
def autodetect(conf): |
|
||||
v = conf.env |
|
||||
compiler, version, path, includes, libdirs = detect_msvc(conf) |
|
||||
v['PATH'] = path |
|
||||
v['CPPPATH'] = includes |
|
||||
v['LIBPATH'] = libdirs |
|
||||
v['MSVC_COMPILER'] = compiler |
|
||||
|
|
||||
def _get_prog_names(conf, compiler): |
|
||||
if compiler=='intel': |
|
||||
compiler_name = 'ICL' |
|
||||
linker_name = 'XILINK' |
|
||||
lib_name = 'XILIB' |
|
||||
else: |
|
||||
# assumes CL.exe |
|
||||
compiler_name = 'CL' |
|
||||
linker_name = 'LINK' |
|
||||
lib_name = 'LIB' |
|
||||
return compiler_name, linker_name, lib_name |
|
||||
|
|
||||
@conftest |
|
||||
def find_msvc(conf): |
|
||||
# due to path format limitations, limit operation only to native Win32. Yeah it sucks. |
|
||||
if sys.platform != 'win32': |
|
||||
conf.fatal('MSVC module only works under native Win32 Python! cygwin is not supported yet') |
|
||||
|
|
||||
v = conf.env |
|
||||
|
|
||||
compiler, version, path, includes, libdirs = detect_msvc(conf) |
|
||||
|
|
||||
compiler_name, linker_name, lib_name = _get_prog_names(conf, compiler) |
|
||||
has_msvc_manifest = (compiler == 'msvc' and float(version) >= 8) or (compiler == 'wsdk' and float(version) >= 6) or (compiler == 'intel' and float(version) >= 11) |
|
||||
|
|
||||
# compiler |
|
||||
cxx = None |
|
||||
if v.CXX: cxx = v.CXX |
|
||||
elif 'CXX' in conf.environ: cxx = conf.environ['CXX'] |
|
||||
if not cxx: cxx = conf.find_program(compiler_name, var='CXX', path_list=path, mandatory=True) |
|
||||
cxx = conf.cmd_to_list(cxx) |
|
||||
|
|
||||
# before setting anything, check if the compiler is really msvc |
|
||||
env = dict(conf.environ) |
|
||||
env.update(PATH = ';'.join(path)) |
|
||||
if not Utils.cmd_output([cxx, '/nologo', '/?'], silent=True, env=env): |
|
||||
conf.fatal('the msvc compiler could not be identified') |
|
||||
|
|
||||
link = v.LINK_CXX |
|
||||
if not link: |
|
||||
link = conf.find_program(linker_name, path_list=path, mandatory=True) |
|
||||
ar = v.AR |
|
||||
if not ar: |
|
||||
ar = conf.find_program(lib_name, path_list=path, mandatory=True) |
|
||||
|
|
||||
# manifest tool. Not required for VS 2003 and below. Must have for VS 2005 and later |
|
||||
mt = v.MT |
|
||||
if has_msvc_manifest: |
|
||||
mt = conf.find_program('MT', path_list=path, mandatory=True) |
|
||||
|
|
||||
# no more possibility of failure means the data state will be consistent |
|
||||
# we may store the data safely now |
|
||||
|
|
||||
v.MSVC_MANIFEST = has_msvc_manifest |
|
||||
v.PATH = path |
|
||||
v.CPPPATH = includes |
|
||||
v.LIBPATH = libdirs |
|
||||
|
|
||||
# c/c++ compiler |
|
||||
v.CC = v.CXX = cxx |
|
||||
v.CC_NAME = v.CXX_NAME = 'msvc' |
|
||||
|
|
||||
v.LINK = v.LINK_CXX = link |
|
||||
if not v.LINK_CC: |
|
||||
v.LINK_CC = v.LINK_CXX |
|
||||
|
|
||||
v.AR = ar |
|
||||
v.MT = mt |
|
||||
v.MTFLAGS = v.ARFLAGS = ['/NOLOGO'] |
|
||||
|
|
||||
|
|
||||
conf.check_tool('winres') |
|
||||
|
|
||||
if not conf.env.WINRC: |
|
||||
warn('Resource compiler not found. Compiling resource file is disabled') |
|
||||
|
|
||||
# environment flags |
|
||||
try: v.prepend_value('CPPPATH', conf.environ['INCLUDE']) |
|
||||
except KeyError: pass |
|
||||
try: v.prepend_value('LIBPATH', conf.environ['LIB']) |
|
||||
except KeyError: pass |
|
||||
|
|
||||
@conftest |
|
||||
def msvc_common_flags(conf): |
|
||||
v = conf.env |
|
||||
|
|
||||
v['CPPFLAGS'] = ['/W3', '/nologo'] |
|
||||
|
|
||||
v['CCDEFINES_ST'] = '/D%s' |
|
||||
v['CXXDEFINES_ST'] = '/D%s' |
|
||||
|
|
||||
# TODO just use _WIN32, which defined by the compiler itself! |
|
||||
v['CCDEFINES'] = ['WIN32'] # avoid using this, any compiler predefines the _WIN32 marcro anyway |
|
||||
v['CXXDEFINES'] = ['WIN32'] # avoid using this, any compiler predefines the _WIN32 marcro anyway |
|
||||
|
|
||||
v['_CCINCFLAGS'] = [] |
|
||||
v['_CCDEFFLAGS'] = [] |
|
||||
v['_CXXINCFLAGS'] = [] |
|
||||
v['_CXXDEFFLAGS'] = [] |
|
||||
|
|
||||
v['CC_SRC_F'] = '' |
|
||||
v['CC_TGT_F'] = ['/c', '/Fo'] |
|
||||
v['CXX_SRC_F'] = '' |
|
||||
v['CXX_TGT_F'] = ['/c', '/Fo'] |
|
||||
|
|
||||
v['CPPPATH_ST'] = '/I%s' # template for adding include paths |
|
||||
|
|
||||
v['AR_TGT_F'] = v['CCLNK_TGT_F'] = v['CXXLNK_TGT_F'] = '/OUT:' |
|
||||
|
|
||||
# Subsystem specific flags |
|
||||
v['CPPFLAGS_CONSOLE'] = ['/SUBSYSTEM:CONSOLE'] |
|
||||
v['CPPFLAGS_NATIVE'] = ['/SUBSYSTEM:NATIVE'] |
|
||||
v['CPPFLAGS_POSIX'] = ['/SUBSYSTEM:POSIX'] |
|
||||
v['CPPFLAGS_WINDOWS'] = ['/SUBSYSTEM:WINDOWS'] |
|
||||
v['CPPFLAGS_WINDOWSCE'] = ['/SUBSYSTEM:WINDOWSCE'] |
|
||||
|
|
||||
# CRT specific flags |
|
||||
v['CPPFLAGS_CRT_MULTITHREADED'] = ['/MT'] |
|
||||
v['CPPFLAGS_CRT_MULTITHREADED_DLL'] = ['/MD'] |
|
||||
|
|
||||
# TODO these are defined by the compiler itself! |
|
||||
v['CPPDEFINES_CRT_MULTITHREADED'] = ['_MT'] # this is defined by the compiler itself! |
|
||||
v['CPPDEFINES_CRT_MULTITHREADED_DLL'] = ['_MT', '_DLL'] # these are defined by the compiler itself! |
|
||||
|
|
||||
v['CPPFLAGS_CRT_MULTITHREADED_DBG'] = ['/MTd'] |
|
||||
v['CPPFLAGS_CRT_MULTITHREADED_DLL_DBG'] = ['/MDd'] |
|
||||
|
|
||||
# TODO these are defined by the compiler itself! |
|
||||
v['CPPDEFINES_CRT_MULTITHREADED_DBG'] = ['_DEBUG', '_MT'] # these are defined by the compiler itself! |
|
||||
v['CPPDEFINES_CRT_MULTITHREADED_DLL_DBG'] = ['_DEBUG', '_MT', '_DLL'] # these are defined by the compiler itself! |
|
||||
|
|
||||
# compiler debug levels |
|
||||
v['CCFLAGS'] = ['/TC'] |
|
||||
v['CCFLAGS_OPTIMIZED'] = ['/O2', '/DNDEBUG'] |
|
||||
v['CCFLAGS_RELEASE'] = ['/O2', '/DNDEBUG'] |
|
||||
v['CCFLAGS_DEBUG'] = ['/Od', '/RTC1', '/ZI'] |
|
||||
v['CCFLAGS_ULTRADEBUG'] = ['/Od', '/RTC1', '/ZI'] |
|
||||
|
|
||||
v['CXXFLAGS'] = ['/TP', '/EHsc'] |
|
||||
v['CXXFLAGS_OPTIMIZED'] = ['/O2', '/DNDEBUG'] |
|
||||
v['CXXFLAGS_RELEASE'] = ['/O2', '/DNDEBUG'] |
|
||||
|
|
||||
v['CXXFLAGS_DEBUG'] = ['/Od', '/RTC1', '/ZI'] |
|
||||
v['CXXFLAGS_ULTRADEBUG'] = ['/Od', '/RTC1', '/ZI'] |
|
||||
|
|
||||
# linker |
|
||||
v['LIB'] = [] |
|
||||
|
|
||||
v['LIB_ST'] = '%s.lib' # template for adding libs |
|
||||
v['LIBPATH_ST'] = '/LIBPATH:%s' # template for adding libpaths |
|
||||
v['STATICLIB_ST'] = 'lib%s.lib' # Note: to be able to distinguish between a static lib and a dll import lib, it's a good pratice to name the static lib 'lib%s.lib' and the dll import lib '%s.lib' |
|
||||
v['STATICLIBPATH_ST'] = '/LIBPATH:%s' |
|
||||
|
|
||||
v['LINKFLAGS'] = ['/NOLOGO', '/MANIFEST'] |
|
||||
v['LINKFLAGS_DEBUG'] = ['/DEBUG'] |
|
||||
v['LINKFLAGS_ULTRADEBUG'] = ['/DEBUG'] |
|
||||
|
|
||||
# shared library |
|
||||
v['shlib_CCFLAGS'] = [''] |
|
||||
v['shlib_CXXFLAGS'] = [''] |
|
||||
v['shlib_LINKFLAGS']= ['/DLL'] |
|
||||
v['shlib_PATTERN'] = '%s.dll' |
|
||||
v['implib_PATTERN'] = '%s.lib' |
|
||||
v['IMPLIB_ST'] = '/IMPLIB:%s' |
|
||||
|
|
||||
# static library |
|
||||
v['staticlib_LINKFLAGS'] = [''] |
|
||||
v['staticlib_PATTERN'] = 'lib%s.lib' # Note: to be able to distinguish between a static lib and a dll import lib, it's a good pratice to name the static lib 'lib%s.lib' and the dll import lib '%s.lib' |
|
||||
|
|
||||
# program |
|
||||
v['program_PATTERN'] = '%s.exe' |
|
||||
|
|
||||
|
|
||||
####################################################################################################### |
|
||||
##### conf above, build below |
|
||||
|
|
||||
@after('apply_link') |
|
||||
@feature('cc', 'cxx') |
|
||||
def apply_flags_msvc(self): |
|
||||
if self.env.CC_NAME != 'msvc' or not self.link_task: |
|
||||
return |
|
||||
|
|
||||
subsystem = getattr(self, 'subsystem', '') |
|
||||
if subsystem: |
|
||||
subsystem = '/subsystem:%s' % subsystem |
|
||||
flags = 'cstaticlib' in self.features and 'ARFLAGS' or 'LINKFLAGS' |
|
||||
self.env.append_value(flags, subsystem) |
|
||||
|
|
||||
if getattr(self, 'link_task', None) and not 'cstaticlib' in self.features: |
|
||||
for f in self.env.LINKFLAGS: |
|
||||
d = f.lower() |
|
||||
if d[1:] == 'debug': |
|
||||
pdbnode = self.link_task.outputs[0].change_ext('.pdb') |
|
||||
pdbfile = pdbnode.bldpath(self.env) |
|
||||
self.link_task.outputs.append(pdbnode) |
|
||||
self.bld.install_files(self.install_path, [pdbnode], env=self.env) |
|
||||
break |
|
||||
|
|
||||
@feature('cprogram', 'cshlib', 'cstaticlib') |
|
||||
@after('apply_lib_vars') |
|
||||
@before('apply_obj_vars') |
|
||||
def apply_obj_vars_msvc(self): |
|
||||
if self.env['CC_NAME'] != 'msvc': |
|
||||
return |
|
||||
|
|
||||
try: |
|
||||
self.meths.remove('apply_obj_vars') |
|
||||
except ValueError: |
|
||||
pass |
|
||||
|
|
||||
libpaths = getattr(self, 'libpaths', []) |
|
||||
if not libpaths: self.libpaths = libpaths |
|
||||
|
|
||||
env = self.env |
|
||||
app = env.append_unique |
|
||||
|
|
||||
cpppath_st = env['CPPPATH_ST'] |
|
||||
lib_st = env['LIB_ST'] |
|
||||
staticlib_st = env['STATICLIB_ST'] |
|
||||
libpath_st = env['LIBPATH_ST'] |
|
||||
staticlibpath_st = env['STATICLIBPATH_ST'] |
|
||||
|
|
||||
for i in env['LIBPATH']: |
|
||||
app('LINKFLAGS', libpath_st % i) |
|
||||
if not libpaths.count(i): |
|
||||
libpaths.append(i) |
|
||||
|
|
||||
for i in env['LIBPATH']: |
|
||||
app('LINKFLAGS', staticlibpath_st % i) |
|
||||
if not libpaths.count(i): |
|
||||
libpaths.append(i) |
|
||||
|
|
||||
# i doubt that anyone will make a fully static binary anyway |
|
||||
if not env['FULLSTATIC']: |
|
||||
if env['STATICLIB'] or env['LIB']: |
|
||||
app('LINKFLAGS', env['SHLIB_MARKER']) # TODO does SHLIB_MARKER work? |
|
||||
|
|
||||
for i in env['STATICLIB']: |
|
||||
app('LINKFLAGS', staticlib_st % i) |
|
||||
|
|
||||
for i in env['LIB']: |
|
||||
app('LINKFLAGS', lib_st % i) |
|
||||
|
|
||||
# split the manifest file processing from the link task, like for the rc processing |
|
||||
|
|
||||
@feature('cprogram', 'cshlib') |
|
||||
@after('apply_link') |
|
||||
def apply_manifest(self): |
|
||||
"""Special linker for MSVC with support for embedding manifests into DLL's |
|
||||
and executables compiled by Visual Studio 2005 or probably later. Without |
|
||||
the manifest file, the binaries are unusable. |
|
||||
See: http://msdn2.microsoft.com/en-us/library/ms235542(VS.80).aspx""" |
|
||||
|
|
||||
if self.env.CC_NAME == 'msvc' and self.env.MSVC_MANIFEST: |
|
||||
out_node = self.link_task.outputs[0] |
|
||||
man_node = out_node.parent.find_or_declare(out_node.name + '.manifest') |
|
||||
self.link_task.outputs.append(man_node) |
|
||||
self.link_task.do_manifest = True |
|
||||
|
|
||||
def exec_mf(self): |
|
||||
env = self.env |
|
||||
mtool = env['MT'] |
|
||||
if not mtool: |
|
||||
return 0 |
|
||||
|
|
||||
self.do_manifest = False |
|
||||
|
|
||||
outfile = self.outputs[0].bldpath(env) |
|
||||
|
|
||||
manifest = None |
|
||||
for out_node in self.outputs: |
|
||||
if out_node.name.endswith('.manifest'): |
|
||||
manifest = out_node.bldpath(env) |
|
||||
break |
|
||||
if manifest is None: |
|
||||
# Should never get here. If we do, it means the manifest file was |
|
||||
# never added to the outputs list, thus we don't have a manifest file |
|
||||
# to embed, so we just return. |
|
||||
return 0 |
|
||||
|
|
||||
# embedding mode. Different for EXE's and DLL's. |
|
||||
# see: http://msdn2.microsoft.com/en-us/library/ms235591(VS.80).aspx |
|
||||
mode = '' |
|
||||
if 'cprogram' in self.generator.features: |
|
||||
mode = '1' |
|
||||
elif 'cshlib' in self.generator.features: |
|
||||
mode = '2' |
|
||||
|
|
||||
debug('msvc: embedding manifest') |
|
||||
#flags = ' '.join(env['MTFLAGS'] or []) |
|
||||
|
|
||||
lst = [] |
|
||||
lst.extend([env['MT']]) |
|
||||
lst.extend(Utils.to_list(env['MTFLAGS'])) |
|
||||
lst.extend(Utils.to_list("-manifest")) |
|
||||
lst.extend(Utils.to_list(manifest)) |
|
||||
lst.extend(Utils.to_list("-outputresource:%s;%s" % (outfile, mode))) |
|
||||
|
|
||||
#cmd='%s %s -manifest "%s" -outputresource:"%s";#%s' % (mtool, flags, |
|
||||
# manifest, outfile, mode) |
|
||||
lst = [lst] |
|
||||
return self.exec_command(*lst) |
|
||||
|
|
||||
########## stupid evil command modification: concatenate the tokens /Fx, /doc, and /x: with the next token |
|
||||
|
|
||||
def exec_command_msvc(self, *k, **kw): |
|
||||
"instead of quoting all the paths and keep using the shell, we can just join the options msvc is interested in" |
|
||||
if self.env['CC_NAME'] == 'msvc': |
|
||||
if isinstance(k[0], list): |
|
||||
lst = [] |
|
||||
carry = '' |
|
||||
for a in k[0]: |
|
||||
if len(a) == 3 and a.startswith('/F') or a == '/doc' or a[-1] == ':': |
|
||||
carry = a |
|
||||
else: |
|
||||
lst.append(carry + a) |
|
||||
carry = '' |
|
||||
k = [lst] |
|
||||
|
|
||||
env = dict(os.environ) |
|
||||
env.update(PATH = ';'.join(self.env['PATH'])) |
|
||||
kw['env'] = env |
|
||||
|
|
||||
ret = self.generator.bld.exec_command(*k, **kw) |
|
||||
if ret: return ret |
|
||||
if getattr(self, 'do_manifest', None): |
|
||||
ret = exec_mf(self) |
|
||||
return ret |
|
||||
|
|
||||
for k in 'cc cxx winrc cc_link cxx_link static_link qxx'.split(): |
|
||||
cls = Task.TaskBase.classes.get(k, None) |
|
||||
if cls: |
|
||||
cls.exec_command = exec_command_msvc |
|
||||
|
|
@ -1,298 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# Thomas Nagy, 2006 (ita) |
|
||||
|
|
||||
"ocaml support" |
|
||||
|
|
||||
import os, re |
|
||||
import TaskGen, Utils, Task, Build |
|
||||
from Logs import error |
|
||||
from TaskGen import taskgen, feature, before, after, extension |
|
||||
|
|
||||
EXT_MLL = ['.mll'] |
|
||||
EXT_MLY = ['.mly'] |
|
||||
EXT_MLI = ['.mli'] |
|
||||
EXT_MLC = ['.c'] |
|
||||
EXT_ML = ['.ml'] |
|
||||
|
|
||||
open_re = re.compile('^\s*open\s+([a-zA-Z]+)(;;){0,1}$', re.M) |
|
||||
foo = re.compile(r"""(\(\*)|(\*\))|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^()*"'\\]*)""", re.M) |
|
||||
def filter_comments(txt): |
|
||||
meh = [0] |
|
||||
def repl(m): |
|
||||
if m.group(1): meh[0] += 1 |
|
||||
elif m.group(2): meh[0] -= 1 |
|
||||
elif not meh[0]: return m.group(0) |
|
||||
return '' |
|
||||
return foo.sub(repl, txt) |
|
||||
|
|
||||
def scan(self): |
|
||||
node = self.inputs[0] |
|
||||
code = filter_comments(node.read(self.env)) |
|
||||
|
|
||||
global open_re |
|
||||
names = [] |
|
||||
import_iterator = open_re.finditer(code) |
|
||||
if import_iterator: |
|
||||
for import_match in import_iterator: |
|
||||
names.append(import_match.group(1)) |
|
||||
found_lst = [] |
|
||||
raw_lst = [] |
|
||||
for name in names: |
|
||||
nd = None |
|
||||
for x in self.incpaths: |
|
||||
nd = x.find_resource(name.lower()+'.ml') |
|
||||
if not nd: nd = x.find_resource(name+'.ml') |
|
||||
if nd: |
|
||||
found_lst.append(nd) |
|
||||
break |
|
||||
else: |
|
||||
raw_lst.append(name) |
|
||||
|
|
||||
return (found_lst, raw_lst) |
|
||||
|
|
||||
native_lst=['native', 'all', 'c_object'] |
|
||||
bytecode_lst=['bytecode', 'all'] |
|
||||
class ocaml_taskgen(TaskGen.task_gen): |
|
||||
def __init__(self, *k, **kw): |
|
||||
TaskGen.task_gen.__init__(self, *k, **kw) |
|
||||
|
|
||||
@feature('ocaml') |
|
||||
def init_ml(self): |
|
||||
Utils.def_attrs(self, |
|
||||
type = 'all', |
|
||||
incpaths_lst = [], |
|
||||
bld_incpaths_lst = [], |
|
||||
mlltasks = [], |
|
||||
mlytasks = [], |
|
||||
mlitasks = [], |
|
||||
native_tasks = [], |
|
||||
bytecode_tasks = [], |
|
||||
linktasks = [], |
|
||||
bytecode_env = None, |
|
||||
native_env = None, |
|
||||
compiled_tasks = [], |
|
||||
includes = '', |
|
||||
uselib = '', |
|
||||
are_deps_set = 0) |
|
||||
|
|
||||
@feature('ocaml') |
|
||||
@after('init_ml') |
|
||||
def init_envs_ml(self): |
|
||||
|
|
||||
self.islibrary = getattr(self, 'islibrary', False) |
|
||||
|
|
||||
global native_lst, bytecode_lst |
|
||||
self.native_env = None |
|
||||
if self.type in native_lst: |
|
||||
self.native_env = self.env.copy() |
|
||||
if self.islibrary: self.native_env['OCALINKFLAGS'] = '-a' |
|
||||
|
|
||||
self.bytecode_env = None |
|
||||
if self.type in bytecode_lst: |
|
||||
self.bytecode_env = self.env.copy() |
|
||||
if self.islibrary: self.bytecode_env['OCALINKFLAGS'] = '-a' |
|
||||
|
|
||||
if self.type == 'c_object': |
|
||||
self.native_env.append_unique('OCALINKFLAGS_OPT', '-output-obj') |
|
||||
|
|
||||
@feature('ocaml') |
|
||||
@before('apply_vars_ml') |
|
||||
@after('init_envs_ml') |
|
||||
def apply_incpaths_ml(self): |
|
||||
inc_lst = self.includes.split() |
|
||||
lst = self.incpaths_lst |
|
||||
for dir in inc_lst: |
|
||||
node = self.path.find_dir(dir) |
|
||||
if not node: |
|
||||
error("node not found: " + str(dir)) |
|
||||
continue |
|
||||
self.bld.rescan(node) |
|
||||
if not node in lst: lst.append(node) |
|
||||
self.bld_incpaths_lst.append(node) |
|
||||
# now the nodes are added to self.incpaths_lst |
|
||||
|
|
||||
@feature('ocaml') |
|
||||
@before('apply_core') |
|
||||
def apply_vars_ml(self): |
|
||||
for i in self.incpaths_lst: |
|
||||
if self.bytecode_env: |
|
||||
app = self.bytecode_env.append_value |
|
||||
app('OCAMLPATH', '-I') |
|
||||
app('OCAMLPATH', i.srcpath(self.env)) |
|
||||
app('OCAMLPATH', '-I') |
|
||||
app('OCAMLPATH', i.bldpath(self.env)) |
|
||||
|
|
||||
if self.native_env: |
|
||||
app = self.native_env.append_value |
|
||||
app('OCAMLPATH', '-I') |
|
||||
app('OCAMLPATH', i.bldpath(self.env)) |
|
||||
app('OCAMLPATH', '-I') |
|
||||
app('OCAMLPATH', i.srcpath(self.env)) |
|
||||
|
|
||||
varnames = ['INCLUDES', 'OCAMLFLAGS', 'OCALINKFLAGS', 'OCALINKFLAGS_OPT'] |
|
||||
for name in self.uselib.split(): |
|
||||
for vname in varnames: |
|
||||
cnt = self.env[vname+'_'+name] |
|
||||
if cnt: |
|
||||
if self.bytecode_env: self.bytecode_env.append_value(vname, cnt) |
|
||||
if self.native_env: self.native_env.append_value(vname, cnt) |
|
||||
|
|
||||
@feature('ocaml') |
|
||||
@after('apply_core') |
|
||||
def apply_link_ml(self): |
|
||||
|
|
||||
if self.bytecode_env: |
|
||||
ext = self.islibrary and '.cma' or '.run' |
|
||||
|
|
||||
linktask = self.create_task('ocalink') |
|
||||
linktask.bytecode = 1 |
|
||||
linktask.set_outputs(self.path.find_or_declare(self.target + ext)) |
|
||||
linktask.obj = self |
|
||||
linktask.env = self.bytecode_env |
|
||||
self.linktasks.append(linktask) |
|
||||
|
|
||||
if self.native_env: |
|
||||
if self.type == 'c_object': ext = '.o' |
|
||||
elif self.islibrary: ext = '.cmxa' |
|
||||
else: ext = '' |
|
||||
|
|
||||
linktask = self.create_task('ocalinkx') |
|
||||
linktask.set_outputs(self.path.find_or_declare(self.target + ext)) |
|
||||
linktask.obj = self |
|
||||
linktask.env = self.native_env |
|
||||
self.linktasks.append(linktask) |
|
||||
|
|
||||
# we produce a .o file to be used by gcc |
|
||||
self.compiled_tasks.append(linktask) |
|
||||
|
|
||||
@extension(EXT_MLL) |
|
||||
def mll_hook(self, node): |
|
||||
mll_task = self.create_task('ocamllex', node, node.change_ext('.ml'), env=self.native_env) |
|
||||
self.mlltasks.append(mll_task) |
|
||||
|
|
||||
self.allnodes.append(mll_task.outputs[0]) |
|
||||
|
|
||||
@extension(EXT_MLY) |
|
||||
def mly_hook(self, node): |
|
||||
mly_task = self.create_task('ocamlyacc', node, [node.change_ext('.ml'), node.change_ext('.mli')], env=self.native_env) |
|
||||
self.mlytasks.append(mly_task) |
|
||||
self.allnodes.append(mly_task.outputs[0]) |
|
||||
|
|
||||
task = self.create_task('ocamlcmi', mly_task.outputs[1], mly_task.outputs[1].change_ext('.cmi'), env=self.native_env) |
|
||||
|
|
||||
@extension(EXT_MLI) |
|
||||
def mli_hook(self, node): |
|
||||
task = self.create_task('ocamlcmi', node, node.change_ext('.cmi'), env=self.native_env) |
|
||||
self.mlitasks.append(task) |
|
||||
|
|
||||
@extension(EXT_MLC) |
|
||||
def mlc_hook(self, node): |
|
||||
task = self.create_task('ocamlcc', node, node.change_ext('.o'), env=self.native_env) |
|
||||
self.compiled_tasks.append(task) |
|
||||
|
|
||||
@extension(EXT_ML) |
|
||||
def ml_hook(self, node): |
|
||||
if self.native_env: |
|
||||
task = self.create_task('ocamlx', node, node.change_ext('.cmx'), env=self.native_env) |
|
||||
task.obj = self |
|
||||
task.incpaths = self.bld_incpaths_lst |
|
||||
self.native_tasks.append(task) |
|
||||
|
|
||||
if self.bytecode_env: |
|
||||
task = self.create_task('ocaml', node, node.change_ext('.cmo'), env=self.bytecode_env) |
|
||||
task.obj = self |
|
||||
task.bytecode = 1 |
|
||||
task.incpaths = self.bld_incpaths_lst |
|
||||
self.bytecode_tasks.append(task) |
|
||||
|
|
||||
def compile_may_start(self): |
|
||||
if not getattr(self, 'flag_deps', ''): |
|
||||
self.flag_deps = 1 |
|
||||
|
|
||||
# the evil part is that we can only compute the dependencies after the |
|
||||
# source files can be read (this means actually producing the source files) |
|
||||
if getattr(self, 'bytecode', ''): alltasks = self.obj.bytecode_tasks |
|
||||
else: alltasks = self.obj.native_tasks |
|
||||
|
|
||||
self.signature() # ensure that files are scanned - unfortunately |
|
||||
tree = self.generator.bld |
|
||||
env = self.env |
|
||||
for node in self.inputs: |
|
||||
lst = tree.node_deps[self.unique_id()] |
|
||||
for depnode in lst: |
|
||||
for t in alltasks: |
|
||||
if t == self: continue |
|
||||
if depnode in t.inputs: |
|
||||
self.set_run_after(t) |
|
||||
|
|
||||
# TODO necessary to get the signature right - for now |
|
||||
delattr(self, 'cache_sig') |
|
||||
self.signature() |
|
||||
|
|
||||
return Task.Task.runnable_status(self) |
|
||||
|
|
||||
b = Task.simple_task_type |
|
||||
cls = b('ocamlx', '${OCAMLOPT} ${OCAMLPATH} ${OCAMLFLAGS} ${INCLUDES} -c -o ${TGT} ${SRC}', color='GREEN', shell=False) |
|
||||
cls.runnable_status = compile_may_start |
|
||||
cls.scan = scan |
|
||||
|
|
||||
b = Task.simple_task_type |
|
||||
cls = b('ocaml', '${OCAMLC} ${OCAMLPATH} ${OCAMLFLAGS} ${INCLUDES} -c -o ${TGT} ${SRC}', color='GREEN', shell=False) |
|
||||
cls.runnable_status = compile_may_start |
|
||||
cls.scan = scan |
|
||||
|
|
||||
|
|
||||
b('ocamlcmi', '${OCAMLC} ${OCAMLPATH} ${INCLUDES} -o ${TGT} -c ${SRC}', color='BLUE', before="ocaml ocamlcc ocamlx") |
|
||||
b('ocamlcc', 'cd ${TGT[0].bld_dir(env)} && ${OCAMLOPT} ${OCAMLFLAGS} ${OCAMLPATH} ${INCLUDES} -c ${SRC[0].abspath(env)}', color='GREEN') |
|
||||
|
|
||||
b('ocamllex', '${OCAMLLEX} ${SRC} -o ${TGT}', color='BLUE', before="ocamlcmi ocaml ocamlcc") |
|
||||
b('ocamlyacc', '${OCAMLYACC} -b ${TGT[0].bld_base(env)} ${SRC}', color='BLUE', before="ocamlcmi ocaml ocamlcc") |
|
||||
|
|
||||
|
|
||||
def link_may_start(self): |
|
||||
if not getattr(self, 'order', ''): |
|
||||
|
|
||||
# now reorder the inputs given the task dependencies |
|
||||
if getattr(self, 'bytecode', 0): alltasks = self.obj.bytecode_tasks |
|
||||
else: alltasks = self.obj.native_tasks |
|
||||
|
|
||||
# this part is difficult, we do not have a total order on the tasks |
|
||||
# if the dependencies are wrong, this may not stop |
|
||||
seen = [] |
|
||||
pendant = []+alltasks |
|
||||
while pendant: |
|
||||
task = pendant.pop(0) |
|
||||
if task in seen: continue |
|
||||
for x in task.run_after: |
|
||||
if not x in seen: |
|
||||
pendant.append(task) |
|
||||
break |
|
||||
else: |
|
||||
seen.append(task) |
|
||||
self.inputs = [x.outputs[0] for x in seen] |
|
||||
self.order = 1 |
|
||||
return Task.Task.runnable_status(self) |
|
||||
|
|
||||
act = b('ocalink', '${OCAMLC} -o ${TGT} ${INCLUDES} ${OCALINKFLAGS} ${SRC}', color='YELLOW', after="ocaml ocamlcc") |
|
||||
act.runnable_status = link_may_start |
|
||||
act = b('ocalinkx', '${OCAMLOPT} -o ${TGT} ${INCLUDES} ${OCALINKFLAGS_OPT} ${SRC}', color='YELLOW', after="ocamlx ocamlcc") |
|
||||
act.runnable_status = link_may_start |
|
||||
|
|
||||
def detect(conf): |
|
||||
opt = conf.find_program('ocamlopt', var='OCAMLOPT') |
|
||||
occ = conf.find_program('ocamlc', var='OCAMLC') |
|
||||
if (not opt) or (not occ): |
|
||||
conf.fatal('The objective caml compiler was not found:\ninstall it or make it available in your PATH') |
|
||||
|
|
||||
v = conf.env |
|
||||
v['OCAMLC'] = occ |
|
||||
v['OCAMLOPT'] = opt |
|
||||
v['OCAMLLEX'] = conf.find_program('ocamllex', var='OCAMLLEX') |
|
||||
v['OCAMLYACC'] = conf.find_program('ocamlyacc', var='OCAMLYACC') |
|
||||
v['OCAMLFLAGS'] = '' |
|
||||
v['OCAMLLIB'] = Utils.cmd_output(conf.env['OCAMLC']+' -where').strip()+os.sep |
|
||||
v['LIBPATH_OCAML'] = Utils.cmd_output(conf.env['OCAMLC']+' -where').strip()+os.sep |
|
||||
v['CPPPATH_OCAML'] = Utils.cmd_output(conf.env['OCAMLC']+' -where').strip()+os.sep |
|
||||
v['LIB_OCAML'] = 'camlrun' |
|
||||
|
|
@ -1,109 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# andersg at 0x63.nu 2007 |
|
||||
|
|
||||
import os |
|
||||
import Task, Options, Utils |
|
||||
from Configure import conf |
|
||||
from TaskGen import extension, taskgen, feature, before |
|
||||
|
|
||||
xsubpp_str = '${PERL} ${XSUBPP} -noprototypes -typemap ${EXTUTILS_TYPEMAP} ${SRC} > ${TGT}' |
|
||||
EXT_XS = ['.xs'] |
|
||||
|
|
||||
@before('apply_incpaths', 'apply_type_vars', 'apply_lib_vars') |
|
||||
@feature('perlext') |
|
||||
def init_perlext(self): |
|
||||
self.uselib = self.to_list(getattr(self, 'uselib', '')) |
|
||||
if not 'PERL' in self.uselib: self.uselib.append('PERL') |
|
||||
if not 'PERLEXT' in self.uselib: self.uselib.append('PERLEXT') |
|
||||
self.env['shlib_PATTERN'] = self.env['perlext_PATTERN'] |
|
||||
|
|
||||
@extension(EXT_XS) |
|
||||
def xsubpp_file(self, node): |
|
||||
outnode = node.change_ext('.c') |
|
||||
self.create_task('xsubpp', node, outnode) |
|
||||
self.allnodes.append(outnode) |
|
||||
|
|
||||
Task.simple_task_type('xsubpp', xsubpp_str, color='BLUE', before='cc cxx', shell=False) |
|
||||
|
|
||||
@conf |
|
||||
def check_perl_version(conf, minver=None): |
|
||||
""" |
|
||||
Checks if perl is installed. |
|
||||
|
|
||||
If installed the variable PERL will be set in environment. |
|
||||
|
|
||||
Perl binary can be overridden by --with-perl-binary config variable |
|
||||
|
|
||||
""" |
|
||||
|
|
||||
if getattr(Options.options, 'perlbinary', None): |
|
||||
conf.env.PERL = Options.options.perlbinary |
|
||||
else: |
|
||||
conf.find_program('perl', var='PERL', mandatory=True) |
|
||||
|
|
||||
try: |
|
||||
version = Utils.cmd_output([conf.env.PERL, '-e', 'printf "%vd",$^V']) |
|
||||
except: |
|
||||
conf.fatal('could not determine the perl version') |
|
||||
|
|
||||
conf.env.PERL_VERSION = version |
|
||||
cver = '' |
|
||||
if minver: |
|
||||
try: |
|
||||
ver = tuple(map(int, version.split('.'))) |
|
||||
except: |
|
||||
conf.fatal('unsupported perl version %r' % version) |
|
||||
if ver < minver: |
|
||||
conf.fatal('perl is too old') |
|
||||
|
|
||||
cver = '.'.join(map(str,minver)) |
|
||||
conf.check_message('perl', cver, True, version) |
|
||||
|
|
||||
@conf |
|
||||
def check_perl_module(conf, module): |
|
||||
""" |
|
||||
Check if specified perlmodule is installed. |
|
||||
|
|
||||
Minimum version can be specified by specifying it after modulename |
|
||||
like this: |
|
||||
|
|
||||
conf.check_perl_module("Some::Module 2.92") |
|
||||
""" |
|
||||
cmd = [conf.env['PERL'], '-e', 'use %s' % module] |
|
||||
r = Utils.pproc.call(cmd, stdout=Utils.pproc.PIPE, stderr=Utils.pproc.PIPE) == 0 |
|
||||
conf.check_message("perl module %s" % module, "", r) |
|
||||
return r |
|
||||
|
|
||||
@conf |
|
||||
def check_perl_ext_devel(conf): |
|
||||
""" |
|
||||
Check for configuration needed to build perl extensions. |
|
||||
|
|
||||
Sets different xxx_PERLEXT variables in the environment. |
|
||||
|
|
||||
Also sets the ARCHDIR_PERL variable useful as installation path, |
|
||||
which can be overridden by --with-perl-archdir |
|
||||
""" |
|
||||
if not conf.env.PERL: |
|
||||
conf.fatal('perl detection is required first') |
|
||||
|
|
||||
def read_out(cmd): |
|
||||
return Utils.to_list(Utils.cmd_output([conf.env.PERL, '-MConfig', '-e', cmd])) |
|
||||
|
|
||||
conf.env.LINKFLAGS_PERLEXT = read_out('print $Config{lddlflags}') |
|
||||
conf.env.CPPPATH_PERLEXT = read_out('print "$Config{archlib}/CORE"') |
|
||||
conf.env.CCFLAGS_PERLEXT = read_out('print "$Config{ccflags} $Config{cccdlflags}"') |
|
||||
conf.env.XSUBPP = read_out('print "$Config{privlib}/ExtUtils/xsubpp$Config{exe_ext}"') |
|
||||
conf.env.EXTUTILS_TYPEMAP = read_out('print "$Config{privlib}/ExtUtils/typemap"') |
|
||||
conf.env.perlext_PATTERN = '%s.' + read_out('print $Config{dlext}')[0] |
|
||||
|
|
||||
if getattr(Options.options, 'perlarchdir', None): |
|
||||
conf.env.ARCHDIR_PERL = Options.options.perlarchdir |
|
||||
else: |
|
||||
conf.env.ARCHDIR_PERL = read_out('print $Config{sitearch}')[0] |
|
||||
|
|
||||
def set_options(opt): |
|
||||
opt.add_option("--with-perl-binary", type="string", dest="perlbinary", help = 'Specify alternate perl binary', default=None) |
|
||||
opt.add_option("--with-perl-archdir", type="string", dest="perlarchdir", help = 'Specify directory where to install arch specific files', default=None) |
|
||||
|
|
@ -1,505 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# Thomas Nagy, 2006 (ita) |
|
||||
|
|
||||
""" |
|
||||
Qt4 support |
|
||||
|
|
||||
If QT4_ROOT is given (absolute path), the configuration will look in it first |
|
||||
|
|
||||
This module also demonstrates how to add tasks dynamically (when the build has started) |
|
||||
""" |
|
||||
|
|
||||
try: |
|
||||
from xml.sax import make_parser |
|
||||
from xml.sax.handler import ContentHandler |
|
||||
except ImportError: |
|
||||
has_xml = False |
|
||||
ContentHandler = object |
|
||||
else: |
|
||||
has_xml = True |
|
||||
|
|
||||
import os, sys |
|
||||
import ccroot, cxx |
|
||||
import TaskGen, Task, Utils, Runner, Options, Node, Configure |
|
||||
from TaskGen import taskgen, feature, after, extension |
|
||||
from Logs import error |
|
||||
from Constants import * |
|
||||
|
|
||||
MOC_H = ['.h', '.hpp', '.hxx', '.hh'] |
|
||||
EXT_RCC = ['.qrc'] |
|
||||
EXT_UI = ['.ui'] |
|
||||
EXT_QT4 = ['.cpp', '.cc', '.cxx', '.C'] |
|
||||
|
|
||||
class qxx_task(Task.Task): |
|
||||
"A cpp task that may create a moc task dynamically" |
|
||||
|
|
||||
before = ['cxx_link', 'static_link'] |
|
||||
|
|
||||
def __init__(self, *k, **kw): |
|
||||
Task.Task.__init__(self, *k, **kw) |
|
||||
self.moc_done = 0 |
|
||||
|
|
||||
def scan(self): |
|
||||
(nodes, names) = ccroot.scan(self) |
|
||||
# for some reasons (variants) the moc node may end in the list of node deps |
|
||||
for x in nodes: |
|
||||
if x.name.endswith('.moc'): |
|
||||
nodes.remove(x) |
|
||||
names.append(x.relpath_gen(self.inputs[0].parent)) |
|
||||
return (nodes, names) |
|
||||
|
|
||||
def runnable_status(self): |
|
||||
if self.moc_done: |
|
||||
# if there is a moc task, delay the computation of the file signature |
|
||||
for t in self.run_after: |
|
||||
if not t.hasrun: |
|
||||
return ASK_LATER |
|
||||
# the moc file enters in the dependency calculation |
|
||||
# so we need to recompute the signature when the moc file is present |
|
||||
self.signature() |
|
||||
return Task.Task.runnable_status(self) |
|
||||
else: |
|
||||
# yes, really, there are people who generate cxx files |
|
||||
for t in self.run_after: |
|
||||
if not t.hasrun: |
|
||||
return ASK_LATER |
|
||||
self.add_moc_tasks() |
|
||||
return ASK_LATER |
|
||||
|
|
||||
def add_moc_tasks(self): |
|
||||
|
|
||||
node = self.inputs[0] |
|
||||
tree = node.__class__.bld |
|
||||
|
|
||||
try: |
|
||||
# compute the signature once to know if there is a moc file to create |
|
||||
self.signature() |
|
||||
except KeyError: |
|
||||
# the moc file may be referenced somewhere else |
|
||||
pass |
|
||||
else: |
|
||||
# remove the signature, it must be recomputed with the moc task |
|
||||
delattr(self, 'cache_sig') |
|
||||
|
|
||||
moctasks=[] |
|
||||
mocfiles=[] |
|
||||
variant = node.variant(self.env) |
|
||||
try: |
|
||||
tmp_lst = tree.raw_deps[self.unique_id()] |
|
||||
tree.raw_deps[self.unique_id()] = [] |
|
||||
except KeyError: |
|
||||
tmp_lst = [] |
|
||||
for d in tmp_lst: |
|
||||
if not d.endswith('.moc'): continue |
|
||||
# paranoid check |
|
||||
if d in mocfiles: |
|
||||
error("paranoia owns") |
|
||||
continue |
|
||||
|
|
||||
# process that base.moc only once |
|
||||
mocfiles.append(d) |
|
||||
|
|
||||
# find the extension (performed only when the .cpp has changes) |
|
||||
base2 = d[:-4] |
|
||||
for path in [node.parent] + self.generator.env['INC_PATHS']: |
|
||||
tree.rescan(path) |
|
||||
vals = getattr(Options.options, 'qt_header_ext', '') or MOC_H |
|
||||
for ex in vals: |
|
||||
h_node = path.find_resource(base2 + ex) |
|
||||
if h_node: |
|
||||
break |
|
||||
else: |
|
||||
continue |
|
||||
break |
|
||||
else: |
|
||||
raise Utils.WafError("no header found for %s which is a moc file" % str(d)) |
|
||||
|
|
||||
m_node = h_node.change_ext('.moc') |
|
||||
tree.node_deps[(self.inputs[0].parent.id, self.env.variant(), m_node.name)] = h_node |
|
||||
|
|
||||
# create the task |
|
||||
task = Task.TaskBase.classes['moc'](self.env, normal=0) |
|
||||
task.set_inputs(h_node) |
|
||||
task.set_outputs(m_node) |
|
||||
|
|
||||
generator = tree.generator |
|
||||
generator.outstanding.insert(0, task) |
|
||||
generator.total += 1 |
|
||||
|
|
||||
moctasks.append(task) |
|
||||
|
|
||||
# remove raw deps except the moc files to save space (optimization) |
|
||||
tmp_lst = tree.raw_deps[self.unique_id()] = mocfiles |
|
||||
|
|
||||
# look at the file inputs, it is set right above |
|
||||
lst = tree.node_deps.get(self.unique_id(), ()) |
|
||||
for d in lst: |
|
||||
name = d.name |
|
||||
if name.endswith('.moc'): |
|
||||
task = Task.TaskBase.classes['moc'](self.env, normal=0) |
|
||||
task.set_inputs(tree.node_deps[(self.inputs[0].parent.id, self.env.variant(), name)]) # 1st element in a tuple |
|
||||
task.set_outputs(d) |
|
||||
|
|
||||
generator = tree.generator |
|
||||
generator.outstanding.insert(0, task) |
|
||||
generator.total += 1 |
|
||||
|
|
||||
moctasks.append(task) |
|
||||
|
|
||||
# simple scheduler dependency: run the moc task before others |
|
||||
self.run_after = moctasks |
|
||||
self.moc_done = 1 |
|
||||
|
|
||||
run = Task.TaskBase.classes['cxx'].__dict__['run'] |
|
||||
|
|
||||
def translation_update(task): |
|
||||
outs = [a.abspath(task.env) for a in task.outputs] |
|
||||
outs = " ".join(outs) |
|
||||
lupdate = task.env['QT_LUPDATE'] |
|
||||
|
|
||||
for x in task.inputs: |
|
||||
file = x.abspath(task.env) |
|
||||
cmd = "%s %s -ts %s" % (lupdate, file, outs) |
|
||||
Utils.pprint('BLUE', cmd) |
|
||||
task.generator.bld.exec_command(cmd) |
|
||||
|
|
||||
class XMLHandler(ContentHandler): |
|
||||
def __init__(self): |
|
||||
self.buf = [] |
|
||||
self.files = [] |
|
||||
def startElement(self, name, attrs): |
|
||||
if name == 'file': |
|
||||
self.buf = [] |
|
||||
def endElement(self, name): |
|
||||
if name == 'file': |
|
||||
self.files.append(''.join(self.buf)) |
|
||||
def characters(self, cars): |
|
||||
self.buf.append(cars) |
|
||||
|
|
||||
def scan(self): |
|
||||
"add the dependency on the files referenced in the qrc" |
|
||||
node = self.inputs[0] |
|
||||
parser = make_parser() |
|
||||
curHandler = XMLHandler() |
|
||||
parser.setContentHandler(curHandler) |
|
||||
fi = open(self.inputs[0].abspath(self.env)) |
|
||||
parser.parse(fi) |
|
||||
fi.close() |
|
||||
|
|
||||
nodes = [] |
|
||||
names = [] |
|
||||
root = self.inputs[0].parent |
|
||||
for x in curHandler.files: |
|
||||
nd = root.find_resource(x) |
|
||||
if nd: nodes.append(nd) |
|
||||
else: names.append(x) |
|
||||
|
|
||||
return (nodes, names) |
|
||||
|
|
||||
@extension(EXT_RCC) |
|
||||
def create_rcc_task(self, node): |
|
||||
"hook for rcc files" |
|
||||
rcnode = node.change_ext('_rc.cpp') |
|
||||
rcctask = self.create_task('rcc', node, rcnode) |
|
||||
cpptask = self.create_task('cxx', rcnode, rcnode.change_ext('.o')) |
|
||||
self.compiled_tasks.append(cpptask) |
|
||||
return cpptask |
|
||||
|
|
||||
@extension(EXT_UI) |
|
||||
def create_uic_task(self, node): |
|
||||
"hook for uic tasks" |
|
||||
uictask = self.create_task('ui4', node) |
|
||||
uictask.outputs = [self.path.find_or_declare(self.env['ui_PATTERN'] % node.name[:-3])] |
|
||||
return uictask |
|
||||
|
|
||||
class qt4_taskgen(cxx.cxx_taskgen): |
|
||||
def __init__(self, *k, **kw): |
|
||||
cxx.cxx_taskgen.__init__(self, *k, **kw) |
|
||||
self.features.append('qt4') |
|
||||
|
|
||||
@extension('.ts') |
|
||||
def add_lang(self, node): |
|
||||
"""add all the .ts file into self.lang""" |
|
||||
self.lang = self.to_list(getattr(self, 'lang', [])) + [node] |
|
||||
|
|
||||
@feature('qt4') |
|
||||
@after('apply_link') |
|
||||
def apply_qt4(self): |
|
||||
if getattr(self, 'lang', None): |
|
||||
update = getattr(self, 'update', None) |
|
||||
lst=[] |
|
||||
trans=[] |
|
||||
for l in self.to_list(self.lang): |
|
||||
|
|
||||
if not isinstance(l, Node.Node): |
|
||||
l = self.path.find_resource(l+'.ts') |
|
||||
|
|
||||
t = self.create_task('ts2qm', l, l.change_ext('.qm')) |
|
||||
lst.append(t.outputs[0]) |
|
||||
|
|
||||
if update: |
|
||||
trans.append(t.inputs[0]) |
|
||||
|
|
||||
trans_qt4 = getattr(Options.options, 'trans_qt4', False) |
|
||||
if update and trans_qt4: |
|
||||
# we need the cpp files given, except the rcc task we create after |
|
||||
# FIXME may be broken |
|
||||
u = Task.TaskCmd(translation_update, self.env, 2) |
|
||||
u.inputs = [a.inputs[0] for a in self.compiled_tasks] |
|
||||
u.outputs = trans |
|
||||
|
|
||||
if getattr(self, 'langname', None): |
|
||||
t = Task.TaskBase.classes['qm2rcc'](self.env) |
|
||||
t.set_inputs(lst) |
|
||||
t.set_outputs(self.path.find_or_declare(self.langname+'.qrc')) |
|
||||
t.path = self.path |
|
||||
k = create_rcc_task(self, t.outputs[0]) |
|
||||
self.link_task.inputs.append(k.outputs[0]) |
|
||||
|
|
||||
self.env.append_value('MOC_FLAGS', self.env._CXXDEFFLAGS) |
|
||||
self.env.append_value('MOC_FLAGS', self.env._CXXINCFLAGS) |
|
||||
|
|
||||
@extension(EXT_QT4) |
|
||||
def cxx_hook(self, node): |
|
||||
# create the compilation task: cpp or cc |
|
||||
try: obj_ext = self.obj_ext |
|
||||
except AttributeError: obj_ext = '_%d.o' % self.idx |
|
||||
|
|
||||
task = self.create_task('qxx', node, node.change_ext(obj_ext)) |
|
||||
self.compiled_tasks.append(task) |
|
||||
return task |
|
||||
|
|
||||
def process_qm2rcc(task): |
|
||||
outfile = task.outputs[0].abspath(task.env) |
|
||||
f = open(outfile, 'w') |
|
||||
f.write('<!DOCTYPE RCC><RCC version="1.0">\n<qresource>\n') |
|
||||
for k in task.inputs: |
|
||||
f.write(' <file>') |
|
||||
#f.write(k.name) |
|
||||
f.write(k.path_to_parent(task.path)) |
|
||||
f.write('</file>\n') |
|
||||
f.write('</qresource>\n</RCC>') |
|
||||
f.close() |
|
||||
|
|
||||
b = Task.simple_task_type |
|
||||
b('moc', '${QT_MOC} ${MOC_FLAGS} ${SRC} ${MOC_ST} ${TGT}', color='BLUE', vars=['QT_MOC', 'MOC_FLAGS'], shell=False) |
|
||||
cls = b('rcc', '${QT_RCC} -name ${SRC[0].name} ${SRC[0].abspath(env)} ${RCC_ST} -o ${TGT}', color='BLUE', before='cxx moc qxx_task', after="qm2rcc", shell=False) |
|
||||
cls.scan = scan |
|
||||
b('ui4', '${QT_UIC} ${SRC} -o ${TGT}', color='BLUE', before='cxx moc qxx_task', shell=False) |
|
||||
b('ts2qm', '${QT_LRELEASE} ${QT_LRELEASE_FLAGS} ${SRC} -qm ${TGT}', color='BLUE', before='qm2rcc', shell=False) |
|
||||
|
|
||||
Task.task_type_from_func('qm2rcc', vars=[], func=process_qm2rcc, color='BLUE', before='rcc', after='ts2qm') |
|
||||
|
|
||||
def detect_qt4(conf): |
|
||||
env = conf.env |
|
||||
opt = Options.options |
|
||||
|
|
||||
qtdir = getattr(opt, 'qtdir', '') |
|
||||
qtbin = getattr(opt, 'qtbin', '') |
|
||||
qtlibs = getattr(opt, 'qtlibs', '') |
|
||||
useframework = getattr(opt, 'use_qt4_osxframework', True) |
|
||||
|
|
||||
paths = [] |
|
||||
|
|
||||
# the path to qmake has been given explicitely |
|
||||
if qtbin: |
|
||||
paths = [qtbin] |
|
||||
|
|
||||
# the qt directory has been given - we deduce the qt binary path |
|
||||
if not qtdir: |
|
||||
qtdir = conf.environ.get('QT4_ROOT', '') |
|
||||
qtbin = os.path.join(qtdir, 'bin') |
|
||||
paths = [qtbin] |
|
||||
|
|
||||
# no qtdir, look in the path and in /usr/local/Trolltech |
|
||||
if not qtdir: |
|
||||
paths = os.environ.get('PATH', '').split(os.pathsep) |
|
||||
paths.append('/usr/share/qt4/bin/') |
|
||||
try: |
|
||||
lst = os.listdir('/usr/local/Trolltech/') |
|
||||
except OSError: |
|
||||
pass |
|
||||
else: |
|
||||
if lst: |
|
||||
lst.sort() |
|
||||
lst.reverse() |
|
||||
|
|
||||
# keep the highest version |
|
||||
qtdir = '/usr/local/Trolltech/%s/' % lst[0] |
|
||||
qtbin = os.path.join(qtdir, 'bin') |
|
||||
paths.append(qtbin) |
|
||||
|
|
||||
# at the end, try to find qmake in the paths given |
|
||||
# keep the one with the highest version |
|
||||
cand = None |
|
||||
prev_ver = ['4', '0', '0'] |
|
||||
for qmk in ['qmake-qt4', 'qmake4', 'qmake']: |
|
||||
qmake = conf.find_program(qmk, path_list=paths) |
|
||||
if qmake: |
|
||||
try: |
|
||||
version = Utils.cmd_output([qmake, '-query', 'QT_VERSION']).strip() |
|
||||
except ValueError: |
|
||||
pass |
|
||||
else: |
|
||||
if version: |
|
||||
new_ver = version.split('.') |
|
||||
if new_ver > prev_ver: |
|
||||
cand = qmake |
|
||||
prev_ver = new_ver |
|
||||
if cand: |
|
||||
qmake = cand |
|
||||
else: |
|
||||
conf.fatal('could not find qmake for qt4') |
|
||||
|
|
||||
conf.env.QMAKE = qmake |
|
||||
qtincludes = Utils.cmd_output([qmake, '-query', 'QT_INSTALL_HEADERS']).strip() |
|
||||
qtdir = Utils.cmd_output([qmake, '-query', 'QT_INSTALL_PREFIX']).strip() + os.sep |
|
||||
qtbin = Utils.cmd_output([qmake, '-query', 'QT_INSTALL_BINS']).strip() + os.sep |
|
||||
|
|
||||
if not qtlibs: |
|
||||
try: |
|
||||
qtlibs = Utils.cmd_output([qmake, '-query', 'QT_INSTALL_LIBS']).strip() + os.sep |
|
||||
except ValueError: |
|
||||
qtlibs = os.path.join(qtdir, 'lib') |
|
||||
|
|
||||
def find_bin(lst, var): |
|
||||
for f in lst: |
|
||||
ret = conf.find_program(f, path_list=paths) |
|
||||
if ret: |
|
||||
env[var]=ret |
|
||||
break |
|
||||
|
|
||||
vars = "QtCore QtGui QtUiTools QtNetwork QtOpenGL QtSql QtSvg QtTest QtXml QtWebKit Qt3Support".split() |
|
||||
|
|
||||
find_bin(['uic-qt3', 'uic3'], 'QT_UIC3') |
|
||||
find_bin(['uic-qt4', 'uic'], 'QT_UIC') |
|
||||
if not env['QT_UIC']: |
|
||||
conf.fatal('cannot find the uic compiler for qt4') |
|
||||
|
|
||||
try: |
|
||||
version = Utils.cmd_output(env['QT_UIC'] + " -version 2>&1").strip() |
|
||||
except ValueError: |
|
||||
conf.fatal('your uic compiler is for qt3, add uic for qt4 to your path') |
|
||||
|
|
||||
version = version.replace('Qt User Interface Compiler ','') |
|
||||
version = version.replace('User Interface Compiler for Qt', '') |
|
||||
if version.find(" 3.") != -1: |
|
||||
conf.check_message('uic version', '(too old)', 0, option='(%s)'%version) |
|
||||
sys.exit(1) |
|
||||
conf.check_message('uic version', '', 1, option='(%s)'%version) |
|
||||
|
|
||||
find_bin(['moc-qt4', 'moc'], 'QT_MOC') |
|
||||
find_bin(['rcc'], 'QT_RCC') |
|
||||
find_bin(['lrelease-qt4', 'lrelease'], 'QT_LRELEASE') |
|
||||
find_bin(['lupdate-qt4', 'lupdate'], 'QT_LUPDATE') |
|
||||
|
|
||||
env['UIC3_ST']= '%s -o %s' |
|
||||
env['UIC_ST'] = '%s -o %s' |
|
||||
env['MOC_ST'] = '-o' |
|
||||
env['ui_PATTERN'] = 'ui_%s.h' |
|
||||
env['QT_LRELEASE_FLAGS'] = ['-silent'] |
|
||||
|
|
||||
vars_debug = [a+'_debug' for a in vars] |
|
||||
|
|
||||
try: |
|
||||
conf.find_program('pkg-config', var='pkgconfig', path_list=paths, mandatory=True) |
|
||||
|
|
||||
except Configure.ConfigurationError: |
|
||||
|
|
||||
for lib in vars_debug+vars: |
|
||||
uselib = lib.upper() |
|
||||
|
|
||||
d = (lib.find('_debug') > 0) and 'd' or '' |
|
||||
|
|
||||
# original author seems to prefer static to shared libraries |
|
||||
for (pat, kind) in ((conf.env.staticlib_PATTERN, 'STATIC'), (conf.env.shlib_PATTERN, '')): |
|
||||
|
|
||||
conf.check_message_1('Checking for %s %s' % (lib, kind)) |
|
||||
|
|
||||
for ext in ['', '4']: |
|
||||
path = os.path.join(qtlibs, pat % (lib + d + ext)) |
|
||||
if os.path.exists(path): |
|
||||
env.append_unique(kind + 'LIB_' + uselib, lib + d + ext) |
|
||||
conf.check_message_2('ok ' + path, 'GREEN') |
|
||||
break |
|
||||
path = os.path.join(qtbin, pat % (lib + d + ext)) |
|
||||
if os.path.exists(path): |
|
||||
env.append_unique(kind + 'LIB_' + uselib, lib + d + ext) |
|
||||
conf.check_message_2('ok ' + path, 'GREEN') |
|
||||
break |
|
||||
else: |
|
||||
conf.check_message_2('not found', 'YELLOW') |
|
||||
continue |
|
||||
break |
|
||||
|
|
||||
env.append_unique('LIBPATH_' + uselib, qtlibs) |
|
||||
env.append_unique('CPPPATH_' + uselib, qtincludes) |
|
||||
env.append_unique('CPPPATH_' + uselib, qtincludes + os.sep + lib) |
|
||||
else: |
|
||||
for i in vars_debug+vars: |
|
||||
try: |
|
||||
conf.check_cfg(package=i, args='--cflags --libs --silence-errors', path=conf.env.pkgconfig) |
|
||||
except ValueError: |
|
||||
pass |
|
||||
|
|
||||
# the libpaths are set nicely, unfortunately they make really long command-lines |
|
||||
# remove the qtcore ones from qtgui, etc |
|
||||
def process_lib(vars_, coreval): |
|
||||
for d in vars_: |
|
||||
var = d.upper() |
|
||||
if var == 'QTCORE': continue |
|
||||
|
|
||||
value = env['LIBPATH_'+var] |
|
||||
if value: |
|
||||
core = env[coreval] |
|
||||
accu = [] |
|
||||
for lib in value: |
|
||||
if lib in core: continue |
|
||||
accu.append(lib) |
|
||||
env['LIBPATH_'+var] = accu |
|
||||
|
|
||||
process_lib(vars, 'LIBPATH_QTCORE') |
|
||||
process_lib(vars_debug, 'LIBPATH_QTCORE_DEBUG') |
|
||||
|
|
||||
# rpath if wanted |
|
||||
want_rpath = getattr(Options.options, 'want_rpath', 1) |
|
||||
if want_rpath: |
|
||||
def process_rpath(vars_, coreval): |
|
||||
for d in vars_: |
|
||||
var = d.upper() |
|
||||
value = env['LIBPATH_'+var] |
|
||||
if value: |
|
||||
core = env[coreval] |
|
||||
accu = [] |
|
||||
for lib in value: |
|
||||
if var != 'QTCORE': |
|
||||
if lib in core: |
|
||||
continue |
|
||||
accu.append('-Wl,--rpath='+lib) |
|
||||
env['RPATH_'+var] = accu |
|
||||
process_rpath(vars, 'LIBPATH_QTCORE') |
|
||||
process_rpath(vars_debug, 'LIBPATH_QTCORE_DEBUG') |
|
||||
|
|
||||
env['QTLOCALE'] = str(env['PREFIX'])+'/share/locale' |
|
||||
|
|
||||
def detect(conf): |
|
||||
detect_qt4(conf) |
|
||||
|
|
||||
def set_options(opt): |
|
||||
opt.add_option('--want-rpath', type='int', default=1, dest='want_rpath', help='set rpath to 1 or 0 [Default 1]') |
|
||||
|
|
||||
opt.add_option('--header-ext', |
|
||||
type='string', |
|
||||
default='', |
|
||||
help='header extension for moc files', |
|
||||
dest='qt_header_ext') |
|
||||
|
|
||||
for i in 'qtdir qtbin qtlibs'.split(): |
|
||||
opt.add_option('--'+i, type='string', default='', dest=i) |
|
||||
|
|
||||
if sys.platform == "darwin": |
|
||||
opt.add_option('--no-qt4-framework', action="store_false", help='do not use the framework version of Qt4 in OS X', dest='use_qt4_osxframework',default=True) |
|
||||
|
|
||||
opt.add_option('--translate', action="store_true", help="collect translation strings", dest="trans_qt4", default=False) |
|
||||
|
|
@ -1,120 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# daniel.svensson at purplescout.se 2008 |
|
||||
|
|
||||
import os |
|
||||
import Task, Options, Utils |
|
||||
from TaskGen import before, feature, after |
|
||||
from Configure import conf |
|
||||
|
|
||||
@feature('rubyext') |
|
||||
@before('apply_incpaths', 'apply_type_vars', 'apply_lib_vars', 'apply_bundle') |
|
||||
@after('default_cc', 'vars_target_cshlib') |
|
||||
def init_rubyext(self): |
|
||||
self.default_install_path = '${ARCHDIR_RUBY}' |
|
||||
self.uselib = self.to_list(getattr(self, 'uselib', '')) |
|
||||
if not 'RUBY' in self.uselib: |
|
||||
self.uselib.append('RUBY') |
|
||||
if not 'RUBYEXT' in self.uselib: |
|
||||
self.uselib.append('RUBYEXT') |
|
||||
|
|
||||
@feature('rubyext') |
|
||||
@before('apply_link') |
|
||||
def apply_ruby_so_name(self): |
|
||||
self.env['shlib_PATTERN'] = self.env['rubyext_PATTERN'] |
|
||||
|
|
||||
@conf |
|
||||
def check_ruby_version(conf, minver=()): |
|
||||
""" |
|
||||
Checks if ruby is installed. |
|
||||
If installed the variable RUBY will be set in environment. |
|
||||
Ruby binary can be overridden by --with-ruby-binary config variable |
|
||||
""" |
|
||||
|
|
||||
if Options.options.rubybinary: |
|
||||
conf.env.RUBY = Options.options.rubybinary |
|
||||
else: |
|
||||
conf.find_program("ruby", var="RUBY", mandatory=True) |
|
||||
|
|
||||
ruby = conf.env.RUBY |
|
||||
|
|
||||
try: |
|
||||
version = Utils.cmd_output([ruby, '-e', 'puts defined?(VERSION) ? VERSION : RUBY_VERSION']).strip() |
|
||||
except: |
|
||||
conf.fatal('could not determine ruby version') |
|
||||
conf.env.RUBY_VERSION = version |
|
||||
|
|
||||
try: |
|
||||
ver = tuple(map(int, version.split("."))) |
|
||||
except: |
|
||||
conf.fatal('unsupported ruby version %r' % version) |
|
||||
|
|
||||
cver = '' |
|
||||
if minver: |
|
||||
if ver < minver: |
|
||||
conf.fatal('ruby is too old') |
|
||||
cver = ".".join(str(x) for x in minver) |
|
||||
|
|
||||
conf.check_message('ruby', cver, True, version) |
|
||||
|
|
||||
@conf |
|
||||
def check_ruby_ext_devel(conf): |
|
||||
if not conf.env.RUBY: |
|
||||
conf.fatal('ruby detection is required first') |
|
||||
|
|
||||
if not conf.env.CC_NAME and not conf.env.CXX_NAME: |
|
||||
conf.fatal('load a c/c++ compiler first') |
|
||||
|
|
||||
version = tuple(map(int, conf.env.RUBY_VERSION.split("."))) |
|
||||
|
|
||||
def read_out(cmd): |
|
||||
return Utils.to_list(Utils.cmd_output([conf.env.RUBY, '-rrbconfig', '-e', cmd])) |
|
||||
|
|
||||
def read_config(key): |
|
||||
return read_out('puts Config::CONFIG[%r]' % key) |
|
||||
|
|
||||
ruby = conf.env['RUBY'] |
|
||||
archdir = read_config('archdir') |
|
||||
cpppath = archdir |
|
||||
if version >= (1, 9, 0): |
|
||||
ruby_hdrdir = read_config('rubyhdrdir') |
|
||||
cpppath += ruby_hdrdir |
|
||||
cpppath += [os.path.join(ruby_hdrdir[0], read_config('arch')[0])] |
|
||||
|
|
||||
conf.check(header_name='ruby.h', includes=cpppath, mandatory=True, errmsg='could not find ruby header file') |
|
||||
|
|
||||
conf.env.LIBPATH_RUBYEXT = read_config('libdir') |
|
||||
conf.env.LIBPATH_RUBYEXT += archdir |
|
||||
conf.env.CPPPATH_RUBYEXT = cpppath |
|
||||
conf.env.CCFLAGS_RUBYEXT = read_config("CCDLFLAGS") |
|
||||
conf.env.rubyext_PATTERN = '%s.' + read_config('DLEXT')[0] |
|
||||
|
|
||||
# ok this is really stupid, but the command and flags are combined. |
|
||||
# so we try to find the first argument... |
|
||||
flags = read_config('LDSHARED') |
|
||||
while flags and flags[0][0] != '-': |
|
||||
flags = flags[1:] |
|
||||
|
|
||||
# we also want to strip out the deprecated ppc flags |
|
||||
if len(flags) > 1 and flags[1] == "ppc": |
|
||||
flags = flags[2:] |
|
||||
|
|
||||
conf.env.LINKFLAGS_RUBYEXT = flags |
|
||||
conf.env.LINKFLAGS_RUBYEXT += read_config("LIBS") |
|
||||
conf.env.LINKFLAGS_RUBYEXT += read_config("LIBRUBYARG_SHARED") |
|
||||
|
|
||||
if Options.options.rubyarchdir: |
|
||||
conf.env.ARCHDIR_RUBY = Options.options.rubyarchdir |
|
||||
else: |
|
||||
conf.env.ARCHDIR_RUBY = read_config('sitearchdir')[0] |
|
||||
|
|
||||
if Options.options.rubylibdir: |
|
||||
conf.env.LIBDIR_RUBY = Options.options.rubylibdir |
|
||||
else: |
|
||||
conf.env.LIBDIR_RUBY = read_config('sitelibdir')[0] |
|
||||
|
|
||||
def set_options(opt): |
|
||||
opt.add_option('--with-ruby-archdir', type='string', dest='rubyarchdir', help='Specify directory where to install arch specific files') |
|
||||
opt.add_option('--with-ruby-libdir', type='string', dest='rubylibdir', help='Specify alternate ruby library path') |
|
||||
opt.add_option('--with-ruby-binary', type='string', dest='rubybinary', help='Specify alternate ruby binary') |
|
||||
|
|
@ -1,227 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# Thomas Nagy, 2006 (ita) |
|
||||
|
|
||||
"TeX/LaTeX/PDFLaTeX support" |
|
||||
|
|
||||
import os, re |
|
||||
import Utils, TaskGen, Task, Runner, Build |
|
||||
from TaskGen import feature, before |
|
||||
from Logs import error, warn, debug |
|
||||
|
|
||||
re_tex = re.compile(r'\\(?P<type>include|input|import|bringin){(?P<file>[^{}]*)}', re.M) |
|
||||
def scan(self): |
|
||||
node = self.inputs[0] |
|
||||
env = self.env |
|
||||
|
|
||||
nodes = [] |
|
||||
names = [] |
|
||||
if not node: return (nodes, names) |
|
||||
|
|
||||
code = Utils.readf(node.abspath(env)) |
|
||||
|
|
||||
curdirnode = self.curdirnode |
|
||||
abs = curdirnode.abspath() |
|
||||
for match in re_tex.finditer(code): |
|
||||
path = match.group('file') |
|
||||
if path: |
|
||||
for k in ['', '.tex', '.ltx']: |
|
||||
# add another loop for the tex include paths? |
|
||||
debug('tex: trying %s%s' % (path, k)) |
|
||||
try: |
|
||||
os.stat(abs+os.sep+path+k) |
|
||||
except OSError: |
|
||||
continue |
|
||||
found = path+k |
|
||||
node = curdirnode.find_resource(found) |
|
||||
if node: |
|
||||
nodes.append(node) |
|
||||
else: |
|
||||
debug('tex: could not find %s' % path) |
|
||||
names.append(path) |
|
||||
|
|
||||
debug("tex: found the following : %s and names %s" % (nodes, names)) |
|
||||
return (nodes, names) |
|
||||
|
|
||||
g_bibtex_re = re.compile('bibdata', re.M) |
|
||||
def tex_build(task, command='LATEX'): |
|
||||
env = task.env |
|
||||
bld = task.generator.bld |
|
||||
|
|
||||
com = '%s %s' % (env[command], env.get_flat(command+'FLAGS')) |
|
||||
if not env['PROMPT_LATEX']: com = "%s %s" % (com, '-interaction=batchmode') |
|
||||
|
|
||||
node = task.inputs[0] |
|
||||
reldir = node.bld_dir(env) |
|
||||
srcfile = node.srcpath(env) |
|
||||
|
|
||||
lst = [] |
|
||||
for c in Utils.split_path(reldir): |
|
||||
if c: lst.append('..') |
|
||||
sr = os.path.join(*(lst + [srcfile])) |
|
||||
sr2 = os.path.join(*(lst + [node.parent.srcpath(env)])) |
|
||||
|
|
||||
aux_node = node.change_ext('.aux') |
|
||||
idx_node = node.change_ext('.idx') |
|
||||
|
|
||||
hash = '' |
|
||||
old_hash = '' |
|
||||
|
|
||||
nm = aux_node.name |
|
||||
docuname = nm[ : len(nm) - 4 ] # 4 is the size of ".aux" |
|
||||
|
|
||||
latex_compile_cmd = 'cd %s && TEXINPUTS=%s:$TEXINPUTS %s %s' % (reldir, sr2, com, sr) |
|
||||
warn('first pass on %s' % command) |
|
||||
ret = bld.exec_command(latex_compile_cmd) |
|
||||
if ret: return ret |
|
||||
|
|
||||
# look in the .aux file if there is a bibfile to process |
|
||||
try: |
|
||||
ct = Utils.readf(aux_node.abspath(env)) |
|
||||
except (OSError, IOError): |
|
||||
error('error bibtex scan') |
|
||||
else: |
|
||||
fo = g_bibtex_re.findall(ct) |
|
||||
|
|
||||
# yes, there is a .aux file to process |
|
||||
if fo: |
|
||||
bibtex_compile_cmd = 'cd %s && BIBINPUTS=%s:$BIBINPUTS %s %s' % (reldir, sr2, env['BIBTEX'], docuname) |
|
||||
|
|
||||
warn('calling bibtex') |
|
||||
ret = bld.exec_command(bibtex_compile_cmd) |
|
||||
if ret: |
|
||||
error('error when calling bibtex %s' % bibtex_compile_cmd) |
|
||||
return ret |
|
||||
|
|
||||
# look on the filesystem if there is a .idx file to process |
|
||||
try: |
|
||||
idx_path = idx_node.abspath(env) |
|
||||
os.stat(idx_path) |
|
||||
except OSError: |
|
||||
error('error file.idx scan') |
|
||||
else: |
|
||||
makeindex_compile_cmd = 'cd %s && %s %s' % (reldir, env['MAKEINDEX'], idx_path) |
|
||||
warn('calling makeindex') |
|
||||
ret = bld.exec_command(makeindex_compile_cmd) |
|
||||
if ret: |
|
||||
error('error when calling makeindex %s' % makeindex_compile_cmd) |
|
||||
return ret |
|
||||
|
|
||||
i = 0 |
|
||||
while i < 10: |
|
||||
# prevent against infinite loops - one never knows |
|
||||
i += 1 |
|
||||
|
|
||||
# watch the contents of file.aux |
|
||||
old_hash = hash |
|
||||
try: |
|
||||
hash = Utils.h_file(aux_node.abspath(env)) |
|
||||
except KeyError: |
|
||||
error('could not read aux.h -> %s' % aux_node.abspath(env)) |
|
||||
pass |
|
||||
|
|
||||
# debug |
|
||||
#print "hash is, ", hash, " ", old_hash |
|
||||
|
|
||||
# stop if file.aux does not change anymore |
|
||||
if hash and hash == old_hash: break |
|
||||
|
|
||||
# run the command |
|
||||
warn('calling %s' % command) |
|
||||
ret = bld.exec_command(latex_compile_cmd) |
|
||||
if ret: |
|
||||
error('error when calling %s %s' % (command, latex_compile_cmd)) |
|
||||
return ret |
|
||||
|
|
||||
# 0 means no error |
|
||||
return 0 |
|
||||
|
|
||||
latex_vardeps = ['LATEX', 'LATEXFLAGS'] |
|
||||
def latex_build(task): |
|
||||
return tex_build(task, 'LATEX') |
|
||||
|
|
||||
pdflatex_vardeps = ['PDFLATEX', 'PDFLATEXFLAGS'] |
|
||||
def pdflatex_build(task): |
|
||||
return tex_build(task, 'PDFLATEX') |
|
||||
|
|
||||
class tex_taskgen(TaskGen.task_gen): |
|
||||
def __init__(self, *k, **kw): |
|
||||
TaskGen.task_gen.__init__(self, *k, **kw) |
|
||||
|
|
||||
@feature('tex') |
|
||||
@before('apply_core') |
|
||||
def apply_tex(self): |
|
||||
if not getattr(self, 'type', None) in ['latex', 'pdflatex']: |
|
||||
self.type = 'pdflatex' |
|
||||
|
|
||||
tree = self.bld |
|
||||
outs = Utils.to_list(getattr(self, 'outs', [])) |
|
||||
|
|
||||
# prompt for incomplete files (else the batchmode is used) |
|
||||
self.env['PROMPT_LATEX'] = getattr(self, 'prompt', 1) |
|
||||
|
|
||||
deps_lst = [] |
|
||||
|
|
||||
if getattr(self, 'deps', None): |
|
||||
deps = self.to_list(self.deps) |
|
||||
for filename in deps: |
|
||||
n = self.path.find_resource(filename) |
|
||||
if not n in deps_lst: deps_lst.append(n) |
|
||||
|
|
||||
self.source = self.to_list(self.source) |
|
||||
for filename in self.source: |
|
||||
base, ext = os.path.splitext(filename) |
|
||||
|
|
||||
node = self.path.find_resource(filename) |
|
||||
if not node: raise Utils.WafError('cannot find %s' % filename) |
|
||||
|
|
||||
if self.type == 'latex': |
|
||||
task = self.create_task('latex', node, node.change_ext('.dvi')) |
|
||||
elif self.type == 'pdflatex': |
|
||||
task = self.create_task('pdflatex', node, node.change_ext('.pdf')) |
|
||||
|
|
||||
task.env = self.env |
|
||||
task.curdirnode = self.path |
|
||||
|
|
||||
# add the manual dependencies |
|
||||
if deps_lst: |
|
||||
variant = node.variant(self.env) |
|
||||
try: |
|
||||
lst = tree.node_deps[task.unique_id()] |
|
||||
for n in deps_lst: |
|
||||
if not n in lst: |
|
||||
lst.append(n) |
|
||||
except KeyError: |
|
||||
tree.node_deps[task.unique_id()] = deps_lst |
|
||||
|
|
||||
if self.type == 'latex': |
|
||||
if 'ps' in outs: |
|
||||
tsk = self.create_task('dvips', task.outputs, node.change_ext('.ps')) |
|
||||
tsk.env.env = {'TEXINPUTS' : node.parent.abspath() + ':' + self.path.abspath() + ':' + self.path.abspath(self.env)} |
|
||||
if 'pdf' in outs: |
|
||||
tsk = self.create_task('dvipdf', task.outputs, node.change_ext('.pdf')) |
|
||||
tsk.env.env = {'TEXINPUTS' : node.parent.abspath() + ':' + self.path.abspath() + ':' + self.path.abspath(self.env)} |
|
||||
elif self.type == 'pdflatex': |
|
||||
if 'ps' in outs: |
|
||||
self.create_task('pdf2ps', task.outputs, node.change_ext('.ps')) |
|
||||
self.source = [] |
|
||||
|
|
||||
def detect(conf): |
|
||||
v = conf.env |
|
||||
for p in 'tex latex pdflatex bibtex dvips dvipdf ps2pdf makeindex pdf2ps'.split(): |
|
||||
conf.find_program(p, var=p.upper()) |
|
||||
v[p.upper()+'FLAGS'] = '' |
|
||||
v['DVIPSFLAGS'] = '-Ppdf' |
|
||||
|
|
||||
b = Task.simple_task_type |
|
||||
b('tex', '${TEX} ${TEXFLAGS} ${SRC}', color='BLUE', shell=False) |
|
||||
b('bibtex', '${BIBTEX} ${BIBTEXFLAGS} ${SRC}', color='BLUE', shell=False) |
|
||||
b('dvips', '${DVIPS} ${DVIPSFLAGS} ${SRC} -o ${TGT}', color='BLUE', after="latex pdflatex tex bibtex", shell=False) |
|
||||
b('dvipdf', '${DVIPDF} ${DVIPDFFLAGS} ${SRC} ${TGT}', color='BLUE', after="latex pdflatex tex bibtex", shell=False) |
|
||||
b('pdf2ps', '${PDF2PS} ${PDF2PSFLAGS} ${SRC} ${TGT}', color='BLUE', after="dvipdf pdflatex", shell=False) |
|
||||
b = Task.task_type_from_func |
|
||||
cls = b('latex', latex_build, vars=latex_vardeps) |
|
||||
cls.scan = scan |
|
||||
cls = b('pdflatex', pdflatex_build, vars=pdflatex_vardeps) |
|
||||
cls.scan = scan |
|
||||
|
|
@ -1,307 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# encoding: utf-8 |
|
||||
# Ali Sabil, 2007 |
|
||||
|
|
||||
import os.path, shutil |
|
||||
import Task, Runner, Utils, Logs, Build, Node, Options |
|
||||
from TaskGen import extension, after, before |
|
||||
|
|
||||
EXT_VALA = ['.vala', '.gs'] |
|
||||
|
|
||||
class valac_task(Task.Task): |
|
||||
|
|
||||
vars = ("VALAC", "VALAC_VERSION", "VALAFLAGS") |
|
||||
before = ("cc", "cxx") |
|
||||
|
|
||||
def run(self): |
|
||||
env = self.env |
|
||||
inputs = [a.srcpath(env) for a in self.inputs] |
|
||||
valac = env['VALAC'] |
|
||||
vala_flags = env.get_flat('VALAFLAGS') |
|
||||
top_src = self.generator.bld.srcnode.abspath() |
|
||||
top_bld = self.generator.bld.srcnode.abspath(env) |
|
||||
|
|
||||
if env['VALAC_VERSION'] > (0, 1, 6): |
|
||||
cmd = [valac, '-C', '--quiet', vala_flags] |
|
||||
else: |
|
||||
cmd = [valac, '-C', vala_flags] |
|
||||
|
|
||||
if self.threading: |
|
||||
cmd.append('--thread') |
|
||||
|
|
||||
if self.profile: |
|
||||
cmd.append('--profile=%s' % self.profile) |
|
||||
|
|
||||
if self.target_glib: |
|
||||
cmd.append('--target-glib=%s' % self.target_glib) |
|
||||
|
|
||||
features = self.generator.features |
|
||||
|
|
||||
if 'cshlib' in features or 'cstaticlib' in features: |
|
||||
output_dir = self.outputs[0].bld_dir(env) |
|
||||
cmd.append('--library ' + self.target) |
|
||||
if env['VALAC_VERSION'] >= (0, 7, 0): |
|
||||
cmd.append('--header ' + os.path.join(output_dir, self.target + '.h')) |
|
||||
self.outputs.append(self.generator.path.find_or_declare(self.target + '.h')) |
|
||||
cmd.append('--basedir ' + top_src) |
|
||||
cmd.append('-d ' + top_bld) |
|
||||
if env['VALAC_VERSION'] > (0, 7, 2) and hasattr(self, 'gir'): |
|
||||
cmd.append('--gir=%s.gir' % self.gir) |
|
||||
|
|
||||
else: |
|
||||
output_dir = self.outputs[0].bld_dir(env) |
|
||||
cmd.append('-d %s' % output_dir) |
|
||||
|
|
||||
for vapi_dir in self.vapi_dirs: |
|
||||
cmd.append('--vapidir=%s' % vapi_dir) |
|
||||
|
|
||||
for package in self.packages: |
|
||||
cmd.append('--pkg %s' % package) |
|
||||
|
|
||||
for package in self.packages_private: |
|
||||
cmd.append('--pkg %s' % package) |
|
||||
|
|
||||
cmd.append(" ".join(inputs)) |
|
||||
result = self.generator.bld.exec_command(" ".join(cmd)) |
|
||||
|
|
||||
if not 'cprogram' in features: |
|
||||
# generate the .deps file |
|
||||
if self.packages: |
|
||||
filename = os.path.join(self.generator.path.abspath(env), "%s.deps" % self.target) |
|
||||
deps = open(filename, 'w') |
|
||||
for package in self.packages: |
|
||||
deps.write(package + '\n') |
|
||||
deps.close() |
|
||||
|
|
||||
# handle vala 0.1.6 who doesn't honor --directory for the generated .vapi |
|
||||
self._fix_output("../%s.vapi" % self.target) |
|
||||
# handle vala >= 0.1.7 who has a weid definition for --directory |
|
||||
self._fix_output("%s.vapi" % self.target) |
|
||||
# handle vala >= 0.2.0 who doesn't honor --directory for the generated .gidl |
|
||||
self._fix_output("%s.gidl" % self.target) |
|
||||
# handle vala >= 0.3.6 who doesn't honor --directory for the generated .gir |
|
||||
self._fix_output("%s.gir" % self.target) |
|
||||
if hasattr(self, 'gir'): |
|
||||
self._fix_output("%s.gir" % self.gir) |
|
||||
|
|
||||
first = None |
|
||||
for node in self.outputs: |
|
||||
if not first: |
|
||||
first = node |
|
||||
else: |
|
||||
if first.parent.id != node.parent.id: |
|
||||
# issue #483 |
|
||||
if env['VALAC_VERSION'] < (0, 7, 0): |
|
||||
shutil.move(first.parent.abspath(self.env) + os.sep + node.name, node.abspath(self.env)) |
|
||||
return result |
|
||||
|
|
||||
def install(self): |
|
||||
bld = self.generator.bld |
|
||||
features = self.generator.features |
|
||||
|
|
||||
if self.attr("install_path") and ("cshlib" in features or "cstaticlib" in features): |
|
||||
headers_list = [o for o in self.outputs if o.suffix() == ".h"] |
|
||||
vapi_list = [o for o in self.outputs if (o.suffix() in (".vapi", ".deps"))] |
|
||||
gir_list = [o for o in self.outputs if o.suffix() == ".gir"] |
|
||||
|
|
||||
for header in headers_list: |
|
||||
top_src = self.generator.bld.srcnode |
|
||||
package = self.env['PACKAGE'] |
|
||||
try: |
|
||||
api_version = Utils.g_module.API_VERSION |
|
||||
except AttributeError: |
|
||||
version = Utils.g_module.VERSION.split(".") |
|
||||
if version[0] == "0": |
|
||||
api_version = "0." + version[1] |
|
||||
else: |
|
||||
api_version = version[0] + ".0" |
|
||||
install_path = '${INCLUDEDIR}/%s-%s/%s' % (package, api_version, header.relpath_gen(top_src)) |
|
||||
bld.install_as(install_path, header, self.env) |
|
||||
bld.install_files('${DATAROOTDIR}/vala/vapi', vapi_list, self.env) |
|
||||
bld.install_files('${DATAROOTDIR}/gir-1.0', gir_list, self.env) |
|
||||
|
|
||||
def _fix_output(self, output): |
|
||||
top_bld = self.generator.bld.srcnode.abspath(self.env) |
|
||||
try: |
|
||||
src = os.path.join(top_bld, output) |
|
||||
dst = self.generator.path.abspath (self.env) |
|
||||
shutil.move(src, dst) |
|
||||
except: |
|
||||
pass |
|
||||
|
|
||||
@extension(EXT_VALA) |
|
||||
def vala_file(self, node): |
|
||||
valatask = getattr(self, "valatask", None) |
|
||||
# there is only one vala task and it compiles all vala files .. :-/ |
|
||||
if not valatask: |
|
||||
valatask = self.create_task('valac') |
|
||||
self.valatask = valatask |
|
||||
self.includes = Utils.to_list(getattr(self, 'includes', [])) |
|
||||
self.uselib = self.to_list(self.uselib) |
|
||||
valatask.packages = [] |
|
||||
valatask.packages_private = Utils.to_list(getattr(self, 'packages_private', [])) |
|
||||
valatask.vapi_dirs = [] |
|
||||
valatask.target = self.target |
|
||||
valatask.threading = False |
|
||||
valatask.install_path = self.install_path |
|
||||
valatask.profile = getattr (self, 'profile', 'gobject') |
|
||||
valatask.target_glib = None #Deprecated |
|
||||
|
|
||||
packages = Utils.to_list(getattr(self, 'packages', [])) |
|
||||
vapi_dirs = Utils.to_list(getattr(self, 'vapi_dirs', [])) |
|
||||
includes = [] |
|
||||
|
|
||||
if hasattr(self, 'uselib_local'): |
|
||||
local_packages = Utils.to_list(self.uselib_local) |
|
||||
seen = [] |
|
||||
while len(local_packages) > 0: |
|
||||
package = local_packages.pop() |
|
||||
if package in seen: |
|
||||
continue |
|
||||
seen.append(package) |
|
||||
|
|
||||
# check if the package exists |
|
||||
package_obj = self.name_to_obj(package) |
|
||||
if not package_obj: |
|
||||
raise Utils.WafError("object '%s' was not found in uselib_local (required by '%s')" % (package, self.name)) |
|
||||
|
|
||||
package_name = package_obj.target |
|
||||
package_node = package_obj.path |
|
||||
package_dir = package_node.relpath_gen(self.path) |
|
||||
|
|
||||
for task in package_obj.tasks: |
|
||||
for output in task.outputs: |
|
||||
if output.name == package_name + ".vapi": |
|
||||
valatask.set_run_after(task) |
|
||||
if package_name not in packages: |
|
||||
packages.append(package_name) |
|
||||
if package_dir not in vapi_dirs: |
|
||||
vapi_dirs.append(package_dir) |
|
||||
if package_dir not in includes: |
|
||||
includes.append(package_dir) |
|
||||
|
|
||||
if hasattr(package_obj, 'uselib_local'): |
|
||||
lst = self.to_list(package_obj.uselib_local) |
|
||||
lst.reverse() |
|
||||
local_packages = [pkg for pkg in lst if pkg not in seen] + local_packages |
|
||||
|
|
||||
valatask.packages = packages |
|
||||
for vapi_dir in vapi_dirs: |
|
||||
try: |
|
||||
valatask.vapi_dirs.append(self.path.find_dir(vapi_dir).abspath()) |
|
||||
valatask.vapi_dirs.append(self.path.find_dir(vapi_dir).abspath(self.env)) |
|
||||
except AttributeError: |
|
||||
Logs.warn("Unable to locate Vala API directory: '%s'" % vapi_dir) |
|
||||
|
|
||||
self.includes.append(node.bld.srcnode.abspath()) |
|
||||
self.includes.append(node.bld.srcnode.abspath(self.env)) |
|
||||
for include in includes: |
|
||||
try: |
|
||||
self.includes.append(self.path.find_dir(include).abspath()) |
|
||||
self.includes.append(self.path.find_dir(include).abspath(self.env)) |
|
||||
except AttributeError: |
|
||||
Logs.warn("Unable to locate include directory: '%s'" % include) |
|
||||
|
|
||||
if valatask.profile == 'gobject': |
|
||||
if hasattr(self, 'target_glib'): |
|
||||
Logs.warn ('target_glib on vala tasks is deprecated --vala-target-glib=MAJOR.MINOR from the vala tool options') |
|
||||
|
|
||||
if getattr(Options.options, 'vala_target_glib', None): |
|
||||
valatask.target_glib = Options.options.vala_target_glib |
|
||||
|
|
||||
if not 'GOBJECT' in self.uselib: |
|
||||
self.uselib.append('GOBJECT') |
|
||||
|
|
||||
if hasattr(self, 'threading'): |
|
||||
if valatask.profile == 'gobject': |
|
||||
valatask.threading = self.threading |
|
||||
if not 'GTHREAD' in self.uselib: |
|
||||
self.uselib.append('GTHREAD') |
|
||||
else: |
|
||||
#Vala doesn't have threading support for dova nor posix |
|
||||
Logs.warn("Profile %s does not have threading support" % valatask.profile) |
|
||||
|
|
||||
if hasattr(self, 'gir'): |
|
||||
valatask.gir = self.gir |
|
||||
|
|
||||
env = valatask.env |
|
||||
|
|
||||
output_nodes = [] |
|
||||
|
|
||||
c_node = node.change_ext('.c') |
|
||||
output_nodes.append(c_node) |
|
||||
self.allnodes.append(c_node) |
|
||||
|
|
||||
if env['VALAC_VERSION'] < (0, 7, 0): |
|
||||
output_nodes.append(node.change_ext('.h')) |
|
||||
else: |
|
||||
if not 'cprogram' in self.features: |
|
||||
output_nodes.append(self.path.find_or_declare('%s.h' % self.target)) |
|
||||
|
|
||||
if not 'cprogram' in self.features: |
|
||||
output_nodes.append(self.path.find_or_declare('%s.vapi' % self.target)) |
|
||||
if env['VALAC_VERSION'] > (0, 7, 2): |
|
||||
if hasattr(self, 'gir'): |
|
||||
output_nodes.append(self.path.find_or_declare('%s.gir' % self.gir)) |
|
||||
elif env['VALAC_VERSION'] > (0, 3, 5): |
|
||||
output_nodes.append(self.path.find_or_declare('%s.gir' % self.target)) |
|
||||
elif env['VALAC_VERSION'] > (0, 1, 7): |
|
||||
output_nodes.append(self.path.find_or_declare('%s.gidl' % self.target)) |
|
||||
if valatask.packages: |
|
||||
output_nodes.append(self.path.find_or_declare('%s.deps' % self.target)) |
|
||||
|
|
||||
valatask.inputs.append(node) |
|
||||
valatask.outputs.extend(output_nodes) |
|
||||
|
|
||||
def detect(conf): |
|
||||
min_version = (0, 1, 6) |
|
||||
min_version_str = "%d.%d.%d" % min_version |
|
||||
|
|
||||
valac = conf.find_program('valac', var='VALAC', mandatory=True) |
|
||||
|
|
||||
if not conf.env["HAVE_GOBJECT"]: |
|
||||
pkg_args = {'package': 'gobject-2.0', |
|
||||
'uselib_store': 'GOBJECT', |
|
||||
'args': '--cflags --libs'} |
|
||||
if getattr(Options.options, 'vala_target_glib', None): |
|
||||
pkg_args['atleast_version'] = Options.options.vala_target_glib |
|
||||
|
|
||||
conf.check_cfg(**pkg_args) |
|
||||
|
|
||||
if not conf.env["HAVE_GTHREAD"]: |
|
||||
pkg_args = {'package': 'gthread-2.0', |
|
||||
'uselib_store': 'GTHREAD', |
|
||||
'args': '--cflags --libs'} |
|
||||
if getattr(Options.options, 'vala_target_glib', None): |
|
||||
pkg_args['atleast_version'] = Options.options.vala_target_glib |
|
||||
|
|
||||
conf.check_cfg(**pkg_args) |
|
||||
|
|
||||
try: |
|
||||
output = Utils.cmd_output(valac + " --version", silent=True) |
|
||||
version = output.split(' ', 1)[-1].strip().split(".")[0:3] |
|
||||
version = [int(x) for x in version] |
|
||||
valac_version = tuple(version) |
|
||||
except Exception: |
|
||||
valac_version = (0, 0, 0) |
|
||||
|
|
||||
conf.check_message('program version', |
|
||||
'valac >= ' + min_version_str, |
|
||||
valac_version >= min_version, |
|
||||
"%d.%d.%d" % valac_version) |
|
||||
|
|
||||
conf.check_tool('gnu_dirs') |
|
||||
|
|
||||
if valac_version < min_version: |
|
||||
conf.fatal("valac version too old to be used with this tool") |
|
||||
return |
|
||||
|
|
||||
conf.env['VALAC_VERSION'] = valac_version |
|
||||
conf.env['VALAFLAGS'] = '' |
|
||||
|
|
||||
def set_options (opt): |
|
||||
valaopts = opt.add_option_group('Vala Compiler Options') |
|
||||
valaopts.add_option ('--vala-target-glib', default=None, |
|
||||
dest='vala_target_glib', metavar='MAJOR.MINOR', |
|
||||
help='Target version of glib for Vala GObject code generation') |
|
||||
|
|
Loading…
Reference in new issue