껍질이 어떻게 작동하는지 안다고 생각하는 순간, 뭔가가 나타나 나를 당황하게 만듭니다. 다음 명령은 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"