구성을 위해 bash 변수를 통해 CFLAGS를 전달합니다.

구성을 위해 bash 변수를 통해 CFLAGS를 전달합니다.

껍질이 어떻게 작동하는지 안다고 생각하는 순간, 뭔가가 나타나 나를 당황하게 만듭니다. 다음 명령은 GNU bash 버전 3.2.25에서 실행됩니다.

./configure공통 구성 옵션 세트를 모두 공유하는 여러 스크립트가 있는데 그 중 하나는 CFLAGS.

이를 위해 두 가지 변수가 있습니다

CFLAGS="-fPIC -O3"
COMMON_CONFIGURE_OPTIONS="CFLAGS=\"$CFLAGS\" --enable-static --disable-shared --prefix=$PREFIX"

"./configure"에 전달되면 다음과 같이 수행됩니다.

"$FOO/configure" $COMMON_CONFIGURE_OPTIONS

내 인생에서 나는 그것을 올바르게 확장할 수 없는 것 같습니다. $CFLAGS값을 수동 으로 $COMMON_CONFIGURE_OPTIONS. 작은따옴표와 큰따옴표의 모든 조합을 시도했습니다. "CFLAGS=..." 매개변수 전체를 인용해 보기도 했습니다.

위에서 제공한 버전은 다음과 같은 결과를 생성합니다( set -x활성화된 경우)

../configure 'CFLAGS="-fPIC' '-O3"' --enable-static --disable-shared --prefix=../install
configure: error: unrecognized option: `-O3"'
Try `../configure --help' for more information

내가 기대하는 것, 내가 바라는 것은 configure이렇게 불리는 것

./configure CFLAGS="-fPIC -O3" --enable-static --disable-shared --prefix="$PREFIX"

내가 원하는 것을 어떻게 달성할 수 있으며, 향후 이 문제를 방지하는 방법에 대한 좋은 리소스/팁이 있습니까?

답변1

나는 이것이 효과가 있다고 생각합니다:

CFLAGS="-fPIC -O3" ./configure --enable-static --disable-shared --prefix="$PREFIX"

두 번째 옵션:

CFLAGS="-fPIC -O3"
COMMON_CONFIGURE_OPTIONS="--enable-static --disable-shared --prefix=$PREFIX"

CFLAGS="$CFLAGS" ./configure $COMMON_CONFIGURE_OPTIONS

답변2

CFLAGS="-fPIC -O3"
COMMON_CONFIGURE_OPTIONS="CFLAGS=\"$CFLAGS\" --enable-static --disable-shared --prefix=$PREFIX"
...
"$FOO/configure" $COMMON_CONFIGURE_OPTIONS

이것은 매우 잘못된 것입니다. 우선 쉘이 항목을 재귀적으로 계속 확장하지 않기 때문입니다( make매크로 와 같이 make"역참조"하지 않는다는 점만 제외하면).

a=A; b="B=\"$a\""; printf '<%s>\n' "$b"
<B="A">

둘째, 따옴표가 없는 변수는 (기본값은 공백) 문자로 분할되므로 IFS따옴표를 신경 쓰지 않습니다.

a="x \"y z\""; printf '<%s>\n' $a
<x>
<"y>
<z">

물론 당신은 사용할 수 있습니다

eval "$FOO/configure" "COMMON_CONFIGURE_OPTIONS"

(두 변수 주위에 큰따옴표가 있음에 유의하십시오.) 하지만 이는 또 다른 웜 캔을 열어줍니다.해서는 안 된다전체 구문 분석 및 확장 메커니즘과 그 모든 단점을 매우 확실하게 이해하지 않는 한 이와 같은 트릭을 사용하십시오. 그러나 공격적이지는 않지만 마스터한 것 같지는 않습니다.

해결책은 이런 $COMMON_CONFIGURE_OPTIONS넌센스를 잊어버리고 모든 옵션을 개별적으로 전달하는 것입니다.

./configure --enable-static --disable-shared --prefix="$PREFIX" CFLAGS="-fPIC -O3"

관련 정보