v.cflag: support `#flag $first_existing("/opt/homebrew/lib/libgc.a", "/usr/local/lib/libgc.a")`
parent
bf6a2f80ef
commit
d54becf52e
|
@ -4,8 +4,8 @@ module builtin
|
||||||
|
|
||||||
$if static_boehm ? {
|
$if static_boehm ? {
|
||||||
$if macos {
|
$if macos {
|
||||||
#flag -I/opt/homebrew/include
|
#flag -I$first_existing("/opt/homebrew/include", "/usr/local/include")
|
||||||
#flag /opt/homebrew/lib/libgc.a
|
#flag $first_existing("/opt/homebrew/lib/libgc.a", "/usr/local/lib/libgc.a")
|
||||||
} $else $if linux {
|
} $else $if linux {
|
||||||
#flag -l:libgc.a
|
#flag -l:libgc.a
|
||||||
} $else {
|
} $else {
|
||||||
|
|
|
@ -20,11 +20,43 @@ pub fn (c &CFlag) str() string {
|
||||||
return 'CFlag{ name: "$c.name" value: "$c.value" mod: "$c.mod" os: "$c.os" cached: "$c.cached" }'
|
return 'CFlag{ name: "$c.name" value: "$c.value" mod: "$c.mod" os: "$c.os" cached: "$c.cached" }'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const fexisting_literal = r'$first_existing'
|
||||||
|
|
||||||
|
// expand the flag value
|
||||||
|
pub fn (cf &CFlag) eval() string {
|
||||||
|
mut value := ''
|
||||||
|
cflag_eval_outer_loop: for i := 0; i < cf.value.len; i++ {
|
||||||
|
x := cf.value[i]
|
||||||
|
if x == `$` {
|
||||||
|
remainder := cf.value[i..]
|
||||||
|
if remainder.starts_with(cflag.fexisting_literal) {
|
||||||
|
sparams := remainder[cflag.fexisting_literal.len + 1..].all_before(')')
|
||||||
|
i += sparams.len + cflag.fexisting_literal.len + 1
|
||||||
|
svalues := sparams.replace(',', '\n').split_into_lines().map(it.trim(' \'"'))
|
||||||
|
mut found_spath := ''
|
||||||
|
for spath in svalues {
|
||||||
|
if os.exists(spath) {
|
||||||
|
found_spath = spath
|
||||||
|
value += spath
|
||||||
|
continue cflag_eval_outer_loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
panic('>> error: none of the paths $svalues exist')
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
value += x.ascii_str()
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
// format flag
|
// format flag
|
||||||
pub fn (cf &CFlag) format() string {
|
pub fn (cf &CFlag) format() string {
|
||||||
mut value := cf.value
|
mut value := ''
|
||||||
if cf.cached != '' {
|
if cf.cached != '' {
|
||||||
value = cf.cached
|
value = cf.cached
|
||||||
|
} else {
|
||||||
|
value = cf.eval()
|
||||||
}
|
}
|
||||||
if cf.name in ['-l', '-Wa', '-Wl', '-Wp'] && value.len > 0 {
|
if cf.name in ['-l', '-Wa', '-Wl', '-Wp'] && value.len > 0 {
|
||||||
return '$cf.name$value'.trim_space()
|
return '$cf.name$value'.trim_space()
|
||||||
|
|
Loading…
Reference in New Issue