X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=wscript;h=d66aba33526fb72695dc97b831411cda9ee750a2;hp=03d2074283a357c38e5648cdb35e9d4dbb6f8bd4;hb=HEAD;hpb=5215408c36898039e8fa294bb74bf94d5762b0c7 diff --git a/wscript b/wscript index 03d207428..305dc8c72 100644 --- a/wscript +++ b/wscript @@ -35,20 +35,20 @@ except ImportError: from waflib import Logs, Context APPNAME = 'dcpomatic' -libdcp_version = '1.8.13' -libsub_version = '1.6.13' +libdcp_version = '1.8.100' +libsub_version = '1.6.42' -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') @@ -78,6 +77,8 @@ def options(opt): 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('--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') def configure(conf): conf.load('compiler_cxx') @@ -101,6 +102,8 @@ def configure(conf): else: conf.env.INSTALL_PREFIX = conf.options.destdir + 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', '-D__STDC_LIMIT_MACROS', @@ -115,22 +118,35 @@ def configure(conf): '-D_FILE_OFFSET_BITS=64', '-std=c++11']) + 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') + conf.env.append_value('LINKFLAGS', '-fsanitize=address') if conf.env['CXX_NAME'] == 'gcc': gcc = conf.env['CC_VERSION'] if int(gcc[0]) >= 8: # I tried and failed to ignore these with _Pragma conf.env.append_value('CXXFLAGS', ['-Wno-cast-function-type']) - have_c11 = int(gcc[0]) >= 4 and int(gcc[1]) >= 8 and int(gcc[2]) >= 1 # Most gccs still give these warnings from boost::optional conf.env.append_value('CXXFLAGS', ['-Wno-maybe-uninitialized']) - else: - have_c11 = False + if int(gcc[0]) > 4: + # gcc 4.8.5 on Centos 7 does not have this warning + conf.env.append_value('CXXFLAGS', ['-Wsuggest-override']) if conf.options.enable_debug: conf.env.append_value('CXXFLAGS', ['-g', '-DDCPOMATIC_DEBUG', '-fno-omit-frame-pointer']) @@ -148,7 +164,7 @@ def configure(conf): pass # - # Windows/Linux/OS X specific + # Windows/Linux/macOS specific # # Windows @@ -157,7 +173,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) @@ -181,7 +196,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') @@ -194,7 +208,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') @@ -220,7 +233,7 @@ def configure(conf): conf.env.STLIB_CURL = ['curl'] conf.env.LIB_CURL = ['ssh2', 'idn'] else: - conf.check_cfg(package='libcurl', args='--cflags --libs', atleast_version='7.19.1', uselib_store='CURL', mandatory=True) + conf.check_cfg(package='libcurl', args='libcurl >= 7.19.1 --cflags --libs', uselib_store='CURL', mandatory=True) # libicu if conf.check_cfg(package='icu-i18n', args='--cflags --libs', uselib_store='ICU', mandatory=False) is None: @@ -235,7 +248,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') @@ -249,13 +262,31 @@ def configure(conf): conf.check_cfg(package='libzip', args='--cflags --libs', uselib_store='ZIP', mandatory=True) conf.check_cxx(fragment=""" #include - int main() { zip_source_t* foo; } + int main() { zip_source_t* foo; (void)foo; } """, mandatory=False, msg="Checking for zip_source_t", uselib="ZIP", define_name='DCPOMATIC_HAVE_ZIP_SOURCE_T' ) + conf.check_cxx(fragment=""" + #include + int main() { struct zip* zip = nullptr; zip_source_t* source = nullptr; zip_file_add(zip, "foo", source, ZIP_FL_ENC_GUESS); } + """, + mandatory=False, + msg="Checking for zip_file_add", + 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=""" @@ -269,6 +300,18 @@ def configure(conf): uselib_store="BZ2" ) + # libz; must be explicitly linked on macOS for some reason + conf.check_cxx(fragment=""" + #include + int main() { zlibVersion(); } + """, + mandatory=True, + msg="Checking for libz", + okmsg='yes', + lib='z', + uselib_store="LIBZ" + ) + # fontconfig conf.check_cfg(package='fontconfig', args='--cflags --libs', uselib_store='FONTCONFIG', mandatory=True) @@ -283,10 +326,10 @@ def configure(conf): # libcxml if conf.options.static_cxml: - conf.check_cfg(package='libcxml', atleast_version='0.17.0', args='--cflags', uselib_store='CXML', mandatory=True) + conf.check_cfg(package='libcxml', args='libcxml >= 0.17.0 --cflags', uselib_store='CXML', mandatory=True) conf.env.STLIB_CXML = ['cxml'] else: - conf.check_cfg(package='libcxml', atleast_version='0.16.0', args='--cflags --libs', uselib_store='CXML', mandatory=True) + conf.check_cfg(package='libcxml', args='libcxml >= 0.16.0 --cflags --libs', uselib_store='CXML', mandatory=True) # libssh if conf.options.static_ssh: @@ -308,21 +351,21 @@ def configure(conf): # libdcp if conf.options.static_dcp: - conf.check_cfg(package='libdcp-1.0', atleast_version=libdcp_version, args='--cflags', uselib_store='DCP', mandatory=True) + conf.check_cfg(package='libdcp-1.0', args='libdcp-1.0 >= %s --cflags' % libdcp_version, uselib_store='DCP', mandatory=True) 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.LIB_DCP = ['glibmm-2.4', 'ssl', 'crypto', 'bz2', 'xslt', 'xerces-c'] else: - conf.check_cfg(package='libdcp-1.0', atleast_version=libdcp_version, args='--cflags --libs', uselib_store='DCP', mandatory=True) + conf.check_cfg(package='libdcp-1.0', args='libdcp-1.0 >= %s --cflags --libs' % libdcp_version, uselib_store='DCP', mandatory=True) conf.env.DEFINES_DCP = [f.replace('\\', '') for f in conf.env.DEFINES_DCP] # libsub if conf.options.static_sub: - conf.check_cfg(package='libsub-1.0', atleast_version=libsub_version, args='--cflags', uselib_store='SUB', mandatory=True) + conf.check_cfg(package='libsub-1.0', args='libsub-1.0 >= %s --cflags' % libsub_version, uselib_store='SUB', mandatory=True) conf.env.DEFINES_SUB = [f.replace('\\', '') for f in conf.env.DEFINES_SUB] conf.env.STLIB_SUB = ['sub-1.0'] else: - conf.check_cfg(package='libsub-1.0', atleast_version=libsub_version, args='--cflags --libs', uselib_store='SUB', mandatory=True) + conf.check_cfg(package='libsub-1.0', args='libsub-1.0 >= %s --cflags --libs' % libsub_version, uselib_store='SUB', mandatory=True) conf.env.DEFINES_SUB = [f.replace('\\', '') for f in conf.env.DEFINES_SUB] # libxml++ @@ -347,6 +390,17 @@ def configure(conf): # libpng conf.check_cfg(package='libpng', args='--cflags --libs', uselib_store='PNG', mandatory=True) + # libjpeg + conf.check_cxx(fragment=""" + #include + #include + #include + int main() { struct jpeg_compress_struct compress; jpeg_create_compress (&compress); return 0; } + """, + msg='Checking for libjpeg', + lib=['jpeg'], + uselib_store='JPEG') + # lwext4 if conf.options.enable_disk: conf.check_cxx(fragment=""" @@ -354,7 +408,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') @@ -493,7 +546,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') @@ -502,7 +554,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') @@ -511,7 +562,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') @@ -568,7 +618,7 @@ def configure(conf): elif conf.env.TARGET_LINUX: Logs.pprint('YELLOW', '\t' + 'Target'.ljust(25) + ': Linux') elif conf.env.TARGET_OSX: - Logs.pprint('YELLOW', '\t' + 'Target'.ljust(25) + ': OS X') + Logs.pprint('YELLOW', '\t' + 'Target'.ljust(25) + ': macOS') def report(name, variable): linkage = '' @@ -668,6 +718,9 @@ def create_version_cc(version, cxx_flags): def post(ctx): if ctx.cmd == 'install' and ctx.env.TARGET_LINUX: ctx.exec_command('/sbin/ldconfig') + exe = os.path.join(ctx.env['INSTALL_PREFIX'], 'bin/dcpomatic2_disk_writer') + if os.path.exists(exe): + os.system('setcap "cap_dac_override+ep cap_sys_admin+ep" %s' % exe) def pot(bld): bld.recurse('src')