summaryrefslogtreecommitdiffstats
path: root/test cases/common/95 manygen/subdir/manygen.py
blob: 931fb61de5577289a8c3a149aa62e3a106758af1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/env python3


# Generates a static library, object file, source
# file and a header file.

import sys, os
import subprocess

with open(sys.argv[1]) as f:
    funcname = f.readline().strip()
outdir = sys.argv[2]
buildtype_args = sys.argv[3]
compiler_type = sys.argv[4]
compiler = sys.argv[5:]

if not os.path.isdir(outdir):
    print('Outdir does not exist.')
    sys.exit(1)

if compiler_type == 'msvc':
    libsuffix = '.lib'
    is_vs = True
    if any(['clang-cl' in c for c in compiler]):
        linker = 'llvm-lib'
    else:
        linker = 'lib'
else:
    libsuffix = '.a'
    is_vs = False
    linker = 'ar'

objsuffix = '.o'

outo = os.path.join(outdir, funcname + objsuffix)
outa = os.path.join(outdir, funcname + libsuffix)
outh = os.path.join(outdir, funcname + '.h')
outc = os.path.join(outdir, funcname + '.c')

tmpc = 'diibadaaba.c'
tmpo = 'diibadaaba' + objsuffix

with open(outc, 'w') as f:
    f.write('''#include"{}.h"
int {}_in_src(void) {{
  return 0;
}}
'''.format(funcname, funcname))

with open(outh, 'w') as f:
    f.write('''#pragma once
int {}_in_lib(void);
int {}_in_obj(void);
int {}_in_src(void);
'''.format(funcname, funcname, funcname))

with open(tmpc, 'w') as f:
    f.write('''int %s_in_obj(void) {
  return 0;
}
''' % funcname)

if is_vs:
    subprocess.check_call(compiler + ['/nologo', '/c', buildtype_args, '/Fo' + outo, tmpc])
else:
    subprocess.check_call(compiler + ['-c', '-o', outo, tmpc])

with open(tmpc, 'w') as f:
    f.write('''int %s_in_lib() {
  return 0;
}
''' % funcname)

if is_vs:
    subprocess.check_call(compiler + ['/nologo', '/c', '/Fo' + tmpo, tmpc])
    subprocess.check_call([linker, '/NOLOGO', '/OUT:' + outa, tmpo])
else:
    subprocess.check_call(compiler + ['-c', '-o', tmpo, tmpc])
    subprocess.check_call([linker, 'csr', outa, tmpo])

os.unlink(tmpo)
os.unlink(tmpc)