From 3d4aad9e0d0038061960469d4d380b7e57d53144 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Mon, 1 Apr 2013 14:58:22 +0300 Subject: [PATCH] Can have multiple different configurations of the same dependency. --- coredata.py | 2 +- dependencies.py | 13 +++++++++++-- interpreter.py | 7 ++++--- test cases/frameworks/1 boost/meson.build | 9 ++++++--- test cases/frameworks/1 boost/nolinkexe.cc | 12 ++++++++++++ 5 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 test cases/frameworks/1 boost/nolinkexe.cc diff --git a/coredata.py b/coredata.py index 4a56b74a4..fa0709f8f 100644 --- a/coredata.py +++ b/coredata.py @@ -72,4 +72,4 @@ forbidden_target_names = {'clean': None, class MesonException(Exception): def __init__(self, *args, **kwargs): - Exception.__init__(args, kwargs) + Exception.__init__(self, *args, **kwargs) diff --git a/dependencies.py b/dependencies.py index 1fd734d11..554eac410 100644 --- a/dependencies.py +++ b/dependencies.py @@ -25,8 +25,8 @@ import os, stat, glob, subprocess, shutil from coredata import MesonException class DependencyException(MesonException): - def __init__(self, args, **kwargs): - MesonException.__init__(args, kwargs) + def __init__(self, *args, **kwargs): + MesonException.__init__(self, *args, **kwargs) class Dependency(): def __init__(self): @@ -322,6 +322,15 @@ class Qt5Dependency(): return False return True +def get_dep_identifier(name, kwargs): + elements = [name] + modlist = kwargs.get('modules', []) + if isinstance(modlist, str): + modlist = [modlist] + for module in modlist: + elements.append(module) + return '/'.join(elements) + # This has to be at the end so the classes it references # are defined. packages = {'boost': BoostDependency, diff --git a/interpreter.py b/interpreter.py index 5b32cc7e6..091ec785d 100755 --- a/interpreter.py +++ b/interpreter.py @@ -680,13 +680,14 @@ class Interpreter(): def func_find_dep(self, node, args, kwargs): self.validate_arguments(args, 1, [str]) name = args[0] - if name in self.coredata.deps: - dep = self.coredata.deps[name] + identifier = dependencies.get_dep_identifier(name, kwargs) + if identifier in self.coredata.deps: + dep = self.coredata.deps[identifier] else: dep = dependencies.Dependency() # Returns always false for dep.found() if not dep.found(): dep = dependencies.find_external_dependency(name, kwargs) - self.coredata.deps[name] = dep + self.coredata.deps[identifier] = dep return dep def func_executable(self, node, args, kwargs): diff --git a/test cases/frameworks/1 boost/meson.build b/test cases/frameworks/1 boost/meson.build index 968cf232b..4bd5582e8 100644 --- a/test cases/frameworks/1 boost/meson.build +++ b/test cases/frameworks/1 boost/meson.build @@ -1,11 +1,14 @@ project('boosttest', 'cxx') -# Use a Boost module that requires a shared library. -# Eventually we would like to be able to detect Boost -# multiple times with different library combinations. +# We want to have multiple separate configurations of Boost +# within one project. The need to be independent of each other. +# Use one without a library dependency and one with it. +nolinkdep = find_dep('boost', modules: 'utility', required : true) linkdep = find_dep('boost', modules : 'thread', required : true) +nolinkexe = executable('nolinkedexe', 'nolinkexe.cc', deps : nolinkdep) linkexe = executable('linkedexe', 'linkexe.cc', deps : linkdep) +add_test('Boost nolinktext', nolinkexe) add_test('Boost linktext', linkexe) diff --git a/test cases/frameworks/1 boost/nolinkexe.cc b/test cases/frameworks/1 boost/nolinkexe.cc new file mode 100644 index 000000000..7b6c6d92b --- /dev/null +++ b/test cases/frameworks/1 boost/nolinkexe.cc @@ -0,0 +1,12 @@ +#include + +class MyClass : boost::noncopyable { +public: + MyClass() {}; + ~MyClass() {}; +}; + +int main(int argc, char **argv) { + MyClass obj; + return 0; +}