1
2
3
4
5
6
7
8
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import os
build_path = 'build'
supported_architectures = ['x64', 'x86', 'arm', 'mips', 'ppc']
c_compilers = {'x64': 'gcc',
'x86': './dockcross-linux-x86 gcc',
'arm': 'arm-linux-gnueabi-gcc',
'mips': 'mips-linux-gnu-gcc',
'ppc': 'powerpc-linux-gnu-gcc'}
cpp_compilers = {'x64': 'g++',
'x86': './dockcross-linux-x86 g++',
'arm': 'arm-linux-gnueabi-g++-5',
'mips': 'mips-linux-gnu-g++-5',
'ppc': 'powerpc-linux-gnu-g++-5'}
c_flags = {'x64': '-g -fno-stack-protector -std=c11',
'x86': '-g -m32 -fno-stack-protector -std=c11',
'arm': '-g -fno-stack-protector -std=c11',
'mips': '-g -fno-stack-protector -std=c11',
'ppc': '-g -fno-stack-protector -std=c11'}
cpp_flags = {'x64': '-g -fno-stack-protector',
'x86': '-g -m32 -fno-stack-protector',
'arm': '-g -fno-stack-protector',
'mips': '-g -fno-stack-protector',
'ppc': '-g -fno-stack-protector'}
def which(pgm):
path=os.getenv('PATH')
for p in path.split(os.path.pathsep):
p=os.path.join(p,pgm)
if os.path.exists(p) and os.access(p,os.X_OK):
return p
def optimize(filename):
optimize_me = ['cwe_476.c']
if filename in optimize_me:
return ' -O3'
else:
return ' -O0'
def compile_only_on_x64(filename, arch):
only_x64 = ['cwe_782.c']
return filename in only_x64 and arch != 'x64'
def build_c(arch):
if which(c_compilers[arch]) is not None:
c_programs = Glob('*.c')
for p in c_programs:
if compile_only_on_x64(str(p), arch):
print('Skipping architecture %s for %s' % (arch, str(p)))
continue
env = Environment(CC = c_compilers[arch],
CCFLAGS = c_flags[arch] + optimize(str(p)))
print(str(p))
env.Program('%s/%s_%s.out' % (build_path, str(p).split('.')[0], arch),
env.Object(target='%s/%s_%s.o' % (build_path, str(p), arch),
source='%s/%s' % (build_path, str(p))))
else:
print('Compiler %s for architecture %s is not installed!' % (c_compilers[arch], arch))
def build_cpp(arch):
if which(cpp_compilers[arch]) is not None:
cpp_programs = Glob('*.cpp')
for p in cpp_programs:
env = Environment(CC = cpp_compilers[arch],
CCFLAGS = cpp_flags[arch] + optimize(str(p)))
env.Program('%s/%s_%s.out' % (build_path, str(p).split('.')[0], arch),
'%s/%s' % (build_path, str(p)))
else:
print('Compiler %s for architecture %s is not installed!' % (cpp_compilers[arch], arch))
VariantDir(build_path, '.', duplicate=0)
for arch in supported_architectures:
print('Building for architecture %s' % arch)
build_c(arch)
build_cpp(arch)