forked from mesonbuild/meson
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
gnome: Distinguish between internal and external linker flags
When an older version of the library being built is installed in the same prefix as external dependencies, we have to be careful to construct the linker or compiler command line. If a -L flag from external dependencoes comes before a -L flag pointing to builddir, it is possible for the linker to load older libraries from the installation prefix instead of the newly built ones, which is likely to cause undefined reference error. Since the order of dependencies is not significant, we cannot expect internal dependencies to appear before external dependencies when recursively iterating the list of dependencies. To make it harder to make mistakes, linker flags come from internal and external dependencies are now stored in different order sets. Code using _get_dependencies_flags are expected to follow the order when constructing linker command line: 1. Internal linker flags 2. LDFLAGS set by users 3. External linker flags It is similar to what automake and libtool do for autotools projects.
- Loading branch information
Showing
10 changed files
with
194 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6 changes: 6 additions & 0 deletions
6
test cases/frameworks/22 gir link order/fake-gthread/fake-gthread.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#include "fake-gthread.h" | ||
|
||
int fake_gthread_fake_function (void) | ||
{ | ||
return 7; | ||
} |
6 changes: 6 additions & 0 deletions
6
test cases/frameworks/22 gir link order/fake-gthread/fake-gthread.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#ifndef FAKE_GTHREAD_H | ||
#define FAKE_GTHREAD_H | ||
|
||
int fake_gthread_fake_function (void); | ||
|
||
#endif /* FAKE_GTHREAD_H */ |
12 changes: 12 additions & 0 deletions
12
test cases/frameworks/22 gir link order/fake-gthread/meson.build
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
fake_gthread_sources = ['fake-gthread.c', 'fake-gthread.h'] | ||
fake_gthread_lib = shared_library( | ||
'gthread-2.0', | ||
sources : fake_gthread_sources, | ||
install : false, | ||
) | ||
|
||
fake_gthread_includes = include_directories('.') | ||
fake_gthread = declare_dependency( | ||
include_directories : fake_gthread_includes, | ||
link_with : fake_gthread_lib, | ||
) |
8 changes: 8 additions & 0 deletions
8
test cases/frameworks/22 gir link order/get-prgname/get-prgname.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
#include "get-prgname.h" | ||
|
||
#include <glib.h> | ||
|
||
const char *get_prgname_get_name (void) | ||
{ | ||
return g_get_prgname (); | ||
} |
6 changes: 6 additions & 0 deletions
6
test cases/frameworks/22 gir link order/get-prgname/get-prgname.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#ifndef GET_PRGNAME_H | ||
#define GET_PRGNAME_H | ||
|
||
const char *get_prgname_get_name (void); | ||
|
||
#endif /* GET_PRGNAME_H */ |
13 changes: 13 additions & 0 deletions
13
test cases/frameworks/22 gir link order/get-prgname/meson.build
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
get_prgname_sources = ['get-prgname.c', 'get-prgname.h'] | ||
get_prgname_lib = shared_library( | ||
'get-prgname', | ||
sources : get_prgname_sources, | ||
dependencies : [glib], | ||
install : false, | ||
) | ||
|
||
get_prgname_includes = include_directories('.') | ||
get_prgname = declare_dependency( | ||
include_directories : get_prgname_includes, | ||
link_with : get_prgname_lib, | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
#include "meson-sample.h" | ||
|
||
#include "get-prgname.h" | ||
#include "fake-gthread.h" | ||
|
||
struct _MesonSample { | ||
GObject parent_instance; | ||
}; | ||
|
||
G_DEFINE_TYPE (MesonSample, meson_sample, G_TYPE_OBJECT) | ||
|
||
/** | ||
* meson_sample_new: | ||
* | ||
* Allocates a new #MesonSample. | ||
* | ||
* Returns: (transfer full): a #MesonSample. | ||
*/ | ||
MesonSample * | ||
meson_sample_new (void) | ||
{ | ||
return g_object_new (MESON_TYPE_SAMPLE, NULL); | ||
} | ||
|
||
static void | ||
meson_sample_class_init (MesonSampleClass *klass) | ||
{ | ||
} | ||
|
||
static void | ||
meson_sample_init (MesonSample *self) | ||
{ | ||
} | ||
|
||
/** | ||
* meson_sample_print_message: | ||
* @self: a #MesonSample. | ||
* | ||
* Prints a message. | ||
*/ | ||
void | ||
meson_sample_print_message (MesonSample *self) | ||
{ | ||
g_return_if_fail (MESON_IS_SAMPLE (self)); | ||
|
||
g_print ("Message: %s\n", get_prgname_get_name ()); | ||
g_print ("Message: %d\n", fake_gthread_fake_function ()); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
#ifndef MESON_SAMPLE_H | ||
#define MESON_SAMPLE_H | ||
|
||
#include <glib-object.h> | ||
|
||
G_BEGIN_DECLS | ||
|
||
#define MESON_TYPE_SAMPLE (meson_sample_get_type()) | ||
|
||
G_DECLARE_FINAL_TYPE (MesonSample, meson_sample, MESON, SAMPLE, GObject) | ||
|
||
MesonSample *meson_sample_new (void); | ||
void meson_sample_print_message (MesonSample *self); | ||
|
||
G_END_DECLS | ||
|
||
#endif /* MESON_SAMPLE_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
project('gir link order', 'c') | ||
|
||
if not dependency('glib-2.0', required : false).found() | ||
error('MESON_SKIP_TEST glib not found.') | ||
endif | ||
|
||
gnome = import('gnome') | ||
glib = dependency('glib-2.0') | ||
gobject = dependency('gobject-2.0') | ||
|
||
# get-prgname is a shared library which uses a function from glib-2.0. It is | ||
# used to introduce external -L flags which may cause -L order problems. | ||
subdir('get-prgname') | ||
|
||
# fake-gthread is a shared library which has the same name as gthread-2.0 from | ||
# GLib. This is used to simulate the case where an older or unrelated version | ||
# of a library is already installed on the system. Our meson sample library | ||
# defined below uses a function from fake-gthread. If meson messes up -L order, | ||
# the linker will find libgthread-2.0.so installed on the system and fail to | ||
# find the symbol our meson sample library uses. | ||
subdir('fake-gthread') | ||
|
||
meson_sample_sources = ['meson-sample.c', 'meson-sample.h'] | ||
meson_sample_lib = shared_library( | ||
'sample', | ||
sources : meson_sample_sources, | ||
dependencies : [gobject, get_prgname, fake_gthread], | ||
install : false, | ||
) | ||
|
||
gnome.generate_gir( | ||
meson_sample_lib, | ||
sources : meson_sample_sources, | ||
nsversion : '1.0', | ||
namespace : 'Meson', | ||
symbol_prefix : 'meson', | ||
identifier_prefix : 'Meson', | ||
includes : ['GObject-2.0'], | ||
install : false, | ||
build_by_default: true, | ||
) |