[英]How do I read BASH parameters correctly from a file?
我的 CI 中有這個配置文件,我在其中指定了一個 header 文件和一些 CMAKE 標志在一行上。
配置文件如下所示( filelist
):
./settings6.h -DMY_COMPILE_FLAGS="-m32 -fstrict-aliasing"
./settings7.h -DMY_FEATURE_1=ON
./settings8.h -DMY_FLAG=ON -DMY_FEATURE_2=ON -DMY_INCLUDE_DIR=/usr/include/
現在,我使用 bash 腳本來處理這個配置文件:
#!/bin/bash
SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
while read i; do
HEADERFILE=$(echo $i | cut -d ' ' -f 1)
CMAKEFLAGS=$(echo $i | cut -s -d ' ' -f 2-)
if [[ "$HEADERFILE" == "" ]]; then
continue
fi
CFLAGS="-Werror" cmake "my_build_dir" "$CMAKEFLAGS" -G "Ninja" -DMY_EXTRA_INCLUDE="$SCRIPTDIR/$HEADERFILE" -B"build_env_dir" > /dev/null
ninja -C "build_env_dir"
done <<ENDOFINPUT
$(grep -v '^#' $SCRIPTDIR/filelist)
ENDOFINPUT
當我有上面的 bash 腳本時, settings6.h
的行得到正確處理,即MY_COMPILE_FLAGS
設置為-m32 -fstrict-aliasing
。
但是, settings8.h
失敗,因為 CMAKE 將MY_FLAG
的值視為ON -DMY_FEATURE_2=ON -DMY_INCLUDE_DIR=/usr/include/
,因此未正確處理MY_FEATURE_2
和MY_INCLUDE_DIR
。
在谷歌搜索了一下之后,我想,嗯,肯定是一個引用問題,可能我必須像這樣刪除$CMAKEFLAGS
周圍的引號:
CFLAGS="-Werror" cmake "my_build_dir" $CMAKEFLAGS -G "Ninja" -DMY_EXTRA_INCLUDE="$SCRIPTDIR/$HEADERFILE" -B"build_env_dir" > /dev/null
事實上,這讓settings8.h
按預期工作(所有三個選項都已處理),但現在,由於 CMAKE 抱怨, settings6.h
突然失敗:
CMake Error: The source directory "/src/-fstrict-aliasing"" does not exist
有人可以指導我如何從我的filelist
中正確讀取設置,以便settings6.h
和settings8.h
都成功嗎?
這是一個Makefile
將其重構為一系列配方。
Cases := $(patsubst %.h,%,$(wildcard ./settings*.h))
all_done := $(patsubst %,.%.done,$(Cases))
.PHONY: all
all: $(all_done)
cases.mk: filelist.txt
sed 's%^\./%case_%;s% % := %' $< >$@
include cases.mk
.%_done: ./%.h
CFLAGS="-Werror" cmake "my_build_dir" $(case_$*) -G "Ninja" \
-DMY_EXTRA_INCLUDE="$<" -B"build_env_dir" > /dev/null
ninja -C "build_env_dir"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.