diff --git a/meson.build b/meson.build new file mode 100644 index 000000000..f0f69c991 --- /dev/null +++ b/meson.build @@ -0,0 +1,714 @@ +project ( + 'carla', ['c', 'cpp',], + license: 'GPL-2.0-or-later', + default_options: [ + 'cpp_std=c++14', + 'buildtype=debugoptimized', + 'warning_level=1', + ], + # see also source/frontend/carla_shared.py and source/includes/CarlaDefines.h + version: '2.5.1', + ) + +pkgconfig_mod = import ('pkgconfig') + +is_darwin = false +is_linux = false +is_freebsd = false +is_windows = false +bin_suffix = '' +lib_suffix = '.so' + +if host_machine.system() == 'darwin' + is_darwin = true + lib_suffix = '.dylib' +elif host_machine.system() == 'linux' + is_linux = true +elif host_machine.system() == 'freebsd' + is_freebsd = true +elif host_machine.system() == 'windows' + is_windows = true + bin_suffix = '.exe' + lib_suffix = '.dll' +else + error ('unknown host system ' + host_machine.system ()) +endif + +if is_darwin + add_languages ('objc') +endif + +cpp = meson.get_compiler('cpp') +is_gcc = cpp.get_id () == 'gcc' + +# === Dependencies === + +add_project_arguments ( + '-DREAL_BUILD', + '-DCARLA_LIB_EXT="' + lib_suffix + '"', + '-DHAVE_FLUIDSYNTH=1', + '-DHAVE_LIBLO=1', + '-DUSING_JUCE', + '-DJUCE_APP_CONFIG_HEADER="AppConfig.h"', + '-mtune=generic', + '-msse', + '-msse2', + '-mfpmath=sse', + language: [ 'c', 'cpp', ], + ) + +if is_linux or is_freebsd + add_project_arguments ( + '-DHAVE_X11=1', + '-ffast-math', + language: ['c', 'cpp',], + ) +endif + +if is_windows + add_project_arguments ( + '-D_WIN32_WINNT=0x0600', + language: ['c', 'cpp',], + ) +endif + +if get_option ('buildtype') == 'debug' + add_project_arguments ( + '-DDEBUG', + language: ['c', 'cpp',], + ) +endif + +# === Libraries === + +carla_engine_plugin_srcs = [] +carla_plugin_srcs = [] +native_plugins_srcs = [] + +source_backend_inc = include_directories ('source/backend') +source_includes_inc = include_directories ('source/includes') +source_includes_vst3sdk_inc = include_directories ('source/includes/vst3sdk') +source_modules_inc = include_directories ('source/modules') +source_utils_inc = include_directories ('source/utils') +source_inc = include_directories ('source') + +lilv_config_inc = include_directories ('source/modules/lilv/config') + +serd_lib = static_library ('serd', + 'source/modules/lilv/serd.c', + include_directories: [ + 'source/modules/lilv/serd-0.24.0', + lilv_config_inc, + ], + gnu_symbol_visibility: 'inlineshidden', + ) +serd_dep = declare_dependency ( + include_directories: 'source/modules/lilv/serd-0.24.0', + link_with: serd_lib) + +sord_lib = static_library ('sord', + 'source/modules/lilv/sord.c', + include_directories: [ + 'source/modules/lilv/sord-0.16.0', + 'source/modules/lilv/sord-0.16.0/src', + lilv_config_inc, + ], + dependencies: serd_dep, + gnu_symbol_visibility: 'inlineshidden', + ) +sord_dep = declare_dependency ( + include_directories: 'source/modules/lilv/sord-0.16.0', + dependencies: serd_dep, + link_with: sord_lib) + +sratom_lib = static_library ('sratom', + 'source/modules/lilv/sratom.c', + include_directories: [ + 'source/modules/lilv/sratom-0.6.0', + lilv_config_inc, + source_includes_inc, + ], + gnu_symbol_visibility: 'inlineshidden', + dependencies: sord_dep, + ) +sratom_dep = declare_dependency ( + include_directories: 'source/modules/lilv/sratom-0.6.0', + dependencies: sord_dep, + link_with: sratom_lib) + +lilv_lib = static_library ('lilv', + 'source/modules/lilv/lilv.c', + include_directories: [ + 'source/modules/lilv/lilv-0.24.0', + 'source/modules/lilv/lilv-0.24.0/src', + lilv_config_inc, + source_includes_inc, + ], + dependencies: sratom_dep, + gnu_symbol_visibility: 'inlineshidden', + ) + +rtmempool_lib = static_library ('rtmempool', + 'source/modules/rtmempool/rtmempool.c', + include_directories: [ + source_includes_inc, + ], + ) + +audio_decoder_srcs = [ + 'source/modules/audio_decoder/ad_dr_mp3.c', + 'source/modules/audio_decoder/ad_ffmpeg.c', + 'source/modules/audio_decoder/ad_minimp3.c', + 'source/modules/audio_decoder/ad_plugin.c', + 'source/modules/audio_decoder/ad_soundfile.c', + ] +audio_decoder_lib = static_library ('audio_decoder', + audio_decoder_srcs, + include_directories: [ + source_includes_inc, + ], + ) + +sfzero_lib = static_library ('sfzero', + 'source/modules/sfzero/SFZero.cpp', + include_directories: [ + source_includes_inc, + source_modules_inc, + source_utils_inc, + ], + link_with: audio_decoder_lib, + dependencies: [ + dependency ('threads'), + ], + ) + +water_lib = static_library ('water', + 'source/modules/water/water.cpp', + include_directories: [ + source_includes_inc, + source_utils_inc, + ], + gnu_symbol_visibility: 'inlineshidden', + ) + +ysfx_flags = [ + '-fsigned-char', + '-DEELSCRIPT_NO_NET', + '-DEELSCRIPT_NO_LICE', + '-DNSEEL_ATOF=ysfx_wdl_atof', + '-DWDL_FFT_REALSIZE=8', + '-DWDL_LINEPARSE_ATOF=ysfx_wdl_atof', + '-DYSFX_API=', + '-DYSFX_NO_STANDARD_MUTEX', + '-Wno-sign-compare', + '-Wno-unused-function', + '-Wno-unused-parameter', + ] + +if is_windows + ysfx_flags += [ + '-DNOMINMAX', + ] +elif is_darwin +else + ysfx_flags += [ + '-DSWELL_LICE_GDI', + '-DSWELL_FONTCONFIG', + '-DSWELL_FREETYPE', + ] +endif + +ysfx_srcs = [ + 'source/modules/ysfx/sources/lice_stb/lice_stb_bmp.cpp', + 'source/modules/ysfx/sources/lice_stb/lice_stb_gif.cpp', + 'source/modules/ysfx/sources/lice_stb/lice_stb_jpg.cpp', + 'source/modules/ysfx/sources/lice_stb/lice_stb_loaders.cpp', + 'source/modules/ysfx/sources/lice_stb/lice_stb_png.cpp', + 'source/modules/ysfx/sources/lice_stb/lice_stb_write.cpp', + 'source/modules/ysfx/sources/ysfx.cpp', + 'source/modules/ysfx/sources/ysfx_api_eel.cpp', + 'source/modules/ysfx/sources/ysfx_api_file.cpp', + 'source/modules/ysfx/sources/ysfx_api_gfx.cpp', + 'source/modules/ysfx/sources/ysfx_api_reaper.cpp', + 'source/modules/ysfx/sources/ysfx_audio_flac.cpp', + 'source/modules/ysfx/sources/ysfx_audio_wav.cpp', + 'source/modules/ysfx/sources/ysfx_config.cpp', + 'source/modules/ysfx/sources/ysfx_eel_utils.cpp', + 'source/modules/ysfx/sources/ysfx_midi.cpp', + 'source/modules/ysfx/sources/ysfx_parse.cpp', + 'source/modules/ysfx/sources/ysfx_parse_menu.cpp', + 'source/modules/ysfx/sources/ysfx_preset.cpp', + 'source/modules/ysfx/sources/ysfx_reader.cpp', + 'source/modules/ysfx/sources/ysfx_utils.cpp', + 'source/modules/ysfx/sources/ysfx_utils_fts.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/fft.c', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/eel2/nseel-caltab.c', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/eel2/nseel-cfunc.c', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/eel2/nseel-compiler.c', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/eel2/nseel-eval.c', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/eel2/nseel-lextab.c', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/eel2/nseel-ram.c', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/eel2/nseel-yylex.c', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/eel2/y.tab.c', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/lice/lice.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/lice/lice_arc.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/lice/lice_colorspace.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/lice/lice_image.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/lice/lice_line.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/lice/lice_palette.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/lice/lice_texgen.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/lice/lice_text.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/lice/lice_textnew.cpp', + ] + +if is_gcc + ysfx_srcs += [ + 'source/modules/ysfx/sources/eel2-gas/sources/asm-nseel-x64-sse.S', + ] +endif + +if is_windows + ysfx_srcs += [ + 'source/modules/ysfx/thirdparty/WDL/source/WDL/win32_utf8.c', + ] +else # windows + ysfx_srcs += [ + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-ini.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell.cpp', + ] + if is_darwin + ysfx_srcs += [ + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-appstub.mm', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-dlg.mm', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-gdi.mm', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-kb.mm', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-menu.mm', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-misc.mm', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-miscdlg.mm', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-modstub.mm', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-wnd.mm', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swellappmain.mm', + ] + else # macos + ysfx_srcs += [ + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-appstub-generic.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-dlg-generic.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-gdi-generic.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-gdi-lice.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-generic-gdk.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-generic-headless.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-kb-generic.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-menu-generic.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-misc-generic.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-miscdlg-generic.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-modstub-generic.cpp', + 'source/modules/ysfx/thirdparty/WDL/source/WDL/swell/swell-wnd-generic.cpp', + ] + endif # macos +endif # windows + +ysfx_lib = static_library ('ysfx', + ysfx_srcs, + cpp_args: ysfx_flags, + include_directories: [ + 'source/modules/ysfx/include', + 'source/modules/ysfx/sources', + 'source/modules/ysfx/thirdparty/WDL/source', + 'source/modules/ysfx/thirdparty/dr_libs', + 'source/modules/ysfx/thirdparty/stb', + ], + dependencies: [ + dependency('threads'), + dependency('fontconfig'), + dependency('freetype2'), + ], + gnu_symbol_visibility: 'inlineshidden', + ) + +zita_resampler_srcs = [ + 'source/modules/zita-resampler/cresampler.cc', + 'source/modules/zita-resampler/resampler-table.cc', + 'source/modules/zita-resampler/resampler.cc', + 'source/modules/zita-resampler/vresampler.cc', + ] +zita_resampler_lib = static_library ('zita_resampler', + zita_resampler_srcs, + include_directories: [ + source_includes_inc, + ], + ) + +juce_core_lib = static_library ('juce_core', + 'source/modules/juce_core/juce_core.cpp', + include_directories: [ + source_modules_inc, + ], + gnu_symbol_visibility: 'inlineshidden', + ) + +juce_data_structures_lib = static_library ('juce_data_structures', + 'source/modules/juce_data_structures/juce_data_structures.cpp', + include_directories: [ + source_modules_inc, + source_includes_vst3sdk_inc, + ], + cpp_args: [ + '-DRELEASE', + ], + gnu_symbol_visibility: 'inlineshidden', + ) + +juce_gui_extra_lib = static_library ('juce_gui_extra', + 'source/modules/juce_gui_extra/juce_gui_extra.cpp', + include_directories: [ + source_modules_inc, + source_includes_vst3sdk_inc, + ], + cpp_args: [ + '-DRELEASE', + ], + gnu_symbol_visibility: 'inlineshidden', + ) + +# needed for older mingw, crashes on optimized float operations +juce_audio_basics_args = [] +if is_windows + juce_audio_basics_args += [ + '-mpreferred-stack-boundary=2', + ] +endif + +juce_audio_basics_lib = static_library ('juce_audio_basics', + 'source/modules/juce_audio_basics/juce_audio_basics.cpp', + include_directories: [ + source_modules_inc, + ], + cpp_args: juce_audio_basics_args, + gnu_symbol_visibility: 'inlineshidden', + ) + +juce_audio_processors_lib = static_library ('juce_audio_processors', + 'source/modules/juce_audio_processors/juce_audio_processors.cpp', + include_directories: [ + source_modules_inc, + source_includes_vst3sdk_inc, + ], + cpp_args: [ + '-DRELEASE', + ], + link_with: [ + juce_data_structures_lib, + juce_gui_extra_lib, + ], + gnu_symbol_visibility: 'inlineshidden', + ) + +juce_events_lib = static_library ('juce_events', + 'source/modules/juce_events/juce_events.cpp', + include_directories: [ + source_modules_inc, + ], + link_with: [ + juce_core_lib, + ], + gnu_symbol_visibility: 'inlineshidden', + ) + +juce_graphics_deps = [] +if is_linux + juce_graphics_deps += dependency ('freetype2') +endif + +juce_graphics_lib = static_library ('juce_graphics', + 'source/modules/juce_graphics/juce_graphics.cpp', + include_directories: [ + source_modules_inc, + source_includes_vst3sdk_inc, + ], + cpp_args: [ + '-DRELEASE', + ], + dependencies: [ + juce_graphics_deps, + ], + gnu_symbol_visibility: 'inlineshidden', + ) + +juce_gui_basics_lib = static_library ('juce_gui_basics', + 'source/modules/juce_gui_basics/juce_gui_basics.cpp', + include_directories: [ + source_modules_inc, + ], + gnu_symbol_visibility: 'inlineshidden', + ) + +carla_juce_lib = static_library ('carla_juce', + 'source/modules/carla_juce/carla_juce.cpp', + include_directories: [ + source_includes_inc, + source_modules_inc, + source_utils_inc, + ], + link_with: [ + juce_events_lib, + ], + gnu_symbol_visibility: 'inlineshidden', + ) + +source_utils_srcs = [ + 'source/utils/CarlaPipeUtils.cpp', + ] +source_utils_lib = static_library ('source_utils', + source_utils_srcs, + include_directories: [ + source_includes_inc, + source_modules_inc, + source_utils_inc, + ], + link_with: [ + water_lib, + ], + ) + +jackbridge_srcs = [ + 'source/jackbridge/JackBridge1.cpp', + 'source/jackbridge/JackBridge2.cpp', + 'source/jackbridge/JackBridge3.cpp', + 'source/jackbridge/JackBridgeExport.cpp', + ] +jackbridge_lib = static_library ('jackbridge', + jackbridge_srcs, + include_directories: [ + source_includes_inc, + source_utils_inc, + ], + ) + +backend_utils_srcs = [ + 'source/backend/utils/CachedPlugins.cpp', + 'source/backend/utils/Information.cpp', + 'source/backend/utils/JUCE.cpp', + 'source/backend/utils/PipeClient.cpp', + 'source/backend/utils/System.cpp', + 'source/backend/utils/Windows.cpp', + ] +backend_utils_lib = static_library ('backend_utils', + backend_utils_srcs, + include_directories: [ + source_backend_inc, + source_includes_inc, + source_modules_inc, + source_utils_inc, + source_inc, + ], + ) + +carla_engine_srcs = [ + 'source/backend/engine/CarlaEngine.cpp', + 'source/backend/engine/CarlaEngineClient.cpp', + 'source/backend/engine/CarlaEngineData.cpp', + 'source/backend/engine/CarlaEngineGraph.cpp', + 'source/backend/engine/CarlaEngineInternal.cpp', + 'source/backend/engine/CarlaEngineNative.cpp', + 'source/backend/engine/CarlaEnginePorts.cpp', + 'source/backend/engine/CarlaEngineRunner.cpp', + 'source/backend/engine/CarlaEngineDummy.cpp', + ] + +backend_engine_lib = static_library ('carla_engine', + carla_engine_srcs, + include_directories: [ + source_backend_inc, + source_includes_inc, + source_modules_inc, + source_utils_inc, + source_inc, + ], + link_with: [ + water_lib, + jackbridge_lib, + ], + ) + +backend_plugin_srcs = files([ + 'source/backend/plugin/CarlaPlugin.cpp', + 'source/backend/plugin/CarlaPluginAU.cpp', + 'source/backend/plugin/CarlaPluginBridge.cpp', + 'source/backend/plugin/CarlaPluginCLAP.cpp', + 'source/backend/plugin/CarlaPluginFluidSynth.cpp', + 'source/backend/plugin/CarlaPluginInternal.cpp', + 'source/backend/plugin/CarlaPluginJack.cpp', + 'source/backend/plugin/CarlaPluginJSFX.cpp', + 'source/backend/plugin/CarlaPluginJuce.cpp', + 'source/backend/plugin/CarlaPluginLADSPADSSI.cpp', + 'source/backend/plugin/CarlaPluginLV2.cpp', + 'source/backend/plugin/CarlaPluginNative.cpp', + 'source/backend/plugin/CarlaPluginSFZero.cpp', + 'source/backend/plugin/CarlaPluginVST2.cpp', + 'source/backend/plugin/CarlaPluginVST3.cpp', + ]) + +backend_plugin_lib = static_library ('backend_plugin', + backend_plugin_srcs, + include_directories: [ + source_backend_inc, + source_includes_inc, + source_modules_inc, + source_utils_inc, + source_inc, + ], + link_with: [ + water_lib, + jackbridge_lib, + rtmempool_lib, + ysfx_lib, + ], + dependencies: [ + dependency ('threads'), + ], + ) + +carla_discovery_exe = executable ('carla-discovery-native', + 'source/discovery/carla-discovery.cpp', + include_directories: [ + source_backend_inc, + source_includes_inc, + source_modules_inc, + source_utils_inc, + source_inc, + ], + link_with: [ + carla_juce_lib, + backend_plugin_lib, + water_lib, + lilv_lib, + juce_audio_basics_lib, + juce_audio_processors_lib, + juce_graphics_lib, + juce_gui_basics_lib, + ], + dependencies: [ + dependency ('fluidsynth'), + ], + install: true, + install_dir: get_option('libdir') / 'carla', + ) + +source_native_plugins_srcs = [ + 'source/native-plugins/audio-file.cpp', + 'source/native-plugins/audio-gain.c', + 'source/native-plugins/bypass.c', + 'source/native-plugins/cv-to-audio.c', + 'source/native-plugins/lfo.c', + 'source/native-plugins/midi-to-cv.c', + 'source/native-plugins/midi-channel-ab.c', + 'source/native-plugins/midi-channelize.c', + 'source/native-plugins/midi-channel-filter.c', + 'source/native-plugins/midi-file.cpp', + 'source/native-plugins/midi-gain.c', + 'source/native-plugins/midi-join.c', + 'source/native-plugins/midi-split.c', + 'source/native-plugins/midi-through.c', + 'source/native-plugins/midi-transpose.c', + ] + +source_native_plugins_lib = static_library ('source_native_plugins', + source_native_plugins_srcs, + include_directories: [ + source_includes_inc, + source_modules_inc, + source_utils_inc, + ], + link_with: [ + zita_resampler_lib, + ], + ) + +carla_plugin_deps = [ + dependency ('fluidsynth'), + dependency ('liblo'), + dependency ('threads'), + ] +if is_linux or is_freebsd + carla_plugin_deps += [ + dependency ('x11'), + dependency ('xcursor'), + dependency ('xext'), + ] +endif + +carla_host_plugin_srcs = [ + 'source/plugin/carla-host-plugin.cpp', + 'source/native-plugins/_all.c', + 'source/native-plugins/_data.cpp', + 'source/backend/engine/CarlaEngineOsc.cpp', + 'source/backend/engine/CarlaEngineOscSend.cpp', + 'source/backend/engine/CarlaEngineOscHandlers.cpp', + 'source/backend/engine/CarlaEngineNative.cpp', + 'source/backend/plugin/CarlaPlugin.cpp', + 'source/utils/CarlaDssiUtils.cpp', + 'source/utils/CarlaPluginUI.cpp', + 'source/utils/CarlaStateUtils.cpp', + 'source/utils/CarlaProcessUtils.cpp', + ] + +carla_host_plugin_lib = both_libraries ('carla_host-plugin', + carla_host_plugin_srcs, + include_directories: [ + source_backend_inc, + source_includes_inc, + source_modules_inc, + source_utils_inc, + ], + cpp_args: [ + '-DCARLA_PLUGIN_UI_CLASS_PREFIX=Plugin', + ], + dependencies: carla_plugin_deps, + link_with: [ + lilv_lib, + backend_plugin_lib, + backend_engine_lib, + source_utils_lib, + source_native_plugins_lib, + ysfx_lib, + water_lib, + jackbridge_lib, + sfzero_lib, + carla_juce_lib, + juce_audio_basics_lib, + juce_audio_processors_lib, + juce_graphics_lib, + juce_gui_basics_lib, + ], + gnu_symbol_visibility: 'hidden', + install: true, + install_dir: get_option('libdir') / 'carla', + ) + +carla_host_plugin_dep = declare_dependency ( + link_with: carla_host_plugin_lib) + +pkgconfig_mod.generate ( + carla_host_plugin_lib, + subdirs: 'carla', + extra_cflags: [ + '-DREAL_BUILD', + '-I${includedir}/carla/includes', + ], + filebase: 'carla-host-plugin', + name: 'carla-host-plugin', + install_dir: get_option('libdir') / 'pkgconfig', + description: 'Carla Host as Native Plugin') + +install_headers ( + 'source/includes/CarlaDefines.h', + 'source/includes/CarlaMIDI.h', + 'source/includes/CarlaNative.h', + 'source/includes/CarlaNativePlugin.h', + subdir: 'carla/includes') + +install_headers ( + 'source/backend/CarlaBackend.h', + 'source/backend/CarlaHost.h', + 'source/backend/CarlaUtils.h', + subdir: 'carla') diff --git a/source/modules/ysfx/thirdparty/WDL/source/WDL/wdlutf8.h b/source/modules/ysfx/thirdparty/WDL/source/WDL/wdlutf8.h index 465a50726..c85ebcf62 100644 --- a/source/modules/ysfx/thirdparty/WDL/source/WDL/wdlutf8.h +++ b/source/modules/ysfx/thirdparty/WDL/source/WDL/wdlutf8.h @@ -27,6 +27,7 @@ misrepresented as being the original software. * todo: handle multi-byte (make WideStr support UTF-16) */ +#include #include "wdltypes.h" #ifndef WDL_WCHAR