-
Notifications
You must be signed in to change notification settings - Fork 59
/
meson.build
190 lines (163 loc) · 6.36 KB
/
meson.build
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# 17 march 2019
# TODO I'm not sure how to allow building 32-bit instead of 64-bit with meson
# TODO remove cpp from this list once https://github.com/mesonbuild/meson/issues/5181 is settled; move it to the OS checks and under cpp-multithread
project('libui', ['c', 'cpp'],
meson_version: '>=0.58.0',
default_options: [
'buildtype=debug', # build debug by default
'default_library=shared', # build shared libraries by default
'layout=flat', # keep all outputs together by default
# these are forced options, but meson doesn't let me set these up separately before I call project() (TODO https://github.com/mesonbuild/meson/issues/5179)
'warning_level=3', # always max warnings
'b_pch=false', # we don't want precompiled headers
'b_staticpic=true', # use PIC even for static libraries
'c_std=c99', # strict C99
'c_winlibs=', # we define our own Windows libraries
'cpp_std=c++11', # strict C++11
'cpp_eh=sc', # shut the compiler up in some cases
'cpp_winlibs=', # likewise as with c_winlibs
'wrap_mode=forcefallback' # build cmocka locally
],
license: 'MIT')
# TODO after https://github.com/mesonbuild/meson/issues/5179 is settled, remove these
libui_OS = host_machine.system()
libui_MSVC = meson.get_compiler('c').get_id() == 'msvc'
# TODO switch to tabs; the spaces are just so I can share this file while I'm writing it
libui_forced_options = {
'warning_level': '3', # always max warnings
'b_pch': 'false', # we don't want precompiled headers
'b_staticpic': 'true', # use PIC even for static libraries
'c_std': 'c99', # strict C99
'c_winlibs': '[]', # we define our own Windows libraries
'cpp_std': 'c++11', # strict C++11
'cpp_eh': 'sc', # shut the compiler up in some cases
'cpp_winlibs': '[]', # likewise as with c_winlibs
}
foreach name, value : libui_forced_options
# TODO rewrite this when https://github.com/mesonbuild/meson/issues/5181 is settled
if not ((name == 'c_winlibs' or name == 'cpp_eh' or name == 'cpp_winlibs') and not libui_MSVC) and not (name == 'c_std' and libui_MSVC)
actual = '@0@'.format(get_option(name))
if actual != value
error('sorry, but libui requires that option ' + name + ' has the default value ' + value)
endif
endif
endforeach
libui_OS = host_machine.system()
libui_MSVC = meson.get_compiler('c').get_id() == 'msvc'
if libui_OS == 'darwin'
add_languages('objc',
required: true)
endif
libui_mode = get_option('default_library')
if libui_mode == 'both'
error('sorry, but libui does not support building both shared and static libraries at the same time, because Windows resource file rules differ between the two')
endif
libui_is_debug = get_option('buildtype').startswith('debug')
libui_project_compile_args = []
libui_project_link_args = []
if libui_OS == 'darwin'
libui_darwin_langs = ['c', 'objc']
libui_macosx_version_min = '-mmacosx-version-min=10.8'
add_global_arguments(libui_macosx_version_min, language: libui_darwin_langs)
add_global_link_arguments(libui_macosx_version_min, language: libui_darwin_langs)
libui_arch = ['-arch', 'x86_64', '-arch', 'arm64']
add_global_arguments(libui_arch, language: libui_darwin_langs)
add_global_link_arguments(libui_arch, language: libui_darwin_langs)
endif
if libui_MSVC
# TODO subsystem version
libui_project_compile_args += [
'/wd4100',
'/bigobj',
]
if libui_is_debug
libui_project_compile_args += ['/RTC1', '/RTCs', '/RTCu']
endif
libui_project_link_args += [
'/LARGEADDRESSAWARE',
'/INCREMENTAL:NO',
'/MANIFEST:NO',
]
# TODO autogenerate a .def file?
else
libui_project_compile_args += [
'-Wno-unused-parameter',
'-Wno-switch',
]
if libui_OS == 'windows'
# don't require shipping the MinGW-w64 DLLs
libui_project_link_args += [
'-static',
'-static-libgcc',
'-static-libstdc++',
]
endif
endif
# TODO come up with a better way to do this, both for libui (the compiler define, used by winapi.hpp, and the manifest args) and for the binaries (the manifest args)
# TODO (after the above TODO is resolved) move that below the part below that actually adds these arguments
libui_manifest_args = []
if libui_mode == 'static'
libui_project_compile_args += ['-D_UI_STATIC']
libui_manifest_args = ['-D_UI_STATIC']
endif
add_project_arguments(libui_project_compile_args,
language: ['c', 'cpp', 'objc'])
add_project_link_arguments(libui_project_link_args,
language: ['c', 'cpp', 'objc'])
# TODO:
# meson determins whether -Wl,--no-undefined is provided via
# built-in option b_lundef, and it's true by default, which is what
# we want (so I don't make mistakes like asking for unknown
# functions in my dependencies). However, meson also is smart
# about specifying this properly on systems that don't support it, like
# FreeBSD (where I had the comment "figure out why FreeBSD
# follows linked libraries here" when I was on cmake) and OpenBSD
# (according to someone on freenode #mesonbuild), but it isn't clear
# whether it's just ignored or if the value is forced to false.
# Therefore, once this is determined, we can uncomment the
# following.
libui_libui_link_args = []
#if not libui_MSVC and get_option("b_lundef")
# TODO what should this be on MSVC?
# libui_libui_link_args += ['-Wl,--no-allow-shlib-undefined']
#endif
libui_sources = []
libui_deps = []
libui_rpath = ''
subdir('common')
if libui_OS == 'windows'
subdir('windows')
install_headers('ui_windows.h')
elif libui_OS == 'darwin'
subdir('darwin')
install_headers('ui_darwin.h')
else
subdir('unix')
install_headers('ui_unix.h')
endif
libui_libui = library('ui', libui_sources,
dependencies: libui_deps,
build_rpath: libui_rpath,
install_rpath: libui_rpath,
name_prefix: 'lib', # always call it libui, even in Windows DLLs
install: true,
gnu_symbol_visibility: 'hidden',
c_args: ['-Dlibui_EXPORTS'],
cpp_args: ['-Dlibui_EXPORTS'],
objc_args: ['-Dlibui_EXPORTS'],
link_args: libui_libui_link_args)
install_headers('ui.h')
# TODO when the API is stable enough to be versioned, create a pkg-config file (https://mesonbuild.com/Pkgconfig-module.html) and a declare_dependency() section too
libui_binary_deps = []
if libui_mode == 'static'
libui_binary_deps = libui_deps
endif
# Export symbols for use of libui as a meson subproject
libui_dep = declare_dependency(include_directories: include_directories('.'),
link_with : libui_libui)
if get_option('tests')
subdir('test')
endif
if get_option('examples')
subdir('examples')
endif