Replace DCP parser with basic version that uses libdcp.
[libsub.git] / wscript
1 import subprocess
2 import os
3 from waflib import Context
4
5 APPNAME = 'libsub'
6 VERSION = '1.2.4devel'
7 API_VERSION = '-1.0'
8
9 def options(opt):
10     opt.load('compiler_cxx')
11     opt.add_option('--enable-debug', action='store_true', default=False, help='build with debugging information and without optimisation')
12     opt.add_option('--static', action='store_true', default=False, help='build libsub statically and link statically to cxml and dcp')
13     opt.add_option('--target-windows', action='store_true', default=False, help='set up to do a cross-compile to make a Windows package')
14     opt.add_option('--disable-tests', action='store_true', default=False, help='disable building of tests')
15
16 def configure(conf):
17     conf.load('compiler_cxx')
18     conf.env.append_value('CXXFLAGS', ['-Wall', '-Wextra', '-D_FILE_OFFSET_BITS=64', '-D__STDC_FORMAT_MACROS'])
19     conf.env.append_value('CXXFLAGS', ['-DLIBSUB_VERSION="%s"' % VERSION])
20
21     conf.env.ENABLE_DEBUG = conf.options.enable_debug
22     conf.env.STATIC = conf.options.static
23     conf.env.TARGET_WINDOWS = conf.options.target_windows
24     conf.env.DISABLE_TESTS = conf.options.disable_tests
25     conf.env.API_VERSION = API_VERSION
26
27     if conf.options.enable_debug:
28         conf.env.append_value('CXXFLAGS', '-g')
29     else:
30         conf.env.append_value('CXXFLAGS', '-O3')
31
32     # Disable libxml++ deprecation warnings for now
33     conf.env.append_value('CXXFLAGS', ['-Wno-deprecated-declarations'])
34
35     conf.check_cfg(package='openssl', args='--cflags --libs', uselib_store='OPENSSL', mandatory=True)
36
37     if conf.options.static:
38         conf.check_cfg(package='libcxml', atleast_version='0.14.0', args='--cflags', uselib_store='CXML', mandatory=True)
39         conf.env.HAVE_CXML = 1
40         conf.env.LIB_CXML = ['glibmm-2.4', 'glib-2.0', 'pcre', 'sigc-2.0', 'rt', 'xml++-2.6', 'xml2', 'pthread', 'lzma', 'dl', 'z']
41         conf.env.STLIB_CXML = ['cxml']
42         conf.check_cfg(package='libdcp-1.0', atleast_version='1.4.4', args='--cflags', uselib_store='DCP', mandatory=True)
43         conf.env.HAVE_DCP = 1
44         conf.env.STLIB_DCP = ['dcp-1.0']
45         conf.env.LIB_DCP = ['ssl', 'crypto']
46     else:
47         conf.check_cfg(package='libcxml', atleast_version='0.15.2', args='--cflags --libs', uselib_store='CXML', mandatory=True)
48         conf.check_cfg(package='libdcp-1.0', atleast_version='1.4.4', args='--cflags --libs', uselib_store='DCP', mandatory=True)
49
50     conf.env.DEFINES_DCP = [f.replace('\\', '') for f in conf.env.DEFINES_DCP]
51
52     boost_lib_suffix = ''
53     if conf.env.TARGET_WINDOWS:
54         boost_lib_suffix = '-mt'
55
56     conf.check_cxx(fragment="""
57                             #include <boost/version.hpp>\n
58                             #if BOOST_VERSION < 104500\n
59                             #error boost too old\n
60                             #endif\n
61                             int main(void) { return 0; }\n
62                             """,
63                    mandatory=True,
64                    msg='Checking for boost library >= 1.45',
65                    okmsg='yes',
66                    errmsg='too old\nPlease install boost version 1.45 or higher.')
67
68     conf.check_cxx(fragment="""
69                             #include <boost/filesystem.hpp>\n
70                             int main() { boost::filesystem::copy_file ("a", "b"); }\n
71                             """,
72                    msg='Checking for boost filesystem library',
73                    libpath='/usr/local/lib',
74                    lib=['boost_filesystem%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix],
75                    uselib_store='BOOST_FILESYSTEM')
76
77     conf.check_cxx(fragment="""
78                             #include <boost/locale.hpp>\n
79                             int main() { boost::locale::conv::to_utf<char> ("a", "cp850"); }\n
80                             """,
81                    msg='Checking for boost locale library',
82                    libpath='/usr/local/lib',
83                    lib=['boost_locale%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix],
84                    uselib_store='BOOST_LOCALE')
85
86     conf.check_cxx(fragment="""
87                             #include <boost/regex.hpp>\n
88                             int main() { boost::regex re ("foo"); }\n
89                             """,
90                    msg='Checking for boost regex library',
91                    libpath='/usr/local/lib',
92                    lib=['boost_regex%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix],
93                    uselib_store='BOOST_REGEX')
94
95     if not conf.env.DISABLE_TESTS:
96         conf.recurse('test')
97
98     # libxml++ 2.39.1 and later must be built with -std=c++11
99     libxmlpp_version = conf.cmd_and_log(['pkg-config', '--modversion', 'libxml++-2.6'], output=Context.STDOUT, quiet=Context.BOTH)
100     s = libxmlpp_version.split('.')
101     v = (int(s[0]) << 16) | (int(s[1]) << 8) | int(s[2])
102     if v >= 0x022701:
103         conf.env.append_value('CXXFLAGS', '-std=c++11')
104
105 def build(bld):
106     create_version_cc(bld, VERSION)
107
108     if bld.env.TARGET_WINDOWS:
109         boost_lib_suffix = '-mt'
110     else:
111         boost_lib_suffix = ''
112
113     bld(source='libsub%s.pc.in' % bld.env.API_VERSION,
114         version=VERSION,
115         includedir='%s/include/libsub%s' % (bld.env.PREFIX, bld.env.API_VERSION),
116         libs="-L${libdir} -lsub%s -lboost_system%s" % (bld.env.API_VERSION, boost_lib_suffix),
117         install_path='${LIBDIR}/pkgconfig')
118
119     bld.recurse('src')
120     if not bld.env.DISABLE_TESTS:
121         bld.recurse('test')
122     bld.recurse('tools')
123
124     bld.add_post_fun(post)
125
126 def dist(ctx):
127     ctx.excl = 'TODO core *~ .git build .waf* .lock* doc/*~ src/*~ test/ref/*~ __pycache__ GPATH GRTAGS GSYMS GTAGS'
128
129 def create_version_cc(bld, version):
130     if os.path.exists('.git'):
131         cmd = "LANG= git log --abbrev HEAD^..HEAD ."
132         output = subprocess.Popen(cmd, shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0].splitlines()
133         o = output[0].decode('utf-8')
134         commit = o.replace ("commit ", "")[0:10]
135     else:
136         commit = "release"
137
138     try:
139         text =  '#include "version.h"\n'
140         text += 'char const * sub::git_commit = \"%s\";\n' % commit
141         text += 'char const * sub::version = \"%s\";\n' % version
142         if bld.env.ENABLE_DEBUG:
143             debug_string = 'true'
144         else:
145             debug_string = 'false'
146         text += 'bool const built_with_debug = %s;\n' % debug_string
147         print('Writing version information to src/version.cc')
148         o = open('src/version.cc', 'w')
149         o.write(text)
150         o.close()
151     except IOError:
152         print('Could not open src/version.cc for writing\n')
153         sys.exit(-1)
154
155 def post(ctx):
156     if ctx.cmd == 'install':
157         ctx.exec_command('/sbin/ldconfig')
158
159 def tags(bld):
160     os.system('etags src/*.cc src/*.h')