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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
|
#
# Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net>
#
# This file is part of DCP-o-matic.
#
# DCP-o-matic is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# DCP-o-matic is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
#
from __future__ import print_function
import os
import glob
from waflib import Logs
import i18n
def description(tool, variant):
descriptions = {
'dcpomatic': 'DCP-o-matic',
'dcpomatic_batch': 'DCP-o-matic Batch Converter',
'dcpomatic_server': 'DCP-o-matic Encode Server',
'dcpomatic_kdm': 'DCP-o-matic KDM Creator',
'dcpomatic_player': 'DCP-o-matic Player',
'dcpomatic_playlist': 'DCP-o-matic Playlist Editor',
'dcpomatic_combiner': 'DCP-o-matic Combiner',
'dcpomatic_verifier': 'DCP-o-matic Verifier',
}
return descriptions[tool] if tool in descriptions else tool
def make_rc(tool, icon, variant):
filename = 'build/src/tools/%s.rc' % tool
with open(filename, 'w') as rc:
if tool == 'dcpomatic_disk_writer':
print('#include "winuser.h"', file=rc)
print('1 RT_MANIFEST "dcpomatic2_disk_writer.exe.manifest"', file=rc)
with open("build/src/tools/dcpomatic2_disk_writer.exe.manifest", "w") as manifest:
print("""
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="dcpomatic2_disk_writer" type="win32"/>
<description>DCP-o-matic Disk Writer</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>""", file=manifest)
else:
print("""
id ICON "../../graphics/windows/%s"
#include "wx-3.1/wx/msw/wx.rc"
VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,0,0,2
PRODUCTVERSION 0,0,0,2
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
{
BLOCK "StringFileInfo"
{
BLOCK "040904b0"
{
VALUE "FileDescription", "%s\\0"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 0x409, 1200
}
}
""" % (icon, description(tool, variant)), file=rc)
return filename
def configure(conf):
if conf.env.TARGET_WINDOWS_64 or conf.env.TARGET_WINDOWS_32:
conf.env.append_value('CXXFLAGS', ['-mconsole'])
conf.env.append_value('LINKFLAGS', ['-mconsole'])
def build(bld):
uselib = 'BOOST_THREAD BOOST_DATETIME DCP XMLSEC CXML XMLPP AVFORMAT AVFILTER AVCODEC '
uselib += 'AVUTIL SWSCALE SWRESAMPLE POSTPROC CURL BOOST_FILESYSTEM SSH ZIP CAIROMM FONTCONFIG PANGOMM SUB '
uselib += 'SNDFILE SAMPLERATE BOOST_REGEX ICU NETTLE RTAUDIO PNG JPEG LEQM_NRT SQLITE3 '
if bld.env.ENABLE_DISK:
if bld.env.TARGET_LINUX:
uselib += 'POLKIT '
uselib += 'LWEXT4 '
if bld.env.ENABLE_DISK or bld.env.ENABLE_CUCUMBER:
uselib += 'NANOMSG '
if bld.env.TARGET_WINDOWS_64 or bld.env.TARGET_WINDOWS_32:
uselib += 'WINSOCK2 DBGHELP SHLWAPI MSWSOCK BOOST_LOCALE WINSOCK2 OLE32 DSOUND WINMM KSUSER SETUPAPI UUID '
if bld.env.TARGET_LINUX:
uselib += 'DL '
cli_tools = ['dcpomatic_cli', 'dcpomatic_server_cli', 'server_test', 'dcpomatic_kdm_cli', 'dcpomatic_create', 'dcpomatic_map']
if bld.env.ENABLE_DISK and not bld.env.DISABLE_GUI:
cli_tools.append('dcpomatic_disk_writer')
try:
os.makedirs('build/src/tools')
except:
pass
for t in cli_tools:
obj = bld(features='cxx cxxprogram')
obj.uselib = uselib
obj.includes = ['..']
obj.use = ['libdcpomatic2']
obj.source = '%s.cc' % t
if (bld.env.TARGET_WINDOWS_64 or bld.env.TARGET_WINDOWS_32) and t == 'dcpomatic_disk_writer':
obj.source += ' ../../%s' % (make_rc(t, None, bld.env.VARIANT))
# Prevent a console window opening when we start dcpomatic2_disk_writer
obj.env.append_value('LINKFLAGS', '-Wl,-subsystem,windows')
obj.target = t.replace('dcpomatic', 'dcpomatic2')
if t == 'server_test':
obj.install_path = None
gui_tools = []
if not bld.env.DISABLE_GUI:
gui_tools = ['dcpomatic',
'dcpomatic_batch',
'dcpomatic_server',
'dcpomatic_kdm',
'dcpomatic_player',
'dcpomatic_playlist',
'dcpomatic_combiner',
'dcpomatic_editor',
'dcpomatic_verifier']
if bld.env.ENABLE_DISK:
gui_tools.append('dcpomatic_disk')
for t in gui_tools:
obj = bld(features='cxx cxxprogram')
obj.uselib = uselib
if bld.env.BUILD_STATIC or bld.env.TARGET_LINUX:
obj.uselib += ' GTK'
obj.uselib += ' WXWIDGETS'
if not bld.env.TARGET_OSX:
obj.uselib += ' GL GLU'
if bld.env.TARGET_LINUX:
obj.uselib += ' X11'
if bld.env.TARGET_WINDOWS_64 or bld.env.TARGET_WINDOWS_32:
obj.uselib += ' GLEW'
obj.includes = ['..']
obj.use = ['libdcpomatic2', 'libdcpomatic2-wx']
obj.source = '%s.cc' % t
if bld.env.TARGET_WINDOWS_64 or bld.env.TARGET_WINDOWS_32:
obj.source += ' ../../%s' % make_rc(t, t.replace("dcpomatic", "dcpomatic2") + ".ico", bld.env.VARIANT)
obj.target = t.replace('dcpomatic', 'dcpomatic2')
i18n.po_to_mo(os.path.join('src', 'tools'), 'dcpomatic2', bld)
def pot(bld):
cc = """
dcpomatic_batch.cc
dcpomatic.cc
dcpomatic_combiner.cc
dcpomatic_disk.cc
dcpomatic_editor.cc
dcpomatic_kdm.cc
dcpomatic_server.cc
dcpomatic_player.cc
dcpomatic_playlist.cc
dcpomatic_server.cc
"""
i18n.pot(os.path.join('src', 'tools'), cc, 'dcpomatic')
def pot_merge(bld):
i18n.pot_merge(os.path.join('src', 'tools'), 'dcpomatic')
|