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