diff --git a/mesonbuild/build.py b/mesonbuild/build.py index c626ce5a0..33d91f35e 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -39,7 +39,7 @@ from .mesonlib import ( MesonBugException ) from .compilers import ( - is_object, clink_langs, sort_clink, lang_suffixes, all_languages, + is_object, clink_langs, sort_clink, all_languages, is_known_suffix, detect_static_linker ) from .interpreterbase import FeatureNew, FeatureDeprecated @@ -950,12 +950,15 @@ class BuildTarget(Target): 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. # diff --git a/test cases/common/253 subproject extracted objects/foo.c b/test cases/common/253 subproject extracted objects/foo.c new file mode 100644 index 000000000..f6c7aebe0 --- /dev/null +++ b/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; +} diff --git a/test cases/common/253 subproject extracted objects/meson.build b/test cases/common/253 subproject extracted objects/meson.build new file mode 100644 index 000000000..bad450fab --- /dev/null +++ b/test cases/common/253 subproject extracted objects/meson.build @@ -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) diff --git a/test cases/common/253 subproject extracted objects/subprojects/myobjects/cpplib.cpp b/test cases/common/253 subproject extracted objects/subprojects/myobjects/cpplib.cpp new file mode 100644 index 000000000..12ef756c7 --- /dev/null +++ b/test cases/common/253 subproject extracted objects/subprojects/myobjects/cpplib.cpp @@ -0,0 +1,6 @@ +#define BUILDING_DLL +#include "cpplib.h" + +extern "C" int DLL_PUBLIC cppfunc(void) { + return 42; +} diff --git a/test cases/common/253 subproject extracted objects/subprojects/myobjects/cpplib.h b/test cases/common/253 subproject extracted objects/subprojects/myobjects/cpplib.h new file mode 100644 index 000000000..a1c38b3ba --- /dev/null +++ b/test cases/common/253 subproject extracted objects/subprojects/myobjects/cpplib.h @@ -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); diff --git a/test cases/common/253 subproject extracted objects/subprojects/myobjects/meson.build b/test cases/common/253 subproject extracted objects/subprojects/myobjects/meson.build new file mode 100644 index 000000000..1c2729bc1 --- /dev/null +++ b/test cases/common/253 subproject extracted objects/subprojects/myobjects/meson.build @@ -0,0 +1,3 @@ +project('myobjects', 'cpp') + +sublib = static_library('sublib', 'cpplib.cpp') diff --git a/test cases/common/253 subproject extracted objects/test.json b/test cases/common/253 subproject extracted objects/test.json new file mode 100644 index 000000000..baa5dfb8b --- /dev/null +++ b/test cases/common/253 subproject extracted objects/test.json @@ -0,0 +1,5 @@ +{ + "installed": [ + { "type": "file", "file": "usr/lib/libfoo.a" } + ] +}