Bash
在 bash 腳本中將選項傳遞給 cmake
我正在嘗試編寫一個腳本,該腳本將使用 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 將在空格上拆分並執行文件名萬用字元的單個字元串。
sh
shell 通常不支持數組,所以我將-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。這也允許我們正確傳遞參數,其中可能包含帶有空格的字元串。有關的: