mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2025-12-20 04:40:07 +01:00
Build with hidden symbols by default
We should default on every platform we care about to hidden symbols, to avoid leaking private symbols. On Windows this is the default state of affairs with the MSVC toolchain; with GCC and GCC-compatible toolchains, we need to opt into this behaviour. Luckily for us, Cairo already has an annotation for public symbols, so we can easily tweak it to include the visibility attribute. When building ancillary libraries as part of the Cairo compilation on Windows, we use a pre-processor symbol to ensure that we keep the dllexport annotation. This avoids including the cairoint.h header file. Fixes: #582
This commit is contained in:
parent
ff02c2c268
commit
ba4d5fbd5d
10 changed files with 36 additions and 42 deletions
|
|
@ -28,6 +28,7 @@ cairo_boilerplate_constructors = custom_target('cairo-boilerplate-constructors.c
|
|||
libcairoboilerplate = static_library('cairoboilerplate', cairo_boilerplate_sources + [cairo_boilerplate_constructors],
|
||||
include_directories: [incbase],
|
||||
dependencies: deps + [libcairo_dep],
|
||||
c_args: ['-DCAIRO_COMPILATION'],
|
||||
install: false,
|
||||
build_by_default: false,
|
||||
)
|
||||
|
|
|
|||
23
src/cairo.h
23
src/cairo.h
|
|
@ -50,14 +50,25 @@
|
|||
# define CAIRO_END_DECLS
|
||||
#endif
|
||||
|
||||
#ifndef cairo_public
|
||||
# if defined (_MSC_VER) && ! defined (CAIRO_WIN32_STATIC_BUILD)
|
||||
# define cairo_public __declspec(dllimport)
|
||||
# else
|
||||
# define cairo_public
|
||||
# endif
|
||||
#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(CAIRO_WIN32_STATIC_BUILD)
|
||||
# define _cairo_export __declspec(dllexport)
|
||||
# define _cairo_import __declspec(dllimport)
|
||||
#elif defined(__GNUC__) && (__GNUC__ >= 4)
|
||||
# define _cairo_export __attribute__((__visibility__("default")))
|
||||
# define _cairo_import
|
||||
#else
|
||||
# define _cairo_export
|
||||
# define _cairo_import
|
||||
#endif
|
||||
|
||||
#ifdef CAIRO_COMPILATION
|
||||
# define _cairo_api _cairo_export
|
||||
#else
|
||||
# define _cairo_api _cairo_import
|
||||
#endif
|
||||
|
||||
#define cairo_public _cairo_api extern
|
||||
|
||||
CAIRO_BEGIN_DECLS
|
||||
|
||||
#define CAIRO_VERSION_ENCODE(major, minor, micro) ( \
|
||||
|
|
|
|||
|
|
@ -49,10 +49,6 @@
|
|||
|
||||
#include "config.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define cairo_public __declspec(dllexport)
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
|
|
|||
|
|
@ -242,9 +242,10 @@ endif
|
|||
|
||||
libcairo = library('cairo', cairo_sources,
|
||||
dependencies: deps,
|
||||
c_args: cairo_no_warn_c_args + pthread_c_args,
|
||||
cpp_args: cairo_no_warn_c_args + pthread_c_args,
|
||||
c_args: cairo_no_warn_c_args + pthread_c_args + ['-DCAIRO_COMPILATION'],
|
||||
cpp_args: cairo_no_warn_c_args + pthread_c_args + ['-DCAIRO_COMPILATION'],
|
||||
link_args: extra_link_args,
|
||||
gnu_symbol_visibility: 'hidden',
|
||||
soversion: cairo_version_sonum,
|
||||
version: cairo_libversion,
|
||||
install: true,
|
||||
|
|
@ -283,29 +284,4 @@ if shell.found()
|
|||
suite: ['fast', 'lint'],
|
||||
workdir: meson.current_source_dir())
|
||||
endforeach
|
||||
|
||||
env = environment()
|
||||
env.set('CAIRO_HAS_HIDDEN_SYMBOLS', '1')
|
||||
|
||||
cairo_def = custom_target('make-cairo-def',
|
||||
input : cairo_headers,
|
||||
output : 'cairo.def',
|
||||
command : [ shell,
|
||||
meson.current_source_dir()/'make-cairo-def.sh',
|
||||
'@OUTPUT@',
|
||||
cairo_features_file,
|
||||
'@INPUT@'
|
||||
])
|
||||
|
||||
test('check-def', shell,
|
||||
args: ['meson-check-def.sh', cairo_def, libcairo ],
|
||||
env: env,
|
||||
workdir: meson.current_source_dir())
|
||||
|
||||
test('check-plt.sh', shell,
|
||||
args: ['check-plt.sh', libcairo ],
|
||||
env: env,
|
||||
suite: ['fast', 'plt'],
|
||||
workdir: meson.current_source_dir())
|
||||
|
||||
endif
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@ cairo_fdr_sources = [
|
|||
libcairofdr = library('cairo-fdr', cairo_fdr_sources,
|
||||
include_directories: [incbase, incsrc],
|
||||
dependencies: deps,
|
||||
gnu_symbol_visibility: 'hidden',
|
||||
link_args: extra_link_args,
|
||||
install: true,
|
||||
install_dir: join_paths(get_option('prefix'), get_option('libdir'), 'cairo'),
|
||||
install_dir: get_option('libdir') / 'cairo',
|
||||
)
|
||||
|
|
|
|||
|
|
@ -12,6 +12,9 @@ libcairogobject = library('cairo-gobject', cairo_gobject_sources,
|
|||
dependencies: [glib_dep, gobject_dep, libcairo_dep],
|
||||
soversion: cairo_version_sonum,
|
||||
version: cairo_libversion,
|
||||
gnu_symbol_visibility: 'hidden',
|
||||
c_args: ['-DCAIRO_COMPILATION'],
|
||||
link_args: extra_link_args,
|
||||
install: true,
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -34,9 +34,10 @@
|
|||
|
||||
#include "config.h"
|
||||
|
||||
#include "cairo-script-private.h"
|
||||
#include "cairo.h"
|
||||
|
||||
#include "cairo-script-private.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
|
|
|||
|
|
@ -30,6 +30,8 @@ libcairoscript = library('cairo-script-interpreter',
|
|||
dependencies: deps + [libcairo_dep, lzo_dep],
|
||||
soversion: cairo_version_sonum,
|
||||
version: cairo_libversion,
|
||||
c_args: ['-DCAIRO_COMPILATION'],
|
||||
link_args: extra_link_args,
|
||||
install: true,
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ libcairosphinx = library('cairo-sphinx', libcairo_sphinx_sources,
|
|||
include_directories: [incbase, incsrc],
|
||||
dependencies: deps,
|
||||
install: true,
|
||||
install_dir: join_paths(get_option('prefix'), get_option('libdir'), 'cairo'),
|
||||
install_dir: get_option('libdir') / 'cairo',
|
||||
)
|
||||
|
||||
libdir = join_paths(get_option('prefix'), get_option('libdir'))
|
||||
|
|
@ -21,5 +21,6 @@ cairosphinx_exe = executable('cairo-sphinx', cairo_sphinx_sources,
|
|||
dependencies: deps + [glib_dep, rt_dep, libcairo_dep, cairoboilerplate_dep, libcairoscript_dep],
|
||||
link_with: [libcairosphinx],
|
||||
link_args: extra_link_args,
|
||||
gnu_symbol_visibility: 'hidden',
|
||||
install: true,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -11,10 +11,11 @@ shared_lib_ext = libcairo.full_path().split('.')[-1]
|
|||
libcairotrace = library('cairo-trace', cairo_trace_sources,
|
||||
include_directories: [incbase, incsrc],
|
||||
dependencies: deps,
|
||||
link_args: extra_link_args,
|
||||
c_args: ['-DSHARED_LIB_EXT="@0@"'.format(shared_lib_ext),] + pthread_c_args,
|
||||
link_args: extra_link_args,
|
||||
gnu_symbol_visibility: 'hidden',
|
||||
install: true,
|
||||
install_dir: join_paths(get_option('prefix'), get_option('libdir'), 'cairo'),
|
||||
install_dir: get_option('libdir') / 'cairo',
|
||||
)
|
||||
|
||||
trace_conf = configuration_data()
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue