run ./script/meson.py
[liba.git] / meson.build
blobc04f1fa0bc096c263f7396fb5c06ab6d4c3b5d0c
1 project('liba', 'c', 'cpp',
2         default_options: [
3             'c_std=c11',
4             'cpp_std=c++11',
5             'b_ndebug=if-release',
6             'buildtype=debugoptimized',
7         ],
8         license: 'MPL-2.0',
9         version: '0.1.14')
11 a_have_h = configuration_data()
12 a_have_h.set('version', meson.version())
13 a_have_h.set('A_VERSION', meson.project_version())
14 a_have_h.set('A_VERSION_MAJOR', meson.project_version().split('.')[0])
15 a_have_h.set('A_VERSION_MINOR', meson.project_version().split('.')[1])
16 a_have_h.set('A_VERSION_PATCH', meson.project_version().split('.')[2])
17 a_have_h.set('A_SIZE_FLOAT', get_option('float'))
18 if target_machine.endian() == 'little'
19     a_have_h.set('A_BYTE_ORDER', 1234)
20 elif target_machine.endian() == 'big'
21     a_have_h.set('A_BYTE_ORDER', 4321)
22 endif
24 compiler = meson.get_compiler('c')
25 a_have_h.set('A_SIZE_POINTER', compiler.sizeof('void *'))
27 math = ['expm1', 'log1p', 'hypot', 'atan2',
28         'csqrt', 'cpow', 'cexp', 'clog',
29         'csin', 'ccos', 'ctan',
30         'csinh', 'ccosh', 'ctanh',
31         'casin', 'cacos', 'catan',
32         'casinh', 'cacosh', 'catanh']
34 foreach func: math
35     float = get_option('float').to_int()
36     have = 'A_HAVE_' + func.to_upper()
37     if  float == 4
38         func = func + 'f'
39     elif float > 8
40         func = func + 'l'
41     endif
42     if compiler.has_function(func)
43         a_have_h.set(have, '1')
44     endif
45 endforeach
47 configure_file(
48     input: 'include/a.meson.h.in',
49     output: 'a.meson.h',
50     configuration: a_have_h,
53 c_args = []
54 sources = [
55     'include/a/a.h',
56     'include/a/avl.h',
57     'include/a/buf.h',
58     'include/a/complex.h',
59     'include/a/crc.h',
60     'include/a/fuzzy.h',
61     'include/a/hpf.h',
62     'include/a/list.h',
63     'include/a/lpf.h',
64     'include/a/math.h',
65     'include/a/mf.h',
66     'include/a/notefreqs.h',
67     'include/a/pid.h',
68     'include/a/pid_fuzzy.h',
69     'include/a/pid_neuro.h',
70     'include/a/poly.h',
71     'include/a/que.h',
72     'include/a/rbt.h',
73     'include/a/regress.h',
74     'include/a/regress_linear.h',
75     'include/a/regress_simple.h',
76     'include/a/slist.h',
77     'include/a/str.h',
78     'include/a/tf.h',
79     'include/a/trajbell.h',
80     'include/a/trajpoly3.h',
81     'include/a/trajpoly5.h',
82     'include/a/trajpoly7.h',
83     'include/a/trajtrap.h',
84     'include/a/utf.h',
85     'include/a/vec.h',
86     'include/a/version.h',
87     'src/a.c',
88     'src/avl.c',
89     'src/buf.c',
90     'src/complex.c',
91     'src/crc.c',
92     'src/fuzzy.c',
93     'src/math.c',
94     'src/mf.c',
95     'src/pid.c',
96     'src/pid_fuzzy.c',
97     'src/pid_neuro.c',
98     'src/poly.c',
99     'src/que.c',
100     'src/rbt.c',
101     'src/regress.c',
102     'src/regress_linear.c',
103     'src/regress_simple.c',
104     'src/str.c',
105     'src/tf.c',
106     'src/trajbell.c',
107     'src/trajpoly3.c',
108     'src/trajpoly5.c',
109     'src/trajpoly7.c',
110     'src/trajtrap.c',
111     'src/utf.c',
112     'src/vec.c',
113     'src/version.c',
116 a_include = include_directories('include')
117 a_meson_h = meson.current_build_dir() / 'a.meson.h'
118 a_h = meson.current_source_dir() / 'include' / 'a' / 'a.h'
120 python = import('python').find_installation()
121 res = run_command(python, '-c', '''import os, sys
122 dir = os.path.dirname('@1@')
123 src = os.path.basename('@0@')
124 dst = os.path.basename('@1@')
125 cur = "#if defined(A_HAVE_H)"
126 new = '#include "' + dst + '"\n' + cur
127 with open('@0@', "r") as f:
128     txt = f.read()
129 res = txt.replace(cur, new)
130 if res != txt:
131     new = os.path.join(dir, src)
132     with open(new, "wb") as f:
133         f.write(res.encode())
134 dir = os.path.dirname('@0@')
135 res = os.path.relpath('@1@', dir)
136 sys.stdout.write(res.replace("\\", "/"))
137 '''.format(a_h, a_meson_h), capture: true, check: true
139 if res.returncode() == 0
140     c_args += ['-DA_EXPORTS', '-DA_HAVE_H="' + res.stdout() + '"']
141 endif
143 a = both_libraries('a', sources, c_args: c_args, cpp_args: c_args,
144     dependencies: compiler.find_library('m', required: false),
145     implicit_include_directories: false,
146     include_directories: a_include,
147     install: true,
148     link_args: get_option('math'),
149     name_prefix: 'lib',
150     pic: true,
151     version: meson.project_version(),
154 install_headers(a_meson_h, subdir: 'a')
155 install_headers(meson.current_build_dir() / 'a.h', subdir: 'a')
156 install_subdir('include/a', exclude_files: ['a.h'],
157     install_dir: get_option('includedir'),
160 if get_option('rust')
161     rust_args = []
162     add_languages('rust')
163     if get_option('float').to_int() == 4
164         rust_args += ['--cfg', 'feature="float"']
165     endif
166     static_library('liba', 'src/lib.rs',
167         rust_args: rust_args,
168         install: true,
169         link_with: a.get_static_lib(),
170     )
171 endif
173 subdir('java')
174 subdir('lua')
175 subdir('python')
176 subdir('quickjs')