Skip to content

Commit

Permalink
add compilers from extracted objects directly to build targets
Browse files Browse the repository at this point in the history
In order to reliably link to static libraries or individual object
files, we need to take their languages into account as well. For static
libraries this is easy: we just add the static library's list of
compilers to the build target. For extracted objects, we need to only
add the ones for the objects we use.

But we did this really inefficiently -- in fact, downright terribly. We
iterated over all source files from the extracted objects, then tried to
look up a new compiler for them. Even though the extracted objects
already had a list of compilers! This broke once compilers were made
per-subproject, because while the extracted objects have a reference to
all the compilers it needs (just like static archives do, actually) we
might not actually be able to look up that compiler from scratch inside
the current subproject.

Fix this by asking the extracted objects to categorize all its own
sources and return the compilers we want.

Fixes #10579
  • Loading branch information
eli-schwartz authored and nirbheek committed Aug 12, 2022
1 parent ce9364d commit 62a95ef
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 4 deletions.
11 changes: 7 additions & 4 deletions mesonbuild/build.py
Expand Up @@ -39,7 +39,7 @@
MesonBugException
)
from .compilers import (
Compiler, is_object, clink_langs, sort_clink, lang_suffixes, all_languages,
Compiler, is_object, clink_langs, sort_clink, all_languages,
is_known_suffix, detect_static_linker
)
from .linkers import StaticLinker
Expand Down Expand Up @@ -948,12 +948,15 @@ def process_compilers(self) -> T.List[str]:
for o in self.objects:
if not isinstance(o, ExtractedObjects):
continue
for s in o.srclist:
compsrcs = o.classify_all_sources(o.srclist, [])
for comp in compsrcs:
# Don't add Vala sources since that will pull in the Vala
# compiler even though we will never use it since we are
# dealing with compiled C code.
if not s.endswith(lang_suffixes['vala']):
sources.append(s)
if comp.language == 'vala':
continue
if comp.language not in self.compilers:
self.compilers[comp.language] = comp
if sources:
# For each source, try to add one compiler that can compile it.
#
Expand Down
11 changes: 11 additions & 0 deletions test cases/common/253 subproject extracted objects/foo.c
@@ -0,0 +1,11 @@
#if defined _WIN32 || defined __CYGWIN__
#define DLL_IMPORT __declspec(dllimport)
#else
#define DLL_IMPORT
#endif

int DLL_IMPORT cppfunc(void);

int otherfunc(void) {
return cppfunc() != 42;
}
@@ -0,0 +1,5 @@
project('link to extracted objects', 'c')

sublib = subproject('myobjects').get_variable('sublib')

mainlib = static_library('foo', 'foo.c', install: true, link_with: sublib)
@@ -0,0 +1,6 @@
#define BUILDING_DLL
#include "cpplib.h"

extern "C" int DLL_PUBLIC cppfunc(void) {
return 42;
}
@@ -0,0 +1,12 @@
/* See http://gcc.gnu.org/wiki/Visibility#How_to_use_the_new_C.2B-.2B-_visibility_support */
#if defined(_WIN32) || defined(__CYGWIN__)
#ifdef BUILDING_DLL
#define DLL_PUBLIC __declspec(dllexport)
#else
#define DLL_PUBLIC __declspec(dllimport)
#endif
#else
#define DLL_PUBLIC __attribute__ ((visibility ("default")))
#endif

extern "C" int DLL_PUBLIC cppfunc(void);
@@ -0,0 +1,3 @@
project('myobjects', 'cpp')

sublib = static_library('sublib', 'cpplib.cpp')
5 changes: 5 additions & 0 deletions test cases/common/253 subproject extracted objects/test.json
@@ -0,0 +1,5 @@
{
"installed": [
{ "type": "file", "file": "usr/lib/libfoo.a" }
]
}

0 comments on commit 62a95ef

Please sign in to comment.