![Bash 스크립트에서 cmake에 옵션 전달](https://linux55.com/image/13159/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20cmake%EC%97%90%20%EC%98%B5%EC%85%98%20%EC%A0%84%EB%8B%AC.png)
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_FLAGS
CMake가 해당 변수를 따옴표 붙은 값으로 처리하므로 CMAKE_C_FLAGS
전체 변수를 단일 인수로 컴파일러에 전달한다는 것입니다. 이러한 이스케이프된 따옴표를 제거한 후 CMake는 전달된 인수를 컴파일러에 전달하기 전에 공백으로 적절하게 분할해야 합니다.