forked from ultravideo/kvazaar
-
Notifications
You must be signed in to change notification settings - Fork 0
/
SConstruct
116 lines (98 loc) · 3.68 KB
/
SConstruct
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
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
""" SConstruct file fore building Kvazaar with Scons.
This file defines two targets, x86 and x64, and builds construction
environments for both.
TODO:
- add debug builds
- whole program optimization for gcc
"""
import os
import platform
Help("""
Type: 'scons x86' to build a 32-bit release version,
'scons x64' to build a 64-bit release version.
'scons x86 x64 -c' to clear all build directories.
""")
# Create construction environments for 32 and 64 bit builds.
# Visual studio needs the architecture to be set in this stage. It can not be
# modified later.
env_x86 = Environment(
#tools=['mingw'],
ASCOM='yasm $ASFLAGS -o $TARGET $SOURCES',
ENV={'PATH': os.environ['PATH']}, # to find yasm on Windows
TARGET_ARCH='x86', # for Visual Studio
)
env_x64 = Environment(
#tools=['mingw'],
ASCOM='yasm $ASFLAGS -o $TARGET $SOURCES',
ENV={'PATH': os.environ['PATH']}, # to find yasm on Windows
TARGET_ARCH='amd64', # for Visual Studio
)
# YASM flags for different architectures. The object file format and name
# mangling must be the same as used by the C compiler for that OS.
# Indexed by platform.system().
yasm_flags = {
'Windows': {
'x86': '-f win32 -DPREFIX',
'x64': '-f win64'},
'Darwin': {
'x86': '-f macho32 -DPREFIX',
'x64': '-f macho64 -DPREFIX'},
'Linux': { # Flags for Unix-like.
'x86': '-f elf32',
'x64': '-f elf64'},
'all': { # Flags for all systems.
'x86': ' -DARCH_X86_64=0 -m x86',
'x64': ' -DARCH_X86_64=1 -m amd64'},
}
# Set yasm flags for OS and architecture.
target_yasm_flags = yasm_flags.get(platform.system(), yasm_flags['Linux'])
env_x86.Replace(ASFLAGS=target_yasm_flags['x86'])
env_x64.Replace(ASFLAGS=target_yasm_flags['x64'])
env_x86.Append(ASFLAGS=yasm_flags['all']['x86'])
env_x64.Append(ASFLAGS=yasm_flags['all']['x64'])
# Try and deal with all the remaining compiler specific differences that I
# really with scons would handle.
if 'MSVS' in env_x86:
# /MD = multithreaded DLL runtime
# /Ox = full optimization, sets /Ob2, /Og, /Oi, /Ot, /Oy
# /GL = enable whole program optimization
# /LTCG = link time code generation
# /arch:SSE2 = use SSE2 (x86 only)
# win32-pthreads is assumed to be in same level as kvazaar in dir pthreads
env_x86.Append(
CCFLAGS=r'/MD /Ox /GL /arch:SSE2 /I"..\..\pthreads\include"',
LINKFLAGS=r'/LTCG /LIBPATH:"..\..\pthreads\x86" "pthreadVC2.lib"')
env_x64.Append(
CCFLAGS=r'/MD /Ox /GL /I"..\..\pthreads\include"',
LINKFLAGS=r'/LTCG /LIBPATH:"..\pthreads\x64" "pthreadVC2.lib"')
else:
# GCC flags
# -m for arch, -O2 for optimization, -lm for math lib
env_x86.MergeFlags('-m32 -O2 -lm -march=native -pthread')
env_x64.MergeFlags('-m64 -O2 -lm -march=native -pthread')
# VS2010 linker and mingw64 need TMP.
if 'TMP' in os.environ:
env_x86['ENV']['TMP'] = os.environ['TMP']
env_x64['ENV']['TMP'] = os.environ['TMP']
env_x86.MergeFlags('-I. -Iextras -Istrategies')
env_x64.MergeFlags('-I. -Iextras -Istrategies')
preprocessor_defines = ARGUMENTS.get('D', '')
if preprocessor_defines:
for define in preprocessor_defines.split():
env_x86.MergeFlags('-D' + define)
env_x64.MergeFlags('-D' + define)
# Declare build targets.
x86 = SConscript('src/SConscript',
exports={'env': env_x86},
variant_dir='scons_build_x86',
duplicate=False)
Alias('x86', x86)
x64 = SConscript('src/SConscript',
exports={'env': env_x64},
variant_dir='scons_build_x64',
duplicate=False)
Alias('x64', x64)
if platform.machine().endswith('64'):
Default(x64)
else:
Default(x86)