X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=wscript;h=3c2e0bb00db5e6bda1d001e560636cc1c83dc024;hb=refs%2Fheads%2Fv2.17.x;hp=8313a1f705999e2515a0dd8c876dfe7519f02036;hpb=32dcd32b2c87766a1248bb078826ce9b83efacc4;p=dcpomatic.git diff --git a/wscript b/wscript index 8313a1f70..97fbc3fa2 100644 --- a/wscript +++ b/wscript @@ -35,20 +35,20 @@ except ImportError: from waflib import Logs, Context APPNAME = 'dcpomatic' -libdcp_version = '1.8.73' -libsub_version = '1.6.42' +libdcp_version = '1.8.100' +libsub_version = '1.6.49' -this_version = subprocess.Popen(shlex.split('git tag -l --points-at HEAD'), stdout=subprocess.PIPE).communicate()[0] -last_version = subprocess.Popen(shlex.split('git describe --tags --match v* --abbrev=0'), stdout=subprocess.PIPE).communicate()[0] +this_version = subprocess.Popen(['git', 'tag', '-l', '--points-at', 'HEAD'], stdout=subprocess.PIPE).communicate()[0] +git_head = subprocess.Popen(['git', 'rev-parse', '--short=9', 'HEAD'], stdout=subprocess.PIPE).communicate()[0] # Python 2/3 compatibility; I don't really understand what's going on here if not isinstance(this_version, str): this_version = this_version.decode('utf-8') -if not isinstance(last_version, str): - last_version = last_version.decode('utf-8') +if not isinstance(git_head, str): + git_head = git_head.decode('utf-8') -if this_version == '' or this_version == 'merged-to-main': - VERSION = '%sdevel' % last_version[1:].strip() +if this_version == '': + VERSION = git_head.strip() else: VERSION = this_version[1:].strip() @@ -61,7 +61,6 @@ def options(opt): opt.add_option('--disable-tests', action='store_true', default=False, help='disable building of tests') opt.add_option('--target-windows-64', action='store_true', default=False, help='set up to do a cross-compile for Windows 64-bit') opt.add_option('--target-windows-32', action='store_true', default=False, help='set up to do a cross-compile for Windows 32-bit') - opt.add_option('--target-macos-arm64', action='store_true', default=False, help='set up to do a cross-compile for macOS arm64') opt.add_option('--static-dcpomatic', action='store_true', default=False, help='link to components of DCP-o-matic statically') opt.add_option('--static-boost', action='store_true', default=False, help='link statically to Boost') opt.add_option('--static-wxwidgets', action='store_true', default=False, help='link statically to wxWidgets') @@ -76,9 +75,13 @@ def options(opt): opt.add_option('--workaround-gssapi', action='store_true', default=False, help='link to gssapi_krb5') opt.add_option('--use-lld', action='store_true', default=False, help='use lld linker') opt.add_option('--enable-disk', action='store_true', default=False, help='build dcpomatic2_disk tool; requires Boost process, lwext4 and nanomsg libraries') + opt.add_option('--enable-grok', action='store_true', default=False, help='build with support for grok J2K encoder') opt.add_option('--warnings-are-errors', action='store_true', default=False, help='build with -Werror') opt.add_option('--wx-config', help='path to wx-config') opt.add_option('--enable-asan', action='store_true', help='build with asan') + opt.add_option('--disable-more-warnings', action='store_true', default=False, help='disable some warnings raised by Xcode 15 with the 2.16 branch') + opt.add_option('--c++17', action='store_true', default=False, help='build with C++17 and libxml++-4.0') + opt.add_option('--variant', help="build with variant") def configure(conf): conf.load('compiler_cxx') @@ -86,6 +89,17 @@ def configure(conf): if conf.options.target_windows_64 or conf.options.target_windows_32: conf.load('winres') + if vars(conf.options)['c++17']: + cpp_std = '17' + conf.env.XMLPP_API = '4.0' + conf.env.PANGOMM_API = '2.48' + conf.env.CAIROMM_API = '1.16' + else: + cpp_std = '11' + conf.env.XMLPP_API = '2.6' + conf.env.PANGOMM_API = '1.4' + conf.env.CAIROMM_API = '1.0' + # Save conf.options that we need elsewhere in conf.env conf.env.DISABLE_GUI = conf.options.disable_gui conf.env.DISABLE_TESTS = conf.options.disable_tests @@ -97,10 +111,14 @@ def configure(conf): conf.env.DEBUG = conf.options.enable_debug conf.env.STATIC_DCPOMATIC = conf.options.static_dcpomatic conf.env.ENABLE_DISK = conf.options.enable_disk + conf.env.ENABLE_GROK = conf.options.enable_grok if conf.options.destdir == '': conf.env.INSTALL_PREFIX = conf.options.prefix else: conf.env.INSTALL_PREFIX = conf.options.destdir + conf.env.VARIANT = conf.options.variant if conf.options.variant else "dcpomatic" + + conf.check_cxx(cxxflags=['-msse', '-mfpmath=sse'], msg='Checking for SSE support', mandatory=False, define_name='SSE') # Common CXXFLAGS conf.env.append_value('CXXFLAGS', ['-D__STDC_CONSTANT_MACROS', @@ -110,24 +128,28 @@ def configure(conf): '-Wall', '-Wextra', '-Wwrite-strings', - # These next 5 are for Xcode 15.0.1 with the v2.16.x-era - # dependencies; maybe they aren't necessary when building - # v2.1{7,8}.x + # getMessengerLogger() in the grok code triggers these warnings + '-Wno-nonnull', '-Wno-error=deprecated', - '-Wno-deprecated-builtins', - '-Wno-deprecated-declarations', - '-Wno-enum-constexpr-conversion', - '-Wno-deprecated-copy', # I tried and failed to ignore these with _Pragma '-Wno-ignored-qualifiers', '-D_FILE_OFFSET_BITS=64', - '-std=c++11']) + '-std=c++' + cpp_std]) + + if conf.options.disable_more_warnings: + # These are for Xcode 15.0.1 with the v2.16.x-era + # dependencies; maybe they aren't necessary when building + # v2.1{7,8}.x + conf.env.append_value('CXXFLAGS', ['-Wno-deprecated-builtins', + '-Wno-deprecated-declarations', + '-Wno-enum-constexpr-conversion', + '-Wno-deprecated-copy']) if conf.options.warnings_are_errors: conf.env.append_value('CXXFLAGS', '-Werror') - if not conf.options.target_macos_arm64: - conf.env.append_value('CXXFLAGS', '-msse') + if conf.env.SSE: + conf.env.append_value('CXXFLAGS', ['-msse', '-mfpmath=sse']) if conf.options.enable_asan: conf.env.append_value('CXXFLAGS', '-fsanitize=address') @@ -140,8 +162,10 @@ def configure(conf): conf.env.append_value('CXXFLAGS', ['-Wno-cast-function-type']) # Most gccs still give these warnings from boost::optional conf.env.append_value('CXXFLAGS', ['-Wno-maybe-uninitialized']) - if int(gcc[0]) > 4: + if int(gcc[0]) > 8: # gcc 4.8.5 on Centos 7 does not have this warning + # gcc 7.5.0 on Ubuntu 18.04 and gcc 8.3.0 on Debian 10 do, but + # I didn't manage to turn it back off again with a pragma conf.env.append_value('CXXFLAGS', ['-Wsuggest-override']) if conf.options.enable_debug: @@ -152,6 +176,9 @@ def configure(conf): if conf.options.enable_disk: conf.env.append_value('CXXFLAGS', '-DDCPOMATIC_DISK') + if conf.options.enable_grok: + conf.env.append_value('CXXFLAGS', '-DDCPOMATIC_GROK') + if conf.options.use_lld: try: conf.find_program('ld.lld') @@ -169,7 +196,6 @@ def configure(conf): conf.env.append_value('CXXFLAGS', '-DWIN32_LEAN_AND_MEAN') conf.env.append_value('CXXFLAGS', '-DBOOST_USE_WINDOWS_H') conf.env.append_value('CXXFLAGS', '-DBOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN') - conf.env.append_value('CXXFLAGS', '-mfpmath=sse') conf.env.append_value('CXXFLAGS', '-Wcast-align') wxrc = os.popen('wx-config --rescomp').read().split()[1:] conf.env.append_value('WINRCFLAGS', wxrc) @@ -193,7 +219,6 @@ def configure(conf): int main() { std::locale::global (boost::locale::generator().generate ("")); }\n """, msg='Checking for boost locale library', - libpath='/usr/local/lib', lib=['boost_locale%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix], uselib_store='BOOST_LOCALE') @@ -206,7 +231,6 @@ def configure(conf): # Linux if conf.env.TARGET_LINUX: - conf.env.append_value('CXXFLAGS', '-mfpmath=sse') conf.env.append_value('CXXFLAGS', '-DLINUX_LOCALE_PREFIX="%s/share/locale"' % conf.env['INSTALL_PREFIX']) conf.env.append_value('CXXFLAGS', '-DLINUX_SHARE_PREFIX="%s/share"' % conf.env['INSTALL_PREFIX']) conf.env.append_value('CXXFLAGS', '-DDCPOMATIC_LINUX') @@ -217,7 +241,6 @@ def configure(conf): if conf.env.TARGET_OSX: conf.env.append_value('CXXFLAGS', ['-DDCPOMATIC_OSX', '-DGL_SILENCE_DEPRECATION']) conf.env.append_value('LINKFLAGS', '-headerpad_max_install_names') - conf.env.append_value('LINKFLAGS', '-llzma') # # Dependencies. @@ -228,6 +251,16 @@ def configure(conf): # linked and others that should be dynamic. This doesn't work too well with waf # as it wants them separate. + def check_via_pkg_config(conf, package, uselib_store, mandatory, static, minimum_version): + args = package if minimum_version is None else '%s >= %s' % (package, minimum_version) + args += ' --cflags' + if not static: + args += ' --libs' + msg = 'Checking for %s' % package + if minimum_version is not None: + msg += ' >= %s' % minimum_version + conf.check_cfg(package=package, args=args, uselib_store=uselib_store, mandatory=mandatory, msg=msg) + # libcurl if conf.options.static_curl: conf.env.STLIB_CURL = ['curl'] @@ -248,7 +281,7 @@ def configure(conf): mandatory=True, msg='Checking for libicu', okmsg='yes', - libpath=['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu'], + libpath=['/usr/lib', '/usr/lib/x86_64-linux-gnu'], lib=['icuio', 'icui18n', 'icudata', 'icuuc'], uselib_store='ICU') @@ -278,6 +311,15 @@ def configure(conf): uselib="ZIP", define_name='DCPOMATIC_HAVE_ZIP_FILE_ADD' ) + conf.check_cxx(fragment=""" + #include + int main() { int error; zip_open("foo", ZIP_RDONLY, &error); } + """, + mandatory=False, + msg="Checking for ZIP_RDONLY", + uselib="ZIP", + define_name='DCPOMATIC_HAVE_ZIP_RDONLY' + ) # libbz2; must be explicitly linked on macOS for some reason conf.check_cxx(fragment=""" @@ -307,10 +349,10 @@ def configure(conf): conf.check_cfg(package='fontconfig', args='--cflags --libs', uselib_store='FONTCONFIG', mandatory=True) # pangomm - conf.check_cfg(package='pangomm-1.4', args='--cflags --libs', uselib_store='PANGOMM', mandatory=True) + conf.check_cfg(package='pangomm-' + conf.env.PANGOMM_API, args='--cflags --libs', uselib_store='PANGOMM', mandatory=True) # cairomm - conf.check_cfg(package='cairomm-1.0', args='--cflags --libs', uselib_store='CAIROMM', mandatory=True) + conf.check_cfg(package='cairomm-' + conf.env.CAIROMM_API, args='--cflags --libs', uselib_store='CAIROMM', mandatory=True) # leqm_nrt conf.check_cfg(package='leqm_nrt', args='--cflags --libs', uselib_store='LEQM_NRT', mandatory=True) @@ -342,12 +384,12 @@ def configure(conf): # libdcp if conf.options.static_dcp: - conf.check_cfg(package='libdcp-1.0', args='libdcp-1.0 >= %s --cflags' % libdcp_version, uselib_store='DCP', mandatory=True) + check_via_pkg_config(conf, 'libdcp-1.0', 'DCP', mandatory=True, static=True, minimum_version=libdcp_version) conf.env.DEFINES_DCP = [f.replace('\\', '') for f in conf.env.DEFINES_DCP] - conf.env.STLIB_DCP = ['dcp-1.0', 'asdcp-carl', 'kumu-carl', 'openjp2'] + conf.env.STLIB_DCP = ['dcp-1.0', 'asdcp-dcpomatic', 'kumu-dcpomatic', 'openjp2'] conf.env.LIB_DCP = ['glibmm-2.4', 'ssl', 'crypto', 'bz2', 'xslt', 'xerces-c'] else: - conf.check_cfg(package='libdcp-1.0', args='libdcp-1.0 >= %s --cflags --libs' % libdcp_version, uselib_store='DCP', mandatory=True) + check_via_pkg_config(conf, 'libdcp-1.0', 'DCP', mandatory=True, static=False, minimum_version=libdcp_version) conf.env.DEFINES_DCP = [f.replace('\\', '') for f in conf.env.DEFINES_DCP] # libsub @@ -361,10 +403,10 @@ def configure(conf): # libxml++ if conf.options.static_xmlpp: - conf.env.STLIB_XMLPP = ['xml++-2.6'] + conf.env.STLIB_XMLPP = ['xml++-' + conf.env.XMLPP_API] conf.env.LIB_XMLPP = ['xml2'] else: - conf.check_cfg(package='libxml++-2.6', args='--cflags --libs', uselib_store='XMLPP', mandatory=True) + conf.check_cfg(package='libxml++-' + conf.env.XMLPP_API, args='--cflags --libs', uselib_store='XMLPP', mandatory=True) # libxmlsec if conf.options.static_xmlsec: @@ -389,7 +431,6 @@ def configure(conf): int main() { struct jpeg_compress_struct compress; jpeg_create_compress (&compress); return 0; } """, msg='Checking for libjpeg', - libpath='/usr/local/lib', lib=['jpeg'], uselib_store='JPEG') @@ -400,7 +441,6 @@ def configure(conf): int main() { ext4_mount("ext4_fs", "/mp/", false); }\n """, msg='Checking for lwext4 library', - libpath='/usr/local/lib', lib=['lwext4', 'blockdev'], uselib_store='LWEXT4') @@ -456,7 +496,7 @@ def configure(conf): int main () { av_ebur128_get_true_peaks (0); }\n """, msg='Checking for EBUR128-patched FFmpeg', - uselib='AVCODEC AVFILTER', + uselib='AVCODEC AVFILTER AVUTIL SWRESAMPLE', define_name='DCPOMATIC_HAVE_EBUR128_PATCHED_FFMPEG', mandatory=False) @@ -539,7 +579,6 @@ def configure(conf): int main() { boost::thread t; }\n """, msg='Checking for boost threading library', - libpath='/usr/local/lib', lib=[boost_thread, 'boost_system%s' % boost_lib_suffix], uselib_store='BOOST_THREAD') @@ -548,7 +587,6 @@ def configure(conf): int main() { boost::filesystem::copy_file ("a", "b"); }\n """, msg='Checking for boost filesystem library', - libpath='/usr/local/lib', lib=['boost_filesystem%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix], uselib_store='BOOST_FILESYSTEM') @@ -557,7 +595,6 @@ def configure(conf): int main() { boost::gregorian::day_clock::local_day(); }\n """, msg='Checking for boost datetime library', - libpath='/usr/local/lib', lib=['boost_date_time%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix], uselib_store='BOOST_DATETIME') @@ -592,6 +629,18 @@ def configure(conf): lib=deps, uselib_store='BOOST_PROCESS') + # sqlite3 + conf.check_cfg(package="sqlite3", args='--cflags --libs', uselib_store='SQLITE3', mandatory=True) + conf.check_cxx(fragment=""" + #include + int main() { sqlite3_prepare_v3(nullptr, "", -1, 0, nullptr, nullptr); } + """, + msg='Checking for sqlite3_prepare_v3', + uselib='SQLITE3', + define_name="DCPOMATIC_HAVE_SQLITE3_PREPARE_V3", + mandatory=False) + + # Other stuff conf.find_program('msgfmt', var='MSGFMT') @@ -640,6 +689,21 @@ def configure(conf): def build(bld): create_version_cc(VERSION, bld.env.CXXFLAGS) + # waf can't find these dependencies by itself because they are only included if DCPOMATIC_GROK is defined, + # and I can't find a way to pass that to waf's dependency scanner + if bld.env.ENABLE_GROK: + for dep in ( + 'src/lib/j2k_encoder.cc', + 'src/tools/dcpomatic.cc', + 'src/tools/dcpomatic_server.cc', + 'src/tools/dcpomatic_server_cli.cc', + 'src/tools/dcpomatic_batch.cc' + ): + bld.add_manual_dependency(bld.path.find_node(dep), bld.path.find_node('src/lib/grok/context.h')) + bld.add_manual_dependency(bld.path.find_node(dep), bld.path.find_node('src/lib/grok/messenger.h')) + + bld.add_manual_dependency(bld.path.find_node('src/wx/full_config_dialog.cc'), bld.path.find_node('src/wx/grok/gpu_config_panel.h')) + bld.recurse('src') bld.recurse('graphics')