Bash

在 bash 腳本中將選項傳遞給 cmake

  • January 8, 2020

我正在嘗試編寫一個腳本,該腳本將使用 bash 腳本為不同的消毒劑建構多個 cppUtes lib.a 文件。

當試圖將編譯器標誌作為變數傳遞給 cmake 時,我無法正確格式化它們。請參閱下面的簡短範例。

#!/bin/sh
set -euo pipefail
COMMON_OPTS='-fno-common -g -fno-omit-frame-pointer'
ASAN_OPT='-fsanitize=address'
ASAN_C_FLAGS="-DCMAKE_C_FLAGS=\"$ASAN_OPT $COMMON_OPTS\""

echo "cmake ../ $ASAN_C_FLAGS"
cmake ../ $ASAN_C_FLAGS
make

echo 的輸出是我所期望的,並且在未在 bash 腳本中執行時用於設置標誌的方法是:

cmake ../ -DCMAKE_C_FLAGS="-fsanitize=address -fno-common -g -fno-omit-frame-pointer"

但是,當我執行腳本時,cmake 沒有正確解釋標誌。它們不會出現在配置期間顯示的 cmake 標誌中:

CppUTest CFLAGS: -include "/home/ubuntu/cpputest/include/CppUTest/MemoryLeakDetectorMallocMacros.h" -Wall -Wextra -pedantic -Wshadow -Wswitch-default -Wswitch-enum -Wconversion -Wsign-conversion -Wno-padded -Wno-long-long -Wstrict-prototypes

最後,我從 make 中得到以下編譯錯誤:

c++: error: unrecognized argument to '-fsanitize=' option: 'address -g -fno-omit-frame-pointer'

任何幫助將不勝感激。

請考慮使用數組來保存選項。這樣,您仍然可以正確地將它們cmake作為單獨的參數提供,而不是作為 shell 將在空格上拆分並執行文件名萬用字元的單個字元串。

shshell 通常不支持數組,所以我將-line#!改為呼叫bash

#!/bin/bash
set -euo pipefail

common_opts=( -fno-common -g -fno-omit-frame-pointer )
asan_opt='-fsanitize=address'
asan_c_cflags=( -DCMAKE_C_FLAGS="$asan_opt" "${common_opts[@]}" )

echo "cmake ${asan_c_cflags[@]} ../"
cmake "${asan_c_cflags[@]}" ../
make

在這裡,數組允許我們將多個帶引號的參數傳遞給,cmake而不會將這些參數降級為單個字元串,並依賴 shell 來正確拆分 + glob。這也允許我們正確傳遞參數,其中可能包含帶有空格的字元串。

有關的:

引用自:https://unix.stackexchange.com/questions/560920