431 lines
11 KiB
Meson
431 lines
11 KiB
Meson
library_sources = files(
|
|
'Cargo.toml',
|
|
'build.rs',
|
|
'src/accept_language.rs',
|
|
'src/angle.rs',
|
|
'src/api.rs',
|
|
'src/aspect_ratio.rs',
|
|
'src/bbox.rs',
|
|
'src/cairo_path.rs',
|
|
'src/color.rs',
|
|
'src/cond.rs',
|
|
'src/coord_units.rs',
|
|
'src/css.rs',
|
|
'src/dasharray.rs',
|
|
'src/document.rs',
|
|
'src/dpi.rs',
|
|
'src/drawing_ctx.rs',
|
|
'src/element.rs',
|
|
'src/error.rs',
|
|
'src/filter_func.rs',
|
|
'src/filter.rs',
|
|
'src/filters/blend.rs',
|
|
'src/filters/bounds.rs',
|
|
'src/filters/color_matrix.rs',
|
|
'src/filters/component_transfer.rs',
|
|
'src/filters/composite.rs',
|
|
'src/filters/context.rs',
|
|
'src/filters/convolve_matrix.rs',
|
|
'src/filters/displacement_map.rs',
|
|
'src/filters/error.rs',
|
|
'src/filters/flood.rs',
|
|
'src/filters/gaussian_blur.rs',
|
|
'src/filters/image.rs',
|
|
'src/filters/lighting.rs',
|
|
'src/filters/merge.rs',
|
|
'src/filters/mod.rs',
|
|
'src/filters/morphology.rs',
|
|
'src/filters/offset.rs',
|
|
'src/filters/tile.rs',
|
|
'src/filters/turbulence.rs',
|
|
'src/float_eq_cairo.rs',
|
|
'src/font_props.rs',
|
|
'src/gradient.rs',
|
|
'src/href.rs',
|
|
'src/image.rs',
|
|
'src/io.rs',
|
|
'src/iri.rs',
|
|
'src/layout.rs',
|
|
'src/length.rs',
|
|
'src/lib.rs',
|
|
'src/limits.rs',
|
|
'src/log.rs',
|
|
'src/marker.rs',
|
|
'src/node.rs',
|
|
'src/paint_server.rs',
|
|
'src/parsers.rs',
|
|
'src/path_builder.rs',
|
|
'src/path_parser.rs',
|
|
'src/pattern.rs',
|
|
'src/properties.rs',
|
|
'src/property_defs.rs',
|
|
'src/property_macros.rs',
|
|
'src/rect.rs',
|
|
'src/shapes.rs',
|
|
'src/space.rs',
|
|
'src/structure.rs',
|
|
'src/style.rs',
|
|
'src/surface_utils/iterators.rs',
|
|
'src/surface_utils/mod.rs',
|
|
'src/surface_utils/shared_surface.rs',
|
|
'src/surface_utils/srgb.rs',
|
|
'src/text.rs',
|
|
'src/transform.rs',
|
|
'src/ua.css',
|
|
'src/unit_interval.rs',
|
|
'src/url_resolver.rs',
|
|
'src/util.rs',
|
|
'src/viewbox.rs',
|
|
'src/ua.css',
|
|
'src/xml/attributes.rs',
|
|
'src/xml/mod.rs',
|
|
'src/xml/xml2_load.rs',
|
|
'src/xml/xml2.rs',
|
|
)
|
|
|
|
rust_artifacts = custom_target(
|
|
'librsvg-2',
|
|
build_by_default: true,
|
|
output: '@0@rsvg_@1@.@2@'.format(lib_prefix, librsvg_api_major, ext_static),
|
|
console: true,
|
|
depend_files: library_sources + librsvg_c_sources,
|
|
env: extra_env,
|
|
command: [
|
|
cargo_wrapper,
|
|
cargo_wrapper_args,
|
|
'--command=cbuild',
|
|
'--current-build-dir', '@OUTDIR@',
|
|
'--current-source-dir', meson.current_source_dir(),
|
|
'--packages', 'librsvg-c',
|
|
'--extension', ext_static,
|
|
] + avif_feature_args
|
|
+ pixbuf_feature_args,
|
|
)
|
|
|
|
librsvg_c_lib = rust_artifacts[0]
|
|
|
|
makedef_args = [
|
|
makedef,
|
|
'--regex',
|
|
'^rsvg_.',
|
|
]
|
|
|
|
if host_system in ['darwin', 'ios']
|
|
makedef_args += ['--os', 'darwin']
|
|
elif host_system in ['windows', 'cygwin']
|
|
makedef_args += ['--os', 'win']
|
|
else
|
|
makedef_args += ['--os', 'linux']
|
|
endif
|
|
|
|
if cc.symbols_have_underscore_prefix()
|
|
makedef_args += ['--prefix', '_']
|
|
else
|
|
makedef_args += ['--prefix', '']
|
|
endif
|
|
|
|
makedef_tool_args = []
|
|
|
|
if is_msvc_style
|
|
dumpbin = find_program('dumpbin')
|
|
makedef_tool_args += ['--dumpbin', dumpbin]
|
|
else
|
|
nm = find_program('llvm-nm', required: false)
|
|
if not nm.found()
|
|
if host_system in ['darwin', 'ios']
|
|
warning('llvm-nm not found, you may experience problems when creating the shared librsvg.')
|
|
warning('Please install the llvm-tools component through rustup, or point Meson to an existing LLVM installation.')
|
|
endif
|
|
nm = find_program('nm')
|
|
endif
|
|
makedef_tool_args += ['--nm', nm]
|
|
endif
|
|
|
|
sym_files = files(
|
|
'../win32/librsvg.symbols'
|
|
)
|
|
|
|
if pixbuf_dep.found()
|
|
sym_files += files(
|
|
'../win32/librsvg-pixbuf.symbols'
|
|
)
|
|
endif
|
|
|
|
librsvg_def = configure_file(
|
|
command: [makedef_args, '--list', '@INPUT@'],
|
|
input: sym_files,
|
|
output: '@0@.def'.format(librsvg_pc),
|
|
capture: true,
|
|
)
|
|
|
|
librsvg_ver = custom_target(
|
|
'@0@.ver'.format(librsvg_pc),
|
|
command: [makedef_args, makedef_tool_args, '@INPUT@'],
|
|
input: librsvg_c_lib,
|
|
output: '@0@.ver'.format(librsvg_pc),
|
|
capture: true,
|
|
)
|
|
|
|
version_script = meson.current_build_dir() / '@0@.def'.format(librsvg_pc)
|
|
|
|
if host_system in ['darwin', 'ios']
|
|
vflag = '-Wl,-exported_symbols_list,@0@'.format(version_script)
|
|
elif host_system in ['windows', 'cygwin']
|
|
vflag = []
|
|
else
|
|
vflag = '-Wl,--version-script,@0@'.format(version_script)
|
|
endif
|
|
|
|
# This is not strictly needed, but since we are telling Cargo to build a staticlib, it puts in
|
|
# all of Rust's standard library and code from dependencies even when it is not needed.
|
|
# With the following, we shrink the final .so size; see issue #965.
|
|
#
|
|
# Amyspark: this is still needed after switching to cargo-cbuild, since
|
|
# GIR requires a shared library under MSVC, and Meson will only accept it
|
|
# if the library is a Meson generated target.
|
|
# No further flags are needed under MSVC, because LINK will already strip
|
|
# the library by default.
|
|
#
|
|
# Also check for -Bsymbolic-functions linker flag used to avoid
|
|
# intra-library PLT jumps, if available.
|
|
strip_link_args = cc.get_supported_link_arguments(
|
|
'-Wl,-dead_strip',
|
|
'-Wl,--gc-sections',
|
|
'-Wl,-Bsymbolic-functions',
|
|
)
|
|
|
|
# The symbol list argument cannot be tested, as the dummy
|
|
# executable Meson uses will lack the necessary functions.
|
|
link_args = strip_link_args + vflag
|
|
|
|
# Some systems, reportedly OpenBSD and macOS, refuse
|
|
# to create libraries without any object files. Compiling
|
|
# this file, and adding its object file to the library,
|
|
# will prevent the library from being empty.
|
|
if cc.has_function_attribute('unused')
|
|
rsvg_dummy = configure_file(
|
|
command: [
|
|
python,
|
|
'-c',
|
|
'print("static int __attribute__((unused)) __rsvg_dummy;")'
|
|
],
|
|
capture: true,
|
|
output: '_rsvg_dummy.c'
|
|
)
|
|
else
|
|
rsvg_dummy = configure_file(
|
|
command: [
|
|
python,
|
|
'-c',
|
|
'print("static int __rsvg_dummy; int dummy(void) { return __rsvg_dummy; }")'
|
|
],
|
|
capture: true,
|
|
output: '_rsvg_dummy.c'
|
|
)
|
|
endif
|
|
|
|
librsvg_dep_args = []
|
|
librsvg_lib = librsvg_c_lib
|
|
|
|
# Wait on this dependency before trying to build using Rust
|
|
librsvg_rust_dep = rust_artifacts
|
|
|
|
if get_option('default_library') in ['shared', 'both']
|
|
librsvg_shared_lib = shared_library(
|
|
'rsvg-@0@'.format(librsvg_api_major),
|
|
rsvg_dummy,
|
|
link_whole: librsvg_c_lib,
|
|
link_args: link_args,
|
|
link_depends: librsvg_ver,
|
|
dependencies: library_dependencies,
|
|
include_directories: [includeinc],
|
|
override_options: default_overrides,
|
|
vs_module_defs: librsvg_def,
|
|
install: true,
|
|
version: meson.project_version() # it's not exact as m4
|
|
)
|
|
if get_option('default_library') == 'shared'
|
|
librsvg_lib = librsvg_shared_lib
|
|
endif
|
|
librsvg_rust_dep = librsvg_shared_lib
|
|
endif
|
|
if get_option('default_library') in ['static', 'both']
|
|
# Rust cannot yet use import libraries for MSVC which do not end in .lib.
|
|
# The static library must be manually generated so that it matches Meson's
|
|
# naming convention.
|
|
# See https://github.com/rust-lang/rust/issues/122455
|
|
librsvg_lib = custom_target(
|
|
'rsvg-2-static',
|
|
input: librsvg_c_lib,
|
|
output: '@0@rsvg-@1@.@2@'.format(lib_prefix, librsvg_api_major, 'a'),
|
|
command: [
|
|
python,
|
|
'-c',
|
|
'import os; import sys; import shutil; shutil.copy(sys.argv[1], sys.argv[2])',
|
|
'@INPUT0@',
|
|
'@OUTPUT0@'
|
|
],
|
|
install: true,
|
|
install_dir: get_option('libdir'),
|
|
)
|
|
librsvg_dep_args += ['-DRSVG_STATIC']
|
|
|
|
librsvg_rust_dep = librsvg_lib
|
|
endif
|
|
|
|
# This is the main dependency to use for tests; it means "link to the library we just built"
|
|
librsvg_dep = declare_dependency(
|
|
sources: includes,
|
|
include_directories: [includeinc],
|
|
dependencies: library_dependencies,
|
|
compile_args: librsvg_dep_args,
|
|
link_with: librsvg_lib,
|
|
)
|
|
|
|
meson.override_dependency('librsvg-2.0', librsvg_dep)
|
|
|
|
pkg = import('pkgconfig')
|
|
|
|
# If any of the dependencies is e.g. wrap, ignore as we can't include
|
|
# them without knowing how they exposed the pkg-config module
|
|
# (if CMake, there's simply no way at all)
|
|
has_pkgconfig_dependencies = true
|
|
|
|
foreach i : library_dependencies_sole + private_dependencies
|
|
if i.found() and i.type_name() != 'pkgconfig'
|
|
warning('One or more dependencies are not provided by pkg-config, skipping generation of the pkg-config module.')
|
|
has_pkgconfig_dependencies = false
|
|
break
|
|
endif
|
|
endforeach
|
|
|
|
build_pixbuf_loader = build_pixbuf_loader.require(has_pkgconfig_dependencies,
|
|
error_message: 'The gdk-pixbuf loader target requires the pkg-config module'
|
|
)
|
|
|
|
if has_pkgconfig_dependencies
|
|
librsvg_c_pc = pkg.generate(
|
|
name : 'librsvg',
|
|
filebase: librsvg_pc,
|
|
description : 'library that renders svg files',
|
|
libraries : [librsvg_lib] + other_library_dependencies,
|
|
subdirs: librsvg_pc,
|
|
requires: library_dependencies_sole,
|
|
requires_private: private_dependencies,
|
|
libraries_private: private_libraries,
|
|
)
|
|
endif
|
|
|
|
if build_gir.allowed()
|
|
gir_args = [
|
|
'-DRSVG_COMPILATION'
|
|
]
|
|
|
|
gir_includes = [
|
|
'GLib-2.0',
|
|
'GObject-2.0',
|
|
'Gio-2.0',
|
|
'cairo-1.0',
|
|
]
|
|
|
|
vala_includes = [
|
|
'gio-2.0',
|
|
'cairo',
|
|
]
|
|
|
|
if pixbuf_dep.found()
|
|
gir_includes += [
|
|
'GdkPixbuf-2.0',
|
|
]
|
|
|
|
vala_includes += [
|
|
'gdk-pixbuf-2.0',
|
|
]
|
|
endif
|
|
|
|
if get_option('default_library') == 'shared'
|
|
librsvg_gir = librsvg_lib
|
|
else
|
|
if is_msvc_style
|
|
librsvg_gir = librsvg_shared_lib
|
|
else
|
|
librsvg_gir = shared_library(
|
|
'rsvg-gir',
|
|
rsvg_dummy,
|
|
link_whole: librsvg_c_lib,
|
|
dependencies: library_dependencies,
|
|
include_directories: [includeinc],
|
|
)
|
|
endif
|
|
endif
|
|
|
|
rsvg_gir = gnome.generate_gir(
|
|
librsvg_gir,
|
|
namespace: 'Rsvg',
|
|
nsversion: '2.0',
|
|
symbol_prefix: [ 'rsvg', 'librsvg' ],
|
|
dependencies: library_dependencies,
|
|
includes: gir_includes,
|
|
env: extra_env,
|
|
export_packages: librsvg_pc,
|
|
header: ['librsvg/rsvg.h'],
|
|
install: true,
|
|
sources: includes,
|
|
extra_args: gir_args,
|
|
fatal_warnings: get_option('werror'),
|
|
)
|
|
endif
|
|
|
|
if build_tests
|
|
library_test_sources = files(
|
|
'tests/api.rs',
|
|
'tests/bugs.rs',
|
|
'tests/errors.rs',
|
|
'tests/filters.rs',
|
|
'tests/geometries.rs',
|
|
'tests/intrinsic_dimensions.rs',
|
|
'tests/loading_crash.rs',
|
|
'tests/loading_disallowed.rs',
|
|
'tests/primitive_geometries.rs',
|
|
'tests/primitives.rs',
|
|
'tests/reference.rs',
|
|
'tests/render_crash.rs',
|
|
'tests/shapes.rs',
|
|
'tests/text.rs',
|
|
'src/test_utils/compare_surfaces.rs',
|
|
'src/test_utils/mod.rs',
|
|
'src/test_utils/reference_utils.rs',
|
|
)
|
|
|
|
test(
|
|
'Rust tests (rsvg)',
|
|
cargo_wrapper,
|
|
timeout: -1, # no timeout
|
|
args: [
|
|
cargo_wrapper_args,
|
|
'--current-build-dir', meson.current_build_dir(),
|
|
'--command=test',
|
|
'--current-source-dir', meson.current_source_dir(),
|
|
'--packages', 'librsvg',
|
|
] + avif_feature_args,
|
|
env: extra_env,
|
|
depends: librsvg_rust_dep
|
|
)
|
|
|
|
test(
|
|
'Rust tests (librsvg)',
|
|
cargo_wrapper,
|
|
timeout: -1, # no timeout
|
|
args: [
|
|
cargo_wrapper_args,
|
|
'--current-build-dir', meson.current_build_dir(),
|
|
'--command=test',
|
|
'--current-source-dir', meson.current_source_dir(),
|
|
'--packages', 'librsvg-c',
|
|
] + avif_feature_args
|
|
+ pixbuf_feature_args,
|
|
env: extra_env,
|
|
depends: librsvg_rust_dep
|
|
)
|
|
endif
|