1*0d6140beSAndroid Build Coastguard Worker# Copyright © 2018 Intel Corporation 2*0d6140beSAndroid Build Coastguard Worker# 3*0d6140beSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*0d6140beSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*0d6140beSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*0d6140beSAndroid Build Coastguard Worker# 7*0d6140beSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*0d6140beSAndroid Build Coastguard Worker# 9*0d6140beSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*0d6140beSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*0d6140beSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*0d6140beSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*0d6140beSAndroid Build Coastguard Worker# limitations under the License. 14*0d6140beSAndroid Build Coastguard Worker 15*0d6140beSAndroid Build Coastguard Workerproject( 16*0d6140beSAndroid Build Coastguard Worker 'cmocka', 17*0d6140beSAndroid Build Coastguard Worker ['c'], 18*0d6140beSAndroid Build Coastguard Worker version : '1.1.5', 19*0d6140beSAndroid Build Coastguard Worker license : 'APLv2', 20*0d6140beSAndroid Build Coastguard Worker meson_version : '>= 0.48.0', 21*0d6140beSAndroid Build Coastguard Worker default_options : ['c_std=c99', 'buildtype=debugoptimized'], 22*0d6140beSAndroid Build Coastguard Worker) 23*0d6140beSAndroid Build Coastguard Worker 24*0d6140beSAndroid Build Coastguard Workerlib_version = '0.5.0' 25*0d6140beSAndroid Build Coastguard Worker 26*0d6140beSAndroid Build Coastguard Worker# TODO: pkg-config 27*0d6140beSAndroid Build Coastguard Worker# TODO: cmake-config 28*0d6140beSAndroid Build Coastguard Worker 29*0d6140beSAndroid Build Coastguard Workerinc_include = include_directories('include') 30*0d6140beSAndroid Build Coastguard Worker 31*0d6140beSAndroid Build Coastguard Worker##################### 32*0d6140beSAndroid Build Coastguard Worker# Config Generation # 33*0d6140beSAndroid Build Coastguard Worker##################### 34*0d6140beSAndroid Build Coastguard Worker 35*0d6140beSAndroid Build Coastguard Workercc_dict = { 36*0d6140beSAndroid Build Coastguard Worker 'compiler': meson.get_compiler('c'), 37*0d6140beSAndroid Build Coastguard Worker 'machine': host_machine, 38*0d6140beSAndroid Build Coastguard Worker 'config_h_subdir': 'private', 39*0d6140beSAndroid Build Coastguard Worker 'native': false 40*0d6140beSAndroid Build Coastguard Worker} 41*0d6140beSAndroid Build Coastguard Worker 42*0d6140beSAndroid Build Coastguard Workercc_native_dict = { 43*0d6140beSAndroid Build Coastguard Worker 'compiler': meson.get_compiler('c', native: true), 44*0d6140beSAndroid Build Coastguard Worker 'machine': build_machine, 45*0d6140beSAndroid Build Coastguard Worker 'config_h_subdir': 'private_native', 46*0d6140beSAndroid Build Coastguard Worker 'native': true 47*0d6140beSAndroid Build Coastguard Worker} 48*0d6140beSAndroid Build Coastguard Worker 49*0d6140beSAndroid Build Coastguard Workerconfigurations = [cc_dict, cc_native_dict] 50*0d6140beSAndroid Build Coastguard Worker 51*0d6140beSAndroid Build Coastguard Workerforeach entry : configurations 52*0d6140beSAndroid Build Coastguard Worker compiler = entry.get('compiler') 53*0d6140beSAndroid Build Coastguard Worker is_native = entry.get('native') 54*0d6140beSAndroid Build Coastguard Worker machine = entry.get('machine') 55*0d6140beSAndroid Build Coastguard Worker 56*0d6140beSAndroid Build Coastguard Worker config = configuration_data() 57*0d6140beSAndroid Build Coastguard Worker 58*0d6140beSAndroid Build Coastguard Worker if ['gcc', 'clang'].contains(compiler.get_id()) 59*0d6140beSAndroid Build Coastguard Worker add_project_arguments( 60*0d6140beSAndroid Build Coastguard Worker # I've explicitly skipped the duplicated -W versions when they also test 61*0d6140beSAndroid Build Coastguard Worker # for the -Werror version 62*0d6140beSAndroid Build Coastguard Worker compiler.get_supported_arguments( 63*0d6140beSAndroid Build Coastguard Worker '-Wshadow', 64*0d6140beSAndroid Build Coastguard Worker '-Wmissing-prototypes', 65*0d6140beSAndroid Build Coastguard Worker '-Wcast-align', 66*0d6140beSAndroid Build Coastguard Worker '-Werror=address', 67*0d6140beSAndroid Build Coastguard Worker '-Werror=strict-prototypes', 68*0d6140beSAndroid Build Coastguard Worker '-Werror=write-strings', 69*0d6140beSAndroid Build Coastguard Worker '-Werror=implicit-function-declaration', 70*0d6140beSAndroid Build Coastguard Worker '-Werror=pointer-arith', 71*0d6140beSAndroid Build Coastguard Worker '-Werror=declaration-after-statement', 72*0d6140beSAndroid Build Coastguard Worker '-Werror=return-type', 73*0d6140beSAndroid Build Coastguard Worker '-Werror=uninitialized', 74*0d6140beSAndroid Build Coastguard Worker '-Wimplicit-fallthrough', 75*0d6140beSAndroid Build Coastguard Worker '-Werror=strict-overflow', 76*0d6140beSAndroid Build Coastguard Worker '-Wstrict-overflow=2', 77*0d6140beSAndroid Build Coastguard Worker '-Wno-format-zero-length', 78*0d6140beSAndroid Build Coastguard Worker '-Wformat', 79*0d6140beSAndroid Build Coastguard Worker '-Werror=format-security', 80*0d6140beSAndroid Build Coastguard Worker '-Wno-gnu-zero-variadic-macro-arguments', 81*0d6140beSAndroid Build Coastguard Worker '-fno-common', 82*0d6140beSAndroid Build Coastguard Worker ), 83*0d6140beSAndroid Build Coastguard Worker language : ['c'], 84*0d6140beSAndroid Build Coastguard Worker native: is_native 85*0d6140beSAndroid Build Coastguard Worker ) 86*0d6140beSAndroid Build Coastguard Worker # We can't test the build type, so we can' add -D_FORTIFY_SOURCE=2 here 87*0d6140beSAndroid Build Coastguard Worker if machine.system() == 'darwin' 88*0d6140beSAndroid Build Coastguard Worker if compiler.has_argument('-Wno-deprecated-declarations') 89*0d6140beSAndroid Build Coastguard Worker add_project_arguments('-Wno-deprecated-declarations', language : ['c'], native: is_native) 90*0d6140beSAndroid Build Coastguard Worker endif 91*0d6140beSAndroid Build Coastguard Worker endif 92*0d6140beSAndroid Build Coastguard Worker elif compiler.get_id() == 'msvc' 93*0d6140beSAndroid Build Coastguard Worker add_project_arguments( 94*0d6140beSAndroid Build Coastguard Worker '/D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1', 95*0d6140beSAndroid Build Coastguard Worker '/D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1', 96*0d6140beSAndroid Build Coastguard Worker '/D_CRT_NONSTDC_NO_WARNINGS=1', 97*0d6140beSAndroid Build Coastguard Worker '/D_CRT_SECURE_NO_WARNINGS=1', 98*0d6140beSAndroid Build Coastguard Worker language : ['c'], 99*0d6140beSAndroid Build Coastguard Worker native: is_native 100*0d6140beSAndroid Build Coastguard Worker ) 101*0d6140beSAndroid Build Coastguard Worker endif 102*0d6140beSAndroid Build Coastguard Worker 103*0d6140beSAndroid Build Coastguard Worker # TODO: solaris extensions 104*0d6140beSAndroid Build Coastguard Worker 105*0d6140beSAndroid Build Coastguard Worker foreach h : ['assert.h', 'inttypes.h', 'io.h', 'malloc.h', 'memory.h', 106*0d6140beSAndroid Build Coastguard Worker 'setjmp.h', 'signal.h', 'stdarg.h', 'stddef.h', 'stdint.h', 107*0d6140beSAndroid Build Coastguard Worker 'stdio.h', 'stdlib.h', 'string.h', 'strings.h', 'sys/stat.h', 108*0d6140beSAndroid Build Coastguard Worker 'sys/types.h', 'time.h', 'unistd.h'] 109*0d6140beSAndroid Build Coastguard Worker if compiler.check_header(h) 110*0d6140beSAndroid Build Coastguard Worker config.set('HAVE_@0@'.format(h.underscorify().to_upper()), 1) 111*0d6140beSAndroid Build Coastguard Worker endif 112*0d6140beSAndroid Build Coastguard Worker endforeach 113*0d6140beSAndroid Build Coastguard Worker 114*0d6140beSAndroid Build Coastguard Worker if config.get('HAVE_TIME_H', 0) == 1 115*0d6140beSAndroid Build Coastguard Worker if compiler.has_member('struct timespec', 'tv_sec', prefix : '#include <time.h>') 116*0d6140beSAndroid Build Coastguard Worker config.set('HAVE_STRUCT_TIMESPEC', 1) 117*0d6140beSAndroid Build Coastguard Worker endif 118*0d6140beSAndroid Build Coastguard Worker endif 119*0d6140beSAndroid Build Coastguard Worker 120*0d6140beSAndroid Build Coastguard Worker foreach f : ['calloc', 'exit', 'fprintf', 'free', 'longjmp', 'siglongjmp', 121*0d6140beSAndroid Build Coastguard Worker 'malloc', 'memcpy', 'memset', 'printf', 'setjmp', 'signal', 122*0d6140beSAndroid Build Coastguard Worker 'strsignal', 'strcmp', 'clock_gettime'] 123*0d6140beSAndroid Build Coastguard Worker if compiler.has_function(f) 124*0d6140beSAndroid Build Coastguard Worker config.set('HAVE_@0@'.format(f.underscorify().to_upper()), 1) 125*0d6140beSAndroid Build Coastguard Worker endif 126*0d6140beSAndroid Build Coastguard Worker endforeach 127*0d6140beSAndroid Build Coastguard Worker 128*0d6140beSAndroid Build Coastguard Worker if machine.system() == 'windows' 129*0d6140beSAndroid Build Coastguard Worker foreach f : ['_vsnprintf_s', '_vsnprtinf', '_snprintf_s', '_snprintf'] 130*0d6140beSAndroid Build Coastguard Worker if compiler.has_function(f) 131*0d6140beSAndroid Build Coastguard Worker config.set('HAVE_@0@'.format(f.underscorify().to_upper()), 1) 132*0d6140beSAndroid Build Coastguard Worker endif 133*0d6140beSAndroid Build Coastguard Worker endforeach 134*0d6140beSAndroid Build Coastguard Worker foreach f : ['snprintf', 'vsnprintf'] 135*0d6140beSAndroid Build Coastguard Worker if compiler.has_header_symbol('stdio.h', f) 136*0d6140beSAndroid Build Coastguard Worker config.set('HAVE_@0@'.format(f.underscorify().to_upper()), 1) 137*0d6140beSAndroid Build Coastguard Worker endif 138*0d6140beSAndroid Build Coastguard Worker endforeach 139*0d6140beSAndroid Build Coastguard Workerelse 140*0d6140beSAndroid Build Coastguard Worker foreach f : ['snprintf', 'vsnprintf'] 141*0d6140beSAndroid Build Coastguard Worker if compiler.has_function(f) 142*0d6140beSAndroid Build Coastguard Worker config.set('HAVE_@0@'.format(f.underscorify().to_upper()), 1) 143*0d6140beSAndroid Build Coastguard Worker endif 144*0d6140beSAndroid Build Coastguard Worker endforeach 145*0d6140beSAndroid Build Coastguard Workerendif 146*0d6140beSAndroid Build Coastguard Worker 147*0d6140beSAndroid Build Coastguard Worker if machine.system() == 'windows' 148*0d6140beSAndroid Build Coastguard Worker if compiler.compiles(''' 149*0d6140beSAndroid Build Coastguard Worker __declspec(thread) int tls; 150*0d6140beSAndroid Build Coastguard Worker 151*0d6140beSAndroid Build Coastguard Worker int main(void) { 152*0d6140beSAndroid Build Coastguard Worker return 0; 153*0d6140beSAndroid Build Coastguard Worker }''', 154*0d6140beSAndroid Build Coastguard Worker name : 'Thread Local Storage') 155*0d6140beSAndroid Build Coastguard Worker config.set('HAVE_MSVC_THREAD_LOCAL_STORAGE', 1) 156*0d6140beSAndroid Build Coastguard Worker endif 157*0d6140beSAndroid Build Coastguard Worker else 158*0d6140beSAndroid Build Coastguard Worker if compiler.compiles(''' 159*0d6140beSAndroid Build Coastguard Worker __thread int tls; 160*0d6140beSAndroid Build Coastguard Worker 161*0d6140beSAndroid Build Coastguard Worker int main(void) { 162*0d6140beSAndroid Build Coastguard Worker return 0; 163*0d6140beSAndroid Build Coastguard Worker }''', 164*0d6140beSAndroid Build Coastguard Worker name : 'Thread Local Storage') 165*0d6140beSAndroid Build Coastguard Worker config.set('HAVE_GCC_THREAD_LOCAL_STORAGE', 1) 166*0d6140beSAndroid Build Coastguard Worker endif 167*0d6140beSAndroid Build Coastguard Worker endif 168*0d6140beSAndroid Build Coastguard Worker 169*0d6140beSAndroid Build Coastguard Worker if (config.get('HAVE_TIME_H', 0) == 1 and 170*0d6140beSAndroid Build Coastguard Worker config.get('HAVE_STRUCT_TIMESPEC', 0) == 1 and 171*0d6140beSAndroid Build Coastguard Worker config.get('HAVE_CLOCK_GETTIME', 0) == 1) 172*0d6140beSAndroid Build Coastguard Worker if compiler.has_header_symbol('time.h', 'CLOCK_REALTIME') 173*0d6140beSAndroid Build Coastguard Worker config.set('HAVE_CLOCK_REALTIME', 1) 174*0d6140beSAndroid Build Coastguard Worker endif 175*0d6140beSAndroid Build Coastguard Worker endif 176*0d6140beSAndroid Build Coastguard Worker 177*0d6140beSAndroid Build Coastguard Worker config.set('WORDS_SIZEOF_VOID_P', compiler.sizeof('void *')) 178*0d6140beSAndroid Build Coastguard Worker if machine.endian() == 'big' 179*0d6140beSAndroid Build Coastguard Worker config.set('WORDS_BIGENDIAN', 1) 180*0d6140beSAndroid Build Coastguard Worker endif 181*0d6140beSAndroid Build Coastguard Worker 182*0d6140beSAndroid Build Coastguard Worker # Execute subdir to create config.h for this pass 183*0d6140beSAndroid Build Coastguard Worker # This requires the use of the variable named "config" for configuration_data(), 184*0d6140beSAndroid Build Coastguard Worker # as this variable is used in each configuration header subdirectory. 185*0d6140beSAndroid Build Coastguard Worker subdir(entry.get('config_h_subdir')) 186*0d6140beSAndroid Build Coastguard Worker 187*0d6140beSAndroid Build Coastguard Workerendforeach 188*0d6140beSAndroid Build Coastguard Worker 189*0d6140beSAndroid Build Coastguard Worker########################### 190*0d6140beSAndroid Build Coastguard Worker# Subdirectory Processing # 191*0d6140beSAndroid Build Coastguard Worker########################### 192*0d6140beSAndroid Build Coastguard Worker 193*0d6140beSAndroid Build Coastguard Workersubdir('src') 194*0d6140beSAndroid Build Coastguard Worker 195*0d6140beSAndroid Build Coastguard Worker###################### 196*0d6140beSAndroid Build Coastguard Worker# Dependency Targets # 197*0d6140beSAndroid Build Coastguard Worker###################### 198*0d6140beSAndroid Build Coastguard Worker 199*0d6140beSAndroid Build Coastguard Worker# TODO: doc, include, tests, example 200*0d6140beSAndroid Build Coastguard Worker# Since we're using this as a wrap, and it's a unit test framework we're not 201*0d6140beSAndroid Build Coastguard Worker# going to install it. 202*0d6140beSAndroid Build Coastguard Worker 203*0d6140beSAndroid Build Coastguard Workercmocka_dep = declare_dependency( 204*0d6140beSAndroid Build Coastguard Worker link_with : libcmocka, 205*0d6140beSAndroid Build Coastguard Worker include_directories : inc_include, 206*0d6140beSAndroid Build Coastguard Worker version : meson.project_version(), 207*0d6140beSAndroid Build Coastguard Worker) 208*0d6140beSAndroid Build Coastguard Worker 209*0d6140beSAndroid Build Coastguard Workercmocka_native_dep = declare_dependency( 210*0d6140beSAndroid Build Coastguard Worker link_with : libcmocka_native, 211*0d6140beSAndroid Build Coastguard Worker include_directories : inc_include, 212*0d6140beSAndroid Build Coastguard Worker version : meson.project_version(), 213*0d6140beSAndroid Build Coastguard Worker) 214