簡體   English   中英

如何從文件中正確讀取 BASH 參數?

[英]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_2MY_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.hsettings8.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM