We have code to support this, but no tests. That seems pretty bad. And better yet, it doesn't work on MSVC in some cases.pull/8970/head
parent
d031a684a6
commit
1346725ec9
6 changed files with 88 additions and 5 deletions
@ -0,0 +1,6 @@ |
||||
#include <stdio.h> |
||||
#include "lib.h" |
||||
|
||||
void c_func(void) { |
||||
printf("This is a " MODE " C library\n"); |
||||
} |
@ -0,0 +1,22 @@ |
||||
#pragma once |
||||
|
||||
#if defined _WIN32 || defined __CYGWIN__ |
||||
#if defined BUILDING_ADDER |
||||
#define DLL_PUBLIC __declspec(dllexport) |
||||
#else |
||||
#define DLL_PUBLIC __declspec(dllimport) |
||||
#endif |
||||
#else |
||||
#if defined __GNUC__ |
||||
#if defined BUILDING_ADDER |
||||
#define DLL_PUBLIC __attribute__ ((visibility("default"))) |
||||
#else |
||||
#define DLL_PUBLIC |
||||
#endif |
||||
#else |
||||
#pragma message("Compiler does not support symbol visibility.") |
||||
#define DLL_PUBLIC |
||||
#endif |
||||
#endif |
||||
|
||||
DLL_PUBLIC void c_func(void); |
@ -0,0 +1,9 @@ |
||||
extern "C" { |
||||
fn c_func(); |
||||
} |
||||
|
||||
fn main() { |
||||
unsafe { |
||||
c_func(); |
||||
} |
||||
} |
@ -0,0 +1,14 @@ |
||||
project('internal dependencies', 'c', 'rust') |
||||
|
||||
test_prog = find_program('test.py') |
||||
|
||||
static = static_library('static', 'lib.c', c_args : '-DMODE="static"') |
||||
exe = executable('static', 'main.rs', link_with : static) |
||||
test('static linkage', test_prog, args : [exe, 'This is a static C library']) |
||||
|
||||
# Shared linkage with rust doesn't work on macOS with meson, yet |
||||
if host_machine.system() != 'darwin' |
||||
shared = shared_library('shared', 'lib.c', c_args : '-DMODE="shared"') |
||||
exe = executable('shared', 'main.rs', link_with : shared) |
||||
test('shared linkage', test_prog, args : [exe, 'This is a shared C library']) |
||||
endif |
@ -0,0 +1,25 @@ |
||||
#!/usr/bin/env python3 |
||||
|
||||
import argparse |
||||
import subprocess |
||||
import sys |
||||
|
||||
|
||||
def main() -> None: |
||||
parser = argparse.ArgumentParser() |
||||
parser.add_argument('command') |
||||
parser.add_argument('expected') |
||||
args = parser.parse_args() |
||||
|
||||
out = subprocess.run(args.command, stdout=subprocess.PIPE) |
||||
actual = out.stdout.decode().strip() |
||||
|
||||
if args.expected != actual: |
||||
print('expected:', args.expected, file=sys.stderr) |
||||
print('actual: ', actual, file=sys.stderr) |
||||
sys.exit(1) |
||||
sys.exit(0) |
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
main() |
Loading…
Reference in new issue