Merge pull request #3195 from sarum9in/link_whole-generators

Get generated headers from link_whole_targets as meson does for link_targets
pull/3198/head
Jussi Pakkanen 7 years ago committed by GitHub
commit 8bd33ab981
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      mesonbuild/backend/ninjabackend.py
  2. 18
      test cases/common/180 generator link whole/export.h
  3. 30
      test cases/common/180 generator link whole/generator.py
  4. 11
      test cases/common/180 generator link whole/main.c
  5. 65
      test cases/common/180 generator link whole/meson.build
  6. 0
      test cases/common/180 generator link whole/meson_test_function.tmpl
  7. 6
      test cases/common/180 generator link whole/pull_meson_test_function.c

@ -14,6 +14,7 @@
import os, pickle, re, shlex, subprocess import os, pickle, re, shlex, subprocess
from collections import OrderedDict from collections import OrderedDict
import itertools
from pathlib import PurePath from pathlib import PurePath
from . import backends from . import backends
@ -263,7 +264,7 @@ int dummy;
vala_header = File.from_built_file(self.get_target_dir(target), target.vala_header) vala_header = File.from_built_file(self.get_target_dir(target), target.vala_header)
header_deps.append(vala_header) header_deps.append(vala_header)
# Recurse and find generated headers # Recurse and find generated headers
for dep in target.link_targets: for dep in itertools.chain(target.link_targets, target.link_whole_targets):
if isinstance(dep, (build.StaticLibrary, build.SharedLibrary)): if isinstance(dep, (build.StaticLibrary, build.SharedLibrary)):
header_deps += self.get_generated_headers(dep) header_deps += self.get_generated_headers(dep)
return header_deps return header_deps

@ -0,0 +1,18 @@
#pragma once
#if defined BUILDING_EMBEDDED
#define DLL_PUBLIC
#elif defined _WIN32 || defined __CYGWIN__
#if defined BUILDING_DLL
#define DLL_PUBLIC __declspec(dllexport)
#else
#define DLL_PUBLIC __declspec(dllimport)
#endif
#else
#if defined __GNUC__
#define DLL_PUBLIC __attribute__ ((visibility("default")))
#else
#pragma message ("Compiler does not support symbol visibility.")
#define DLL_PUBLIC
#endif
#endif

@ -0,0 +1,30 @@
#!/usr/bin/env python3
import os
import os.path
import sys
def main():
name = os.path.splitext(os.path.basename(sys.argv[1]))[0]
out = sys.argv[2]
hname = os.path.join(out, name + '.h')
cname = os.path.join(out, name + '.c')
print(os.getcwd(), hname)
with open(hname, 'w') as hfile:
hfile.write('''
#pragma once
#include "export.h"
int DLL_PUBLIC {name}();
'''.format(name=name))
with open(cname, 'w') as cfile:
cfile.write('''
#include "{name}.h"
int {name}() {{
return {size};
}}
'''.format(name=name, size=len(name)))
if __name__ == '__main__':
main()

@ -0,0 +1,11 @@
#include "meson_test_function.h"
#include <stdio.h>
int main() {
if (meson_test_function() != 19) {
printf("Bad meson_test_function()\n");
return 1;
}
return 0;
}

@ -0,0 +1,65 @@
project('generator link_whole', 'c')
cc = meson.get_compiler('c')
if cc.get_id() == 'msvc'
if cc.version().version_compare('<19')
error('MESON_SKIP_TEST link_whole only works on VS2015 or newer.')
endif
endif
# This just generates foo.h and foo.c with int foo() defined.
gen_py = find_program('generator.py')
gen = generator(gen_py,
output: ['@BASENAME@.h', '@BASENAME@.c'],
arguments : ['@INPUT@', '@BUILD_DIR@'])
# Test 1: link directly into executable
srcs = gen.process('meson_test_function.tmpl')
exe = executable('exe1', [srcs, 'main.c'], c_args : '-DBUILDING_EMBEDDED')
test('test1', exe)
# Test 2: link into shared library and access from executable
srcs = gen.process('meson_test_function.tmpl')
shlib2 = shared_library('shlib2', [srcs], c_args : '-DBUILDING_DLL')
exe = executable('exe2', 'main.c',
link_with : shlib2,
include_directories : shlib2.private_dir_include(),
)
test('test2', exe)
# Test 3: link into static library and access from executable
srcs = gen.process('meson_test_function.tmpl')
stlib3 = static_library('stlib3', [srcs], c_args : '-DBUILDING_EMBEDDED')
exe = executable('exe3', 'main.c',
c_args : '-DBUILDING_EMBEDDED',
link_with : stlib3,
include_directories : stlib3.private_dir_include(),
)
test('test3', exe)
# Test 4: link into static library, link into shared
# and access from executable. To make sure static_library
# is not dropped use pull_meson_test_function helper.
srcs = gen.process('meson_test_function.tmpl')
stlib4 = static_library('stlib4', [srcs], c_args : '-DBUILDING_DLL')
shlib4 = shared_library('shlib4', 'pull_meson_test_function.c',
c_args : '-DBUILDING_DLL',
link_with : stlib4,
include_directories : stlib4.private_dir_include(),
)
exe = executable('exe4', 'main.c',
link_with : shlib4,
include_directories : stlib4.private_dir_include(),
)
test('test4', exe)
# Test 5: link into static library, link_whole into shared
# and access from executable
srcs = gen.process('meson_test_function.tmpl')
stlib5 = static_library('stlib5', [srcs], c_args : '-DBUILDING_DLL')
shlib5 = shared_library('shlib5', link_whole : stlib5)
exe = executable('exe5', 'main.c',
link_with : shlib5,
include_directories : stlib5.private_dir_include(),
)
test('test5', exe)

@ -0,0 +1,6 @@
#include "export.h"
#include "meson_test_function.h"
int DLL_PUBLIC function_puller() {
return meson_test_function();
}
Loading…
Cancel
Save