packaging: Bump up to 1.11.0
[platform/upstream/libevdev.git] / meson.build
1 project('libevdev', 'c',
2         version: '1.11.0', # change autotools version too
3         license: 'MIT/Expat',
4         default_options: [ 'c_std=gnu99', 'warning_level=2' ],
5         meson_version: '>= 0.47.0')
6
7 libevdev_version = meson.project_version().split('.')
8
9 dir_src         = join_paths(meson.source_root(), 'libevdev')
10 dir_src_test    = join_paths(meson.source_root(), 'test')
11
12 # Include directories
13 includes_include = include_directories('include')
14
15 # DO NOT MODIFY THIS
16 # Use symbol versioning instead.
17 libevdev_lt_c=5
18 libevdev_lt_r=0
19 libevdev_lt_a=3
20
21 # convert to soname
22 libevdev_so_version = '@0@.@1@.@2@'.format((libevdev_lt_c - libevdev_lt_a),
23                                            libevdev_lt_a, libevdev_lt_r)
24
25
26 # Compiler setup
27 cc = meson.get_compiler('c')
28 cppflags = ['-Wno-unused-parameter', '-fvisibility=hidden']
29 cflags = cppflags + ['-Wmissing-prototypes', '-Wstrict-prototypes']
30 add_project_arguments(cflags, language: 'c')
31 add_project_arguments(cppflags, language: 'cpp')
32
33 # config.h
34 config_h = configuration_data()
35 config_h.set('_GNU_SOURCE', '1')
36
37 # Dependencies
38 pkgconfig = import('pkgconfig')
39 dep_lm = cc.find_library('m')
40
41 input_h = join_paths(meson.source_root(), 'include', 'linux', host_machine.system(), 'input.h')
42 uinput_h = join_paths(meson.source_root(), 'include', 'linux', host_machine.system(), 'uinput.h')
43 input_event_codes_h = join_paths(meson.source_root(), 'include', 'linux', host_machine.system(), 'input-event-codes.h')
44
45 # event-names.h
46 make_event_names = find_program('libevdev/make-event-names.py')
47 event_names_h = configure_file(input: 'libevdev/libevdev.h',
48                                output: 'event-names.h',
49                                command: [make_event_names, input_h, input_event_codes_h],
50                                capture: true)
51
52
53 # libevdev.so
54 install_headers('libevdev/libevdev.h',
55                 'libevdev/libevdev-uinput.h',
56                 subdir: 'libevdev-1.0/libevdev')
57 src_libevdev = [
58         event_names_h,
59         'libevdev/libevdev.h',
60         'libevdev/libevdev-int.h',
61         'libevdev/libevdev-util.h',
62         'libevdev/libevdev-uinput.c',
63         'libevdev/libevdev-uinput.h',
64         'libevdev/libevdev-uinput-int.h',
65         'libevdev/libevdev.c',
66         'libevdev/libevdev-names.c',
67         'include/linux/input.h',
68         'include/linux/uinput.h',
69         input_event_codes_h,
70         input_h,
71         uinput_h
72 ]
73
74 mapfile = join_paths(dir_src, 'libevdev.sym')
75 version_flag = '-Wl,--version-script,@0@'.format(mapfile)
76 lib_libevdev = library('evdev',
77         src_libevdev,
78         include_directories: [includes_include],
79         dependencies: [],
80         version: libevdev_so_version,
81         link_args: version_flag,
82         link_depends: mapfile,
83         install: true
84 )
85
86 dep_libevdev = declare_dependency(link_with: lib_libevdev)
87
88 pkgconfig.generate(
89         filebase: 'libevdev',
90         name: 'libevdev',
91         description: 'Handler library for evdev events',
92         version: meson.project_version(),
93         libraries: lib_libevdev,
94         subdirs: 'libevdev-1.0',
95 )
96
97 if get_option('tools-enable')
98 man_config = configuration_data()
99 man_config.set('PACKAGE_VERSION', meson.project_version())
100 manpage = configure_file(input: 'doc/libevdev.man.in',
101                          output: 'libevdev.3',
102                          configuration: man_config)
103 install_man(manpage)
104
105
106 # tools
107 executable('libevdev-events',
108            sources: ['tools/libevdev-events.c'],
109            include_directories: [includes_include],
110            dependencies: dep_libevdev,
111            install: false)
112 executable('touchpad-edge-detector',
113            sources: ['tools/touchpad-edge-detector.c'],
114            include_directories: [includes_include],
115            dependencies: [dep_libevdev, dep_lm],
116            install: true)
117 executable('mouse-dpi-tool',
118            sources: ['tools/mouse-dpi-tool.c'],
119            include_directories: [includes_include],
120            dependencies: dep_libevdev,
121            install: true)
122 executable('libevdev-tweak-device',
123            sources: ['tools/libevdev-tweak-device.c'],
124            include_directories: [includes_include],
125            dependencies: dep_libevdev,
126            install: true)
127 install_man('tools/libevdev-tweak-device.1',
128             'tools/touchpad-edge-detector.1')
129 endif
130
131 # tests
132 dep_check = dependency('check', version: '>= 0.9.9',
133                        required: get_option('tests'))
134 if dep_check.found()
135         executable('test-link',
136                    sources: ['test/test-link.c'],
137                    include_directories: [includes_include],
138                    dependencies: dep_libevdev,
139                    install: false)
140         executable('test-compile-pedantic',
141                    sources: ['test/test-compile-pedantic.c'],
142                    c_args: ['-pedantic', '-Werror', '-std=c89'],
143                    include_directories: [includes_include],
144                    dependencies: dep_libevdev,
145                    install: false)
146
147         src_common = [
148                 'test/test-common-uinput.c',
149                 'test/test-common-uinput.h',
150                 'test/test-common.c',
151                 'test/test-common.h',
152                 'test/test-main.c',
153         ]
154         test_event_codes = executable('test-event-codes',
155                                       sources: src_common + [
156                                         'test/test-event-codes.c',
157                                         'test/test-event-names.c',
158                                         'test/test-context.c',
159                                       ],
160                                       include_directories: [includes_include],
161                                       dependencies: [dep_libevdev, dep_check],
162                                       install: false)
163         test('test-event-codes', test_event_codes, suite: 'library')
164
165         test_internals = executable('test-internals',
166                                     sources: src_common + [
167                                         'test/test-int-queue.c',
168                                     ],
169                                     include_directories: [includes_include],
170                                     dependencies: [dep_libevdev, dep_check],
171                                     install: false)
172         test('test-internals', test_internals, suite: 'library')
173
174         test_uinput = executable('test-uinput',
175                                  sources: src_common + [
176                                         'test/test-uinput.c',
177                                  ],
178                                  include_directories: [includes_include],
179                                  dependencies: [dep_libevdev, dep_check],
180                                  install: false)
181         test('test-uinput', test_uinput, suite: 'library')
182
183         test_libevdev = executable('test-libevdev',
184                                    sources: src_common + [
185                                         'test/test-libevdev-init.c',
186                                         'test/test-libevdev-has-event.c',
187                                         'test/test-libevdev-events.c',
188                                    ],
189                                    include_directories: [includes_include],
190                                    dependencies: [dep_libevdev, dep_check],
191                                    install: false)
192         test('test-libevdev', test_libevdev, suite: 'library')
193
194         test_kernel = executable('test-kernel',
195                                  sources: src_common + [
196                                         'test/test-kernel.c',
197                                  ],
198                                  include_directories: [includes_include],
199                                  dependencies: [dep_libevdev, dep_check],
200                                  install: false)
201         test('test-kernel', test_kernel, suite: 'kernel')
202
203
204         valgrind = find_program('valgrind', required: false)
205         if valgrind.found()
206                 valgrind_env = environment()
207                 valgrind_env.set('CK_TIMEOUT_MULTIPLIER', '10')
208                 valgrind_env.set('CK_FORK', 'no')
209                 valgrind_env.set('RUNNING_ON_VALGRIND', '1')
210                 valgrind_suppressions_file = join_paths(dir_src_test, 'valgrind.suppressions')
211                 add_test_setup('valgrind',
212                                 exe_wrapper: [ valgrind,
213                                                 '--leak-check=full',
214                                                 '--gen-suppressions=all',
215                                                 '--error-exitcode=3',
216                                                 '--suppressions=' + valgrind_suppressions_file ],
217                                 env:  valgrind_env,
218                                 timeout_multiplier: 100)
219         else
220                 message('valgrind not found, disabling valgrind test suite')
221         endif
222
223         test_static_link = find_program('test/test-static-symbols-leak.sh')
224         test('static-symbols-leak', test_static_link,
225              args: [meson.current_build_dir()],
226              suite: 'static')
227 endif
228
229 doxygen = find_program('doxygen', required: get_option('documentation'))
230 if doxygen.found()
231         doxygen = find_program('doxygen')
232
233         src_doxygen = files(
234                 # source files
235                 join_paths(dir_src, 'libevdev.h'),
236                 join_paths(dir_src, 'libevdev-uinput.h'),
237                 # style files
238                 'doc/style/bootstrap.css',
239                 'doc/style/customdoxygen.css',
240                 'doc/style/doxy-boot.js',
241                 'doc/style/dynsections.js',
242                 'doc/style/footer.html',
243                 'doc/style/header.html',
244                 'doc/style/layout.xml',
245                 'doc/style/libevdevdoxygen.css',
246                 'doc/style/LICENSE',
247                 'doc/style/README.md',
248                 'doc/style/style.css',
249         )
250         doxyfiles = []
251         foreach f: src_doxygen
252                 df = configure_file(input: f,
253                                     output: '@PLAINNAME@',
254                                     copy: true)
255                 doxyfiles += [df]
256         endforeach
257
258         doc_config = configuration_data()
259         doc_config.set('PACKAGE_NAME', meson.project_name())
260         doc_config.set('PACKAGE_VERSION', meson.project_version())
261         doc_config.set('builddir', meson.current_build_dir())
262         doc_config.set('top_srcdir', meson.source_root())
263         doc_config.set('srcdir', join_paths(meson.source_root(), 'doc'))
264
265         doxyfile = configure_file(input: 'doc/libevdev.doxygen.in',
266                                   output: 'libevdev.doxygen',
267                                   configuration: doc_config)
268         custom_target('doxygen',
269                       input: [doxyfiles, doxyfile] + src_doxygen,
270                       output: ['.'],
271                       command: [doxygen, doxyfile],
272                       install: false,
273                       build_by_default: true)
274 endif
275
276 # Coverity breaks because it doesn't define _Float128 correctly, you'll end
277 # up with a bunch of messages in the form:
278 # "/usr/include/stdlib.h", line 133: error #20: identifier "_Float128" is
279 #           undefined
280 #   extern _Float128 strtof128 (const char *__restrict __nptr,
281 #          ^
282 # We don't use float128 ourselves, it gets pulled in from math.h or
283 # something, so let's just define it as uint128 and move on.
284 # Unfortunately we can't detect the coverity build at meson configure
285 # time, we only know it fails at runtime. So make this an option instead, to
286 # be removed when coverity fixes this again.
287 if get_option('coverity')
288         config_h.set('_Float128', '__uint128_t')
289         config_h.set('_Float32', 'int')
290         config_h.set('_Float32x', 'int')
291         config_h.set('_Float64', 'long')
292         config_h.set('_Float64x', 'long')
293 endif
294
295 ############ output files ############
296 configure_file(output: 'config.h', configuration: config_h)