Merge pull request #1654 from dcbaker/c-cpp-link
Add a testcase for linking C and C++ static archives into a shared li…pull/1660/head
commit
33b5ddf35e
10 changed files with 238 additions and 17 deletions
@ -0,0 +1,19 @@ |
|||||||
|
/* Copyright © 2017 Dylan Baker
|
||||||
|
* |
||||||
|
* 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. |
||||||
|
*/ |
||||||
|
#include "foo.h" |
||||||
|
|
||||||
|
int forty_two(void) { |
||||||
|
return 42; |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* Copyright © 2017 Dylan Baker
|
||||||
|
* |
||||||
|
* 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. |
||||||
|
*/ |
||||||
|
#include <vector> |
||||||
|
|
||||||
|
const int cnums[] = {0, 61}; |
||||||
|
|
||||||
|
template<typename T, int N> |
||||||
|
std::vector<T> makeVector(const T (&data)[N]) |
||||||
|
{ |
||||||
|
return std::vector<T>(data, data+N); |
||||||
|
} |
||||||
|
|
||||||
|
namespace { |
||||||
|
std::vector<int> numbers = makeVector(cnums); |
||||||
|
} |
||||||
|
|
||||||
|
extern "C" int six_one(void) { |
||||||
|
return numbers[1]; |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
/* Copyright © 2017 Dylan Baker
|
||||||
|
* |
||||||
|
* 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. |
||||||
|
*/ |
||||||
|
|
||||||
|
int forty_two(void); |
@ -0,0 +1,24 @@ |
|||||||
|
/* Copyright © 2017 Dylan Baker
|
||||||
|
* |
||||||
|
* 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. |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
int six_one(void); |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
} |
||||||
|
#endif |
@ -0,0 +1,23 @@ |
|||||||
|
/* Copyright © 2017 Dylan Baker
|
||||||
|
* |
||||||
|
* 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. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "foo.h" |
||||||
|
#include "foo.hpp" |
||||||
|
#include "foobar.h" |
||||||
|
|
||||||
|
void mynumbers(int nums[]) { |
||||||
|
nums[0] = forty_two(); |
||||||
|
nums[1] = six_one(); |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
/* Copyright © 2017 Dylan Baker
|
||||||
|
* |
||||||
|
* 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. |
||||||
|
*/ |
||||||
|
|
||||||
|
void mynumbers(int nums[]); |
@ -0,0 +1,58 @@ |
|||||||
|
# Copyright © 2017 Dylan Baker |
||||||
|
# |
||||||
|
# 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. |
||||||
|
|
||||||
|
project('C and C++ static link test', ['c', 'cpp']) |
||||||
|
|
||||||
|
libc = static_library('cfoo', ['foo.c', 'foo.h']) |
||||||
|
|
||||||
|
# Test that linking C libs to external static C++ libs uses the C++ linker |
||||||
|
# Since we can't depend on the test system to provide this, we create one |
||||||
|
# ourselves at configure time and then 'find' it with cxx.find_library(). |
||||||
|
cxx = meson.get_compiler('cpp') |
||||||
|
|
||||||
|
if cxx.get_id() == 'msvc' |
||||||
|
compile_cmd = ['/c', '@INPUT@', '/Fo@OUTPUT@'] |
||||||
|
stlib_cmd = ['lib', '/OUT:@OUTPUT@', '@INPUT@'] |
||||||
|
else |
||||||
|
compile_cmd = ['-c', '-fPIC', '@INPUT@', '-o', '@OUTPUT@'] |
||||||
|
stlib_cmd = ['ar', 'csr', '@OUTPUT@', '@INPUT@'] |
||||||
|
endif |
||||||
|
|
||||||
|
foo_cpp_o = configure_file( |
||||||
|
input : 'foo.cpp', |
||||||
|
output : 'foo.cpp.o', |
||||||
|
command : cxx.cmd_array() + compile_cmd) |
||||||
|
|
||||||
|
configure_file( |
||||||
|
input : foo_cpp_o, |
||||||
|
output : 'libstcppext.a', |
||||||
|
command : stlib_cmd) |
||||||
|
|
||||||
|
libstcppext = cxx.find_library('stcppext', dirs : meson.current_build_dir()) |
||||||
|
|
||||||
|
libfooext = shared_library( |
||||||
|
'fooext', |
||||||
|
['foobar.c', 'foobar.h'], |
||||||
|
link_with : libc, |
||||||
|
dependencies : libstcppext, |
||||||
|
) |
||||||
|
|
||||||
|
# Test that linking C libs to internal static C++ libs uses the C++ linker |
||||||
|
libcpp = static_library('cppfoo', ['foo.cpp', 'foo.hpp']) |
||||||
|
|
||||||
|
libfoo = shared_library( |
||||||
|
'foo', |
||||||
|
['foobar.c', 'foobar.h'], |
||||||
|
link_with : [libc, libcpp], |
||||||
|
) |
Loading…
Reference in new issue