c_aliases.py 3.16 KB
Newer Older
1
2
#!/usr/bin/env python
# encoding: utf-8
Karl Linden's avatar
Karl Linden committed
3
# Thomas Nagy, 2005-2015 (ita)
4
5
6
7

"base for all c/c++ programs and libraries"

import os, sys, re
Karl Linden's avatar
Karl Linden committed
8
from waflib import Utils, Build, Errors
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from waflib.Configure import conf

def get_extensions(lst):
	"""
	:param lst: files to process
	:list lst: list of string or :py:class:`waflib.Node.Node`
	:return: list of file extensions
	:rtype: list of string
	"""
	ret = []
	for x in Utils.to_list(lst):
		try:
			if not isinstance(x, str):
				x = x.name
			ret.append(x[x.rfind('.') + 1:])
		except Exception:
			pass
	return ret

def sniff_features(**kw):
	"""
	Look at the source files and return the features for a task generator (mainly cc and cxx)::

		snif_features(source=['foo.c', 'foo.cxx'], type='shlib')
		# returns  ['cxx', 'c', 'cxxshlib', 'cshlib']

	:param source: source files to process
	:type source: list of string or :py:class:`waflib.Node.Node`
	:param type: object type in *program*, *shlib* or *stlib*
	:type type: string
	:return: the list of features for a task generator processing the source files
	:rtype: list of string
	"""
	exts = get_extensions(kw['source'])
	type = kw['_type']
	feats = []

	# watch the order, cxx will have the precedence
Karl Linden's avatar
Karl Linden committed
47
48
49
50
	for x in 'cxx cpp c++ cc C'.split():
		if x in exts:
			feats.append('cxx')
			break
51
52
53
54

	if 'c' in exts or 'vala' in exts:
		feats.append('c')

Karl Linden's avatar
Karl Linden committed
55
56
57
58
59
	for x in 'f f90 F F90 for FOR'.split():
		if x in exts:
			feats.append('fc')
			break

60
61
62
63
64
65
66
67
	if 'd' in exts:
		feats.append('d')

	if 'java' in exts:
		feats.append('java')
		return 'java'

	if type in ('program', 'shlib', 'stlib'):
Karl Linden's avatar
Karl Linden committed
68
		will_link = False
69
		for x in feats:
Karl Linden's avatar
Karl Linden committed
70
			if x in ('cxx', 'd', 'fc', 'c'):
71
				feats.append(x + type)
Karl Linden's avatar
Karl Linden committed
72
73
74
				will_link = True
		if not will_link and not kw.get('features', []):
			raise Errors.WafError('Cannot link from %r, try passing eg: features="cprogram"?' % kw)
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
	return feats

def set_features(kw, _type):
	kw['_type'] = _type
	kw['features'] = Utils.to_list(kw.get('features', [])) + Utils.to_list(sniff_features(**kw))

@conf
def program(bld, *k, **kw):
	"""
	Alias for creating programs by looking at the file extensions::

		def build(bld):
			bld.program(source='foo.c', target='app')
			# equivalent to:
			# bld(features='c cprogram', source='foo.c', target='app')

	"""
	set_features(kw, 'program')
	return bld(*k, **kw)

@conf
def shlib(bld, *k, **kw):
	"""
	Alias for creating shared libraries by looking at the file extensions::

		def build(bld):
			bld.shlib(source='foo.c', target='app')
			# equivalent to:
			# bld(features='c cshlib', source='foo.c', target='app')

	"""
	set_features(kw, 'shlib')
	return bld(*k, **kw)

@conf
def stlib(bld, *k, **kw):
	"""
	Alias for creating static libraries by looking at the file extensions::

		def build(bld):
			bld.stlib(source='foo.cpp', target='app')
			# equivalent to:
			# bld(features='cxx cxxstlib', source='foo.cpp', target='app')

	"""
	set_features(kw, 'stlib')
	return bld(*k, **kw)

@conf
def objects(bld, *k, **kw):
	"""
	Alias for creating object files by looking at the file extensions::

		def build(bld):
			bld.objects(source='foo.c', target='app')
			# equivalent to:
			# bld(features='c', source='foo.c', target='app')

	"""
	set_features(kw, 'objects')
	return bld(*k, **kw)