Bash 스크립트에서 cmake에 옵션 전달

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'

어떤 도움이라도 대단히 감사하겠습니다.

답변1

옵션을 담기 위해 배열을 사용하는 것을 고려해 보세요. 이렇게 하면 cmake쉘이 공백으로 분할하고 파일 이름 글로빙을 수행하는 단일 문자열이 아닌 별도의 인수로 올바르게 제공할 수 있습니다 .

쉘은 sh일반적으로 배열을 지원하지 않으므로 #!다음을 호출하도록 -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단일 문자열로 줄이지 않고 셸을 사용하여 올바르게 분할하고 글로빙하지 않고도 여러 인수를 전달할 수 있습니다. 또한 이를 통해 공백이 포함된 문자열로 구성될 수 있는 인수를 올바르게 전달할 수 있습니다.

관련된:

답변2

여기서 문제는 의 이스케이프된 따옴표로 인해 ASAN_C_FLAGSCMake가 해당 변수를 따옴표 붙은 값으로 처리하므로 CMAKE_C_FLAGS전체 변수를 단일 인수로 컴파일러에 전달한다는 것입니다. 이러한 이스케이프된 따옴표를 제거한 후 CMake는 전달된 인수를 컴파일러에 전달하기 전에 공백으로 적절하게 분할해야 합니다.

관련 정보