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
from collections import OrderedDict
import itertools
from pathlib import PurePath
from . import backends
@ -263,7 +264,7 @@ int dummy;
vala_header = File.from_built_file(self.get_target_dir(target), target.vala_header)
header_deps.append(vala_header)
# 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)):
header_deps += self.get_generated_headers(dep)
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