forked from Seagate/opensea-transport
-
Notifications
You must be signed in to change notification settings - Fork 0
/
meson.build
executable file
·139 lines (126 loc) · 7.89 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
project('opensea-transport', 'c', license: 'MPL-2.0', version: '3.0.1', default_options : ['warning_level=2'])
c = meson.get_compiler('c')
warning_flags = [ ]
if c.get_id().contains('gcc') or c.get_id().contains('clang')
#TODO: Add -Wcast-align=strict and fix these issues to help ensure better portability
#NOTE: -Wsign-conversion can be useful while debugging, but there are numerous places this shows up
# and it is not useful, so only add it while debugging.
warning_flags = [
# '-Wcast-align=strict',
# '-Wsign-conversion',
'-Wshadow=compatible-local',
'-Wvla',
'-Wfloat-equal',
'-Wnull-dereference',
'-Wunused-const-variable',
'-Wduplicated-cond',
'-Wjump-misses-init',
'-Wstringop-overflow',
'-Wlogical-op',
'-Wshift-overflow=2',
'-Wdouble-promotion',
'-Wformat-security',
'-Wold-style-definition',
'-Wstrict-prototypes',
'-Wmissing-declarations',
'-Wmissing-prototypes',
'-Wchar-subscripts',
'-Wundef'
]
elif c.get_id().contains('msvc')
#See here for enabling/disabling msvc warnings:
#https://learn.microsoft.com/en-us/cpp/build/reference/compiler-option-warning-level?view=msvc-170
#warnings off by default: https://learn.microsoft.com/en-us/cpp/preprocessor/compiler-warnings-that-are-off-by-default?view=msvc-170
warning_flags = [
#Turn off the following warnings. If using /wall in Windows, many of these show all over the Windows API
#This is likely not an issue with meson, but matching VS project files for now
'/wd4214', # nonstandard extension used : bit field types other than int
'/wd4201', # nonstandard extension used : nameless struct/union
'/wd4668', # 'symbol' is not defined as a preprocessor macro, replacing with '0' for 'directives'. While like -Wundef, this creates too many warnings in system headers to use
'/wd4820', # 'bytes' bytes padding added after construct 'member_name'
'/wd4710', # 'function' : function not inlined
#'/wd4255', # 'function' : no function prototype given: converting '()' to '(void)' #NOTE: Only needed for /Wall, otherwise enabling can be good-TJE
'/wd5045', # Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified
'/wd4711', # function 'function' selected for inline expansion
'/wd4324', # 'struct_name' : structure was padded due to __declspec(align())
'/wd4221', # nonstandard extension used : 'identifier' : cannot be initialized using address of automatic variable
'/wd4204', # nonstandard extension used : non-constant aggregate initializer
'/wd4061', # enumerator 'identifier' in switch of enum 'enumeration' is not explicitly handled by a case label
'/wd5105', # macro expansion producing 'defined' has undefined behavior
'/wd4746', # volatile access of '<expression>' is subject to /volatile:[iso|ms] setting; consider using __iso_volatile_load/store intrinsic functions.
#Turn on the following warnings to make the output more useful or like GCC/clang
'/w14255', # 'function' : no function prototype given: converting '()' to '(void)'
'/w14062', # enumerator 'identifier' in switch of enum 'enumeration' is not handled
'/w14101', # 'identifier' : unreferenced local variable
'/w14189', # 'identifier' : local variable is initialized but not referenced
'/w15031', # #pragma warning(pop): likely mismatch, popping warning state pushed in different file
'/w15032', # detected #pragma warning(push) with no corresponding #pragma warning(pop)
'/w15262', # implicit fall-through occurs here; are you missing a break statement? Use [[fallthrough]] when a break statement is intentionally omitted between cases
#Treat the following as errors
'/we4837', # trigraph detected: '??character' replaced by 'character'
'/we4628', # digraphs not supported with -Ze. Character sequence 'digraph' not interpreted as alternate token for 'char'
'/we4289', # nonstandard extension used : 'var' : loop control variable declared in the for-loop is used outside the for-loop scope
]
#TODO: check compiler version to handle warnings that were off by default in earlier versions
#ex: C4431 (level 4) missing type specifier - int assumed. Note: C no longer supports default-int
# This was off by default in compilers before VS2012.
elif c.get_id().contains('xlc')
#This section is for IBM's xlc compiler and warning options it may need.
#NOTE: xlcclang should be handled above
#See following links:
#https://www.ibm.com/docs/en/xl-c-and-cpp-aix/16.1?topic=reference-supported-xl-compiler-options-by-different-invocations
#https://www.ibm.com/docs/en/xl-c-and-cpp-aix/16.1?topic=end-mapping-legacy-xl-compiler-options-gcc-options
#https://www.ibm.com/docs/en/xl-c-and-cpp-aix/16.1?topic=reference-individual-xl-compiler-option-descriptions
warning_flags = []
endif
add_project_arguments(c.get_supported_arguments(warning_flags), language : 'c')
if get_option('debug')
add_project_arguments('-D_DEBUG', language : 'c')
endif
global_cpp_args = []
#if GCC less than 5, need to set -std=gnu99 at minimum. gnu11 became the default in 5, 17 default in 7 or 8.
#TODO: May be able to move to c11/gnu11 instead, but will need to do a lot of testing first
#skipping sunos since this was a compatibility issue that was reported earlier. May be able to find a better way to handle this in the future.
if not (target_machine.system() == 'sunos') and c.get_id().contains('gcc')
if c.version().version_compare('<5.0')
if c.has_argument('-std=gnu99')
#Add this argument to the list since C99 is a minimum required C compiler standard
add_project_arguments('-std=gnu99', language: 'c',)
else
error('C99/GNU99 standard is required but was not able to be set!')
endif
endif
endif
src_files = ['src/asmedia_nvme_helper.c', 'src/ata_cmds.c', 'src/ata_helper.c', 'src/ata_legacy_cmds.c', 'src/cmds.c', 'src/common_public.c', 'src/csmi_helper.c', 'src/csmi_legacy_pt_cdb_helper.c', 'src/cypress_legacy_helper.c', 'src/intel_rst_helper.c', 'src/jmicron_nvme_helper.c', 'src/nec_legacy_helper.c', 'src/nvme_cmds.c', 'src/nvme_helper.c', 'src/of_nvme_helper.c', 'src/prolific_legacy_helper.c', 'src/psp_legacy_helper.c', 'src/raid_scan_helper.c', 'src/sata_helper_func.c', 'src/sat_helper.c', 'src/scsi_cmds.c', 'src/scsi_helper.c', 'src/sntl_helper.c', 'src/ti_legacy_helper.c', 'src/usb_hacks.c']
os_deps = []
if target_machine.system() == 'linux'
src_files += ['src/sg_helper.c']
elif target_machine.system() == 'freebsd'
src_files += ['src/cam_helper.c']
cam_dep = c.find_library('cam')
os_deps += [cam_dep]
elif target_machine.system() == 'sunos'
src_files += ['src/uscsi_helper.c']
elif target_machine.system() == 'aix'
src_files += ['src/aix_helper.c']
odm_dep = c.find_library('odm')
os_deps += [odm_dep]
cfg_dep = c.find_library('cfg')
os_deps += [cfg_dep]
elif target_machine.system() == 'windows'
src_files += ['src/win_helper.c']
if c.get_define('__MINGW32__') != ''
#BR note: -D_WIN32_WINNT=0x0601 fixes unknown Windows version in winioctl.h and errors such as unknown type name ‘PDEVICE_LB_PROVISIONING_DESCRIPTOR’
add_project_arguments('-D_WIN32_WINNT=0x0601', language : 'c')
cfgmgr32 = c.find_library('cfgmgr32')
os_deps += [cfgmgr32]
endif
add_project_arguments('-DENABLE_INTEL_RST', '-DENABLE_OFNVME', '-DENABLE_CSMI', language : 'c')
global_cpp_args += ['-D_CRT_NONSTDC_NO_DEPRECATE', '-D_CRT_SECURE_NO_WARNINGS']
global_cpp_args += ['-DSTATIC_OPENSEA_TRANSPORT', '-D_UNICODE', '-DUNICODE']
endif # TODO UEFI and vmware
opensea_common = subproject('opensea-common')
opensea_common_dep = opensea_common.get_variable('opensea_common_dep')
incdir = include_directories('include', 'include/vendor')
opensea_transport_lib = static_library('opensea-transport', src_files, c_args : global_cpp_args, dependencies : [opensea_common_dep, os_deps], include_directories : incdir)
opensea_transport_dep = declare_dependency(link_with : opensea_transport_lib, compile_args : global_cpp_args, dependencies : os_deps, include_directories : incdir)