parent
92084b6d9e
commit
70f6b769a6
6 changed files with 132 additions and 29 deletions
@ -0,0 +1,100 @@ |
|||||||
|
#!/usr/bin/env python3 -tt |
||||||
|
|
||||||
|
# Copyright 2013 Jussi Pakkanen |
||||||
|
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
# you may not use this file except in compliance with the License. |
||||||
|
# You may obtain a copy of the License at |
||||||
|
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
|
||||||
|
# Unless required by applicable law or agreed to in writing, software |
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
# See the License for the specific language governing permissions and |
||||||
|
# limitations under the License. |
||||||
|
|
||||||
|
# This file contains the detection logic for all those |
||||||
|
# packages and frameworks that either don't provide |
||||||
|
# a pkg-confg file or require extra functionality |
||||||
|
# that can't be expressed with it. |
||||||
|
|
||||||
|
# Currently one file, should probably be split into a |
||||||
|
# package before this gets too big. |
||||||
|
|
||||||
|
import os, stat, glob |
||||||
|
from interpreter import InvalidArguments |
||||||
|
|
||||||
|
class BoostDependency(): |
||||||
|
def __init__(self, kwargs): |
||||||
|
self.incdir = '/usr/include/boost' |
||||||
|
self.libdir = '/usr/lib' |
||||||
|
self.src_modules = {} |
||||||
|
self.lib_modules = {} |
||||||
|
self.detect_version() |
||||||
|
self.requested_modules = self.get_requested(kwargs) |
||||||
|
|
||||||
|
if self.version is not None: |
||||||
|
self.detect_src_modules() |
||||||
|
self.detect_lib_modules() |
||||||
|
self.validate_requested() |
||||||
|
|
||||||
|
def get_compile_flags(self): |
||||||
|
return [] |
||||||
|
|
||||||
|
def get_requested(self, kwargs): |
||||||
|
modules = 'modules' |
||||||
|
if not modules in kwargs: |
||||||
|
raise InvalidArguments('Boost dependency must specify "%s" keyword.' % modules) |
||||||
|
candidates = kwargs[modules] |
||||||
|
if isinstance(candidates, str): |
||||||
|
return [candidates] |
||||||
|
for c in candidates: |
||||||
|
if not isinstance(c, str): |
||||||
|
raise InvalidArguments('Boost module argument is not a string.') |
||||||
|
return candidates |
||||||
|
|
||||||
|
def validate_requested(self): |
||||||
|
for m in self.requested_modules: |
||||||
|
if m not in self.src_modules: |
||||||
|
raise InvalidArguments('Requested Boost module "%s" not found.' % m) |
||||||
|
|
||||||
|
def found(self): |
||||||
|
return self.version is not None |
||||||
|
|
||||||
|
def get_version(self): |
||||||
|
return self.version |
||||||
|
|
||||||
|
def detect_version(self): |
||||||
|
ifile = open(os.path.join(self.incdir, 'version.hpp')) |
||||||
|
for line in ifile: |
||||||
|
if line.startswith("#define") and 'BOOST_LIB_VERSION' in line: |
||||||
|
ver = line.split()[-1] |
||||||
|
ver = ver[1:-1] |
||||||
|
self.version = ver.replace('_', '.') |
||||||
|
return |
||||||
|
self.version = None |
||||||
|
|
||||||
|
def detect_src_modules(self): |
||||||
|
for entry in os.listdir(self.incdir): |
||||||
|
entry = os.path.join(self.incdir, entry) |
||||||
|
if stat.S_ISDIR(os.stat(entry).st_mode): |
||||||
|
self.src_modules[os.path.split(entry)[-1]] = True |
||||||
|
|
||||||
|
def detect_lib_modules(self): |
||||||
|
globber = 'libboost_*.so' # FIXME, make platform independent. |
||||||
|
for entry in glob.glob(os.path.join(self.libdir, globber)): |
||||||
|
if entry.endswith('-mt.so'): # Fixme, seems to be Windows specific. |
||||||
|
continue |
||||||
|
lib = os.path.basename(entry) |
||||||
|
self.lib_modules[(lib.split('.')[0].split('_', 1)[-1])] = True |
||||||
|
|
||||||
|
def get_link_flags(self): |
||||||
|
flags = [] # Fixme, add -L if necessary. |
||||||
|
for module in self.requested_modules: |
||||||
|
if module in self.lib_modules: |
||||||
|
linkcmd = '-lboost_' + module |
||||||
|
flags.append(linkcmd) |
||||||
|
return flags |
||||||
|
|
||||||
|
packages = {'boost': BoostDependency} |
@ -1,14 +1,11 @@ |
|||||||
project('boosttest', 'cxx') |
project('boosttest', 'cxx') |
||||||
|
|
||||||
# One test case for a Boost module that is |
# Use a Boost module that requires a shared library. |
||||||
# header only and one test case for a module that |
# Eventually we would like to be able to detect Boost |
||||||
# requires linking with a shared library. |
# multiple times with different library combinations. |
||||||
|
|
||||||
nolinkdep = find_dep('boost', modules : 'utility', required : true) |
|
||||||
linkdep = find_dep('boost', modules : 'thread', required : true) |
linkdep = find_dep('boost', modules : 'thread', required : true) |
||||||
|
|
||||||
nolinkexe = executable('nolinkexe', 'nolinkexe.cc', dep : nolinkdep) |
linkexe = executable('linkedexe', 'linkexe.cc', deps : linkdep) |
||||||
linkexe = executable('linkedexe', 'linkexe.cc', dep : linkdep) |
|
||||||
|
|
||||||
add_test('nolinktest', nolinkexe) |
add_test('Boost linktext', linkexe) |
||||||
add_test('linktext', linkexe) |
|
||||||
|
@ -1,20 +0,0 @@ |
|||||||
#include<boost/utility.hpp> |
|
||||||
|
|
||||||
class MyClass : boost::noncopyable { |
|
||||||
private: |
|
||||||
int x; |
|
||||||
|
|
||||||
public: |
|
||||||
MyClass() { |
|
||||||
x = 44; |
|
||||||
} |
|
||||||
|
|
||||||
int getValue() const { return x; } |
|
||||||
}; |
|
||||||
|
|
||||||
int main(int argc, char **argv) { |
|
||||||
MyClass foo; |
|
||||||
if(foo.getValue() == 44) |
|
||||||
return 0; |
|
||||||
return 1; |
|
||||||
} |
|
Loading…
Reference in new issue