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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
|
--!A cross-platform build utility based on Lua
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
-- Copyright (C) 2015-present, Xmake Open Source Community.
--
-- @author ruki
-- @file policy.lua
--
-- define module: policy
local policy = policy or {}
-- load modules
local os = require("base/os")
local io = require("base/io")
local path = require("base/path")
local table = require("base/table")
local utils = require("base/utils")
local string = require("base/string")
-- get all defined policies
--
-- @return the policies table {name = {description, ...}, ...}
--
function policy.policies()
local policies = policy._POLICIES
if not policies then
policies = {
-- We will check and ignore all unsupported flags by default, but we can also pass `{force = true}` to force to set flags, e.g. add_ldflags("-static", {force = true})
["check.auto_ignore_flags"] = {description = "Enable check and ignore unsupported flags automatically.", default = true, type = "boolean"},
-- We will map gcc flags to the current compiler and linker by default.
["check.auto_map_flags"] = {description = "Enable map gcc flags to the current compiler and linker automatically.", default = true, type = "boolean"},
-- We will check the compatibility of target and package licenses
["check.target_package_licenses"] = {description = "Enable check the compatibility of target and package licenses.", default = true, type = "boolean"},
-- Generate intermediate build directory
["build.intermediate_directory"] = {description = "Generate intermediate build directory.", default = true, type = "boolean"},
-- Provide a way to block all targets build that depends on self
["build.fence"] = {description = "Block all targets build that depends on self.", default = false, type = "boolean"},
-- We can compile the source files for each target in parallel
["build.across_targets_in_parallel"] = {description = "Enable compile the source files for each target in parallel.", default = true, type = "boolean"},
-- Merge archive intead of linking for all dependent targets
["build.merge_archive"] = {description = "Enable merge archive intead of linking for all dependent targets.", default = false, type = "boolean"},
-- C/C++ build cache
["build.ccache"] = {description = "Enable C/C++ build cache.", type = "boolean"},
-- Use global storage if build.ccache is enabled
["build.ccache.global_storage"] = {description = "Use global storge if build.ccache is enabled.", type = "boolean"},
-- Always update configfiles when building
["build.always_update_configfiles"] = {description = "Always update configfiles when building.", type = "boolean"},
-- Enable build warning output, it's enabled by default.
["build.warning"] = {description = "Enable build warning output.", default = true, type = "boolean"},
-- Enable LTO linker-time optimization for c/c++ building.
["build.optimization.lto"] = {description = "Enable LTO linker-time optimization for c/c++ building.", type = "boolean"},
-- Enable address sanitizer for c/c++ building.
["build.sanitizer.address"] = {description = "Enable address sanitizer for c/c++ building.", type = "boolean"},
-- Enable thread sanitizer for c/c++ building.
["build.sanitizer.thread"] = {description = "Enable thread sanitizer for c/c++ building.", type = "boolean"},
-- Enable memort sanitizer for c/c++ building.
["build.sanitizer.memory"] = {description = "Enable memory sanitizer for c/c++ building.", type = "boolean"},
-- Enable leak sanitizer for c/c++ building.
["build.sanitizer.leak"] = {description = "Enable leak sanitizer for c/c++ building.", type = "boolean"},
-- Enable undefined sanitizer for c/c++ building.
["build.sanitizer.undefined"] = {description = "Enable undefined sanitizer for c/c++ building.", type = "boolean"},
-- Enable build rpath
["build.rpath"] = {description = "Enable build rpath.", default = true, type = "boolean"},
-- Strip symbols by default in release mode (mode.release)
["build.release.strip"] = {description = "Strip symbols by default in release mode.", default = true, type = "boolean"},
-- Enable C++ modules for C++ building, even if no .mpp is involved in the compilation
["build.c++.modules"] = {description = "Enable C++ modules for C++ building.", type = "boolean"},
-- Enable non cascading changes (experimental)
["build.c++.modules.non_cascading_changes"] = {description = "Enable non cascading changes when supported (experimental).", default = false, type = "boolean"},
-- Hide C++ required files to reduce noise (may reduce build performance)
["build.c++.modules.hide_dependencies"] = {description = "Hide dependencies from the commandline when build C++ modules.", default = false, type = "boolean"},
-- Enable two phase compilation for C++ modules if supported by the compiler
["build.c++.modules.two_phases"] = {description = "Enable two phase compilation if supported.", default = true, type = "boolean"},
-- Enable std module
["build.c++.modules.std"] = {description = "Enable std modules.", default = true, type = "boolean"},
-- Enable unreferenced and non-public named module culling
["build.c++.modules.culling"] = {description = "Enable unrefereced and non-public named module culling.", default = true, type = "boolean"},
-- Always reuse compiled module bmi file
["build.c++.modules.reuse"] = {description = "Reuse compiled module artifacts if possible.", default = true, type = "boolean"},
["build.c++.modules.tryreuse"] = {description = "Try to reuse compiled module if possible. (deprecated)", default = false, type = "boolean"},
-- Disabled flag check when reusing modules
["build.c++.modules.reuse.nocheck"] = {description = "Disable flag compatibility check when reusing modules.", default = false, type = "boolean"},
-- If target will not reuse modules from target deps if defines are different
["build.c++.modules.reuse.strict"] = {description = "Enable strict defines comparison when trying to reuse module.", default = false, type = "boolean"},
["build.c++.modules.tryreuse.discriminate_on_defines"] = {description = "Enable defines module reuse discrimination.", default = false, type = "boolean"},
-- Force C++ modules fallback dependency scanner for all compilers
["build.c++.modules.fallbackscanner"] = {description = "Force fallback module dependency scanner.", default = false, type = "boolean"},
-- Force C++ modules fallback dependency scanner for clang
["build.c++.modules.clang.fallbackscanner"] = {description = "Force clang fallback module dependency scanner.", default = false, type = "boolean"},
["build.c++.clang.fallbackscanner"] = {description = "Force clang fallback module dependency scanner. (deprecated)", default = false, type = "boolean"},
-- Force C++ modules fallback dependency scanner for msvc
["build.c++.modules.msvc.fallbackscanner"] = {description = "Force msvc fallback module dependency scanner.", default = false, type = "boolean"},
["build.c++.msvc.fallbackscanner"] = {description = "Force msvc fallback module dependency scanner. (deprecated)", default = false, type = "boolean"},
-- Force C++ modules fallback dependency scanner for gcc
["build.c++.modules.gcc.fallbackscanner"] = {description = "Force gcc fallback module dependency scanner.", default = false, type = "boolean"},
["build.c++.gcc.fallbackscanner"] = {description = "Force gcc fallback module dependency scanner. (deprecated)", default = false, type = "boolean"},
-- Force to enable new cxx11 abi in C++ modules for gcc
-- If in the future, gcc can support it well, we'll turn it on by default
-- https://github.com/xmake-io/xmake/issues/3855
["build.c++.modules.gcc.cxx11abi"] = {description = "Force to enable new cxx11 abi in C++ modules for gcc.", type = "boolean"},
["build.c++.gcc.modules.cxx11abi"] = {description = "Force to enable new cxx11 abi in C++ modules for gcc. (deprecated)", type = "boolean"},
-- Set the default vs runtime, e.g. MT, MD
["build.c++.msvc.runtime"] = {description = "Set the default vs runtime.", type = "string", values = {"MT", "MD"}},
-- Enable C++ Dynamic Debugging for MSVC (requires MSVC toolset 14.44+, x64 only, incompatible with LTCG/PGO/OPT-ICF).
["build.c++.dynamic_debugging"] = {description = "Enable C++ Dynamic Debugging for MSVC (requires MSVC toolset 14.44+, x64 only, incompatible with LTCG/PGO/OPT-ICF).", type = "boolean"},
-- Enable cuda device link
["build.cuda.devlink"] = {description = "Enable Cuda devlink.", type = "boolean"},
-- Enable linker output, e.g. show -Wl,--print-memory-usage output for gcc/g++
-- @see https://github.com/xmake-io/xmake/discussions/6772
["build.linker.output"] = {description = "Enable linker output.", type = "boolean"},
-- Enable build jobgraph
["build.jobgraph"] = {description = "Enable build jobgraph.", default = true, type = "boolean"},
-- Enable build on only remote machines
["build.distcc.remote_only"] = {description = "Enable build on only remote machines.", default = false, type = "boolean"},
-- Set the build progress output style, e.g. scroll (default), singlerow, multirow
["build.progress_style"] = {description = "Set the build progress output style.", type = "string", values = {"scroll", "singlerow", "multirow"}},
-- Show target name in build progress output
["build.progress_show_target"] = {description = "Show target name in build progress output.", default = true, type = "boolean"},
-- Enable windows UAC and set level, e.g. invoker, admin, highest
["windows.manifest.uac"] = {description = "Enable windows manifest UAC.", type = "string"},
-- Enable ui access for windows UAC
["windows.manifest.uac.ui"] = {description = "Enable ui access for windows UAC.", type = "boolean"},
-- Automatically build before running
["run.autobuild"] = {description = "Automatically build before running.", type = "boolean"},
-- Enable/Disable Windows Error Reporting Dialogs
["run.windows_error_dialog"] = {description = "Enable Windows Error Reporting Dialogs during execution.", default = false, type = "boolean"},
-- Enable install rpath
["install.rpath"] = {description = "Enable install rpath.", default = true, type = "boolean"},
-- Strip package libraries for installation
["install.strip_packagelibs"] = {description = "Strip package libraries for installation.", default = true, type = "boolean"},
-- Preprocessor configuration for ccache/distcc, we can disable linemarkers to speed up preprocess
["preprocessor.linemarkers"] = {description = "Enable linemarkers for preprocessor.", default = true, type = "boolean"},
-- Preprocessor configuration for ccache/distcc, we can disable it to avoid cache object file with __DATE__, __TIME__
["preprocessor.gcc.directives_only"] = {description = "Enable -fdirectives-only for gcc preprocessor.", type = "boolean"},
-- We need to enable longpaths when building target or installing package
["platform.longpaths"] = {description = "Enable long paths when building target or installing package on windows.", default = false, type = "boolean"},
-- Lock required packages
["package.requires_lock"] = {description = "Enable xmake-requires.lock to lock required packages.", default = false, type = "boolean"},
-- Enable the precompiled packages, it will be enabled by default
["package.precompiled"] = {description = "Enable precompiled packages.", default = true, type = "boolean"},
-- Only fetch packages on system
["package.fetch_only"] = {description = "Only fetch packages on system.", type = "boolean"},
-- Only install packages from remote
["package.install_only"] = {description = "Only install packages from remote.", type = "boolean"},
-- Always install packages every time
["package.install_always"] = {description = "Always install packages every time.", type = "boolean"},
-- Install packages in the local project folder
["package.install_locally"] = {description = "Install packages in the local project folder.", default = false, type = "boolean"},
-- Keep package source code after installing (disable source dir cleanup)
["package.keep_source"] = {description = "Keep package source code after installing.", default = false, type = "boolean"},
-- Set custom headers when downloading package
["package.download.http_headers"] = {description = "Set the custom http headers when downloading package.", type = "table"},
-- Use includes as external header files? e.g. -isystem ..
["package.include_external_headers"] = {description = "Use includes as external headers.", type = "boolean"},
-- Inherit the configs from the external command arguments, e.g. toolchains, `xmake f --toolchain=`
["package.inherit_external_configs"] = {description = "Inherit the configs from the external command arguments.", default = true, type = "boolean"},
-- Set strict compatibility for package and it's all child packages. we can just set it in package().
-- if true, then any updates to this package, such as buildhash changes due to version changes,
-- will force all installed child packages to be recompiled and installed, @see https://github.com/xmake-io/xmake/issues/2719
["package.strict_compatibility"] = {description = "Set strict compatibility for package and it's all child packages.", type = "boolean"},
-- Set strict compatibility for package and it's all library dependencies. we can set it in package() and user project configuration.
-- if true, then any updates to library dependencies, such as buildhash changes due to version changes,
-- will force the installed packages to be recompiled and installed. @see https://github.com/xmake-io/xmake/issues/2719
["package.librarydeps.strict_compatibility"] = {description = "Set strict compatibility for package and it's all library dependencies.", type = "boolean"},
-- Resolve package dependencies conflict automatically
-- @see https://github.com/xmake-io/xmake/issues/5745
["package.resolve_depconflict"] = {description = "Automatically resolve package dependencies conflict.", default = true, type = "boolean"},
-- Synchronize add_requires configuration in toplevel to all package dependencies for this package
-- @see https://github.com/xmake-io/xmake/issues/5745
["package.sync_requires_to_deps"] = {description = "Synchronize requires configuration to all package dependencies.", default = false, type = "boolean"},
-- Automatically passes dependency configuration for inner xmake package
-- @see https://github.com/xmake-io/xmake/issues/3952
["package.xmake.pass_depconfs"] = {description = "Automatically passes dependency configuration for inner xmake package", default = true, type = "boolean"},
-- It will force cmake package use ninja for build
["package.cmake_generator.ninja"] = {description = "Set cmake package use ninja for build", type = "boolean"},
-- Enable msbuild MultiToolTask
["package.msbuild.multi_tool_task"] = {description = "Enable msbuild MultiToolTask.", default = false, type = "boolean"},
-- Merge all static libraries after installing package
-- @see https://github.com/xmake-io/xmake/issues/5894
["package.merge_staticlibs"] = {description = "Merge all static libraries after installing package", type = "boolean"},
-- C/C++ build cache
["package.build.ccache"] = {description = "Enable C/C++ package build cache.", default = false, type = "boolean"},
-- Stop to test on the first failure
["test.stop_on_first_failure"] = {description = "Stop to test on the first failure", default = false, type = "boolean"},
-- Return zero as exit code on failure
["test.return_zero_on_failure"] = {description = "Return zero as the exit code on failure", default = false, type = "boolean"},
-- Show diagnosis info for checking build dependencies
["diagnosis.check_build_deps"] = {description = "Show diagnosis info for checking build dependencies", default = false, type = "boolean"},
-- Set the network mode, e.g. public/private
-- private: it will disable fetch remote package repositories
["network.mode"] = {description = "Set the network mode", type = "string"},
-- Set the compatibility version, e.g. 2.0, 3.0
["compatibility.version"] = {description = "Set the compatibility version", type = "string", default = "3.0", values = {"2.0", "3.0"}},
-- Enable compile_commands
["generator.compile_commands"] = {description = "Enable compile_commands.", default = true, type = "boolean"},
-- Generate the solution file in root output directory
-- @see https://github.com/xmake-io/xmake/issues/6519
["generator.vsxmake.root_sln"] = {description = "Generate the solution file in root output directory", default = false, type = "boolean"}
}
policy._POLICIES = policies
end
return policies
end
-- set policy default value
--
-- @param name the policy name, e.g. "build.ccache"
-- @param value the default value
--
function policy.set_default(name, value)
local defined_policy = policy.policies()[name]
if defined_policy then
defined_policy.default = value
else
os.raise("unknown policy(%s)!", name)
end
end
-- check and validate policy value
--
-- @param name the policy name
-- @param value the value to check
-- @return the validated value
--
function policy.check(name, value)
local defined_policy = policy.policies()[name]
if defined_policy then
if value == nil then
value = defined_policy.default
else
local valtype = type(value)
if valtype ~= defined_policy.type then
utils.warning("policy(%s): invalid value type(%s), it shound be '%s'!",
name, valtype, defined_policy.type)
end
if defined_policy.values then
local found = false
for _, policy_value in ipairs(defined_policy.values) do
if tostring(value) == tostring(policy_value) then
found = true
break
end
end
if not found then
local values = {}
for _, policy_value in ipairs(defined_policy.values) do
table.insert(values, tostring(policy_value))
end
utils.warning("policy(%s): invalid value(%s), please set value from {%s}.",
name, value, table.concat(values, ", "))
end
end
end
return value
else
os.raise("unknown policy(%s)!", name)
end
end
-- return module: policy
return policy
|