안녕하세요, 저는 다음 명령을 실행하는 빌드 스크립트를 만들려고 합니다.
cd libiconv
../../src/libiconv/configure --prefix=/home/ruben/mingw64/build/gcc-libs \
--host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 \
CFLAGS="-mtune=core2 -flto -fomit-frame-pointer -momit-leaf-frame-pointer" LFLAGS="-flto -fwhopr=2"
make -j3 -s
make -s install
cd ..
다음과 같습니다.
#!/bin/sh
HOST=x86_64-w64-mingw32
TARGET=x86_64-w64-mingw32
BUILD=x86_64-w64_mingw32
# options
BUILD_CORES=2 #used as argument for "make -j#"
# directories: SRC_DIR contains full source package.
GCC_LIBS_DIR=$BUILD_DIR/gcc-libs
# optimized for my system.
BUILD_CFLAGS="\"-mtune=core2 -flto -fomit-frame-pointer -momit-leaf-frame-pointer\""
BUILD_LFLAGS="\"-flto -fwhopr="${BUILD_CORES}"\""
CONFIG_OPTS="--prefix="${PREFIX}" --host="${HOST}" --build="${BUILD}" CFLAGS="${BUILD_CFLAGS}" LFLAGS="${BUILD_LFLAGS}
makeopts="-s -j"${BUILD_CORES}
# libiconv
cd libiconv
echo "configuring libiconv: "${CONFIG_OPTS}
../../src/libiconv/configure "${CONFIG_OPTS}" > configure.log || exit 1
echo "building libiconv"
make $MAKEOPTS > build.log || exit 1
echo "installing libiconv"
make -s install > install.log || exit 1
cd ..
문제는 echo 명령이 내가 원하는 정확한 구성 명령을 표시하지만 구성을 실행할 때 올바르지 않다는 것입니다. 이후에 CFLAGS=-mtunecore2
구성이 -flto(인용!!)를 인수로 사용하려고 하면 치명적인 오류가 발생했습니다.
내가 뭘 잘못했나요?
감사해요!
추신: 저는 대신 MSYS를 실행하고 있습니다.진짜*닉스...
답변1
여기에는 순전히 Unixoid-shell 문제가 몇 가지 있으며 MSYS가 추가 문제를 추가하지 않기를 바랍니다.
여러 수준의 참조를 만드는 것은 까다로울 수 있습니다. 나는 보통 가능하다면 그것들을 피하는 것을 선호합니다.
아래 수정에서는 $@
매개변수를 사용하여 공백이 포함된 매개변수를 저장하고 검색합니다. 공백이 포함된 매개변수 목록이 여러 개 필요하고 쉘에 배열 매개변수가 있는 경우 해당 매개변수를 사용할 수 있습니다( 하나만 있으므로 $@
).
# assume BUILD_CORES is simple enough that it will not need extra quoting later...
BUILD_CFLAGS='-mtune=core2 -flto -fomit-frame-pointer -momit-leaf-frame-pointer'
BUILD_LFLAGS="-flto -fwhopr=$BUILD_CORES"
set -- --prefix="$PREFIX" --host="$HOST" --build="$BUILD" CFLAGS="$BUILD_CFLAGS" LFLAGS="$BUILD_LFLAGS"
makeopts="-s -j$BUILD_CORES"
# libiconv
cd libiconv
echo "configuring libiconv: $@"
../../src/libiconv/configure "$@" > configure.log || exit 1
명시된 요구 사항에 따라 이 보호 수준만 사용할 수 있지만 여러 수준의 인용이 필요한 경우(예: BUILD_CORES
공백을 포함하는 경우 여러 수준의 인용을 처리하게 됩니다. makeopts
/ 한 수준의 인용 BUILD_LFLAGS
및 두 수준의 인용 에서) 인용문에서 CONFIG_OPTS
). 이 경우에는 printf
with %q
및 를 사용하는 것이 좋습니다 eval
. 형식 %q
지정자는 대부분(전부는 아님) 셸에서 사용할 수 있습니다(변화 많은,세게 때리다,다루기 힘든). 나중에 올바르게 평가할 수 있도록 해당 값을 인용합니다.
BUILD_CFLAGS='-mtune=core2 -flto -fomit-frame-pointer -momit-leaf-frame-pointer'
BUILD_LFLAGS=$(printf '%s-flto -fwhopr=%q' '' "$BUILD_CORES")
CONFIG_OPTS=$(printf \
'%s--prefix=%q --host=%q --build=%q CFLAGS=%q LFLAGS=%q' '' \
"$PREFIX" "$HOST" "$BUILD" "$BUILD_CFLAGS" "$BUILD_LFLAGS")
makeopts=$(printf '%s-s -j%q' '' "$BUILD_CORES")
# libiconv
cd libiconv
echo "configuring libiconv:" "$CONFIG_OPTS"
eval ../../src/libiconv/configure "$CONFIG_OPTS"
echo "building libiconv"
eval make "$MAKEOPTS" > build.log || exit 1
LFLAGS
이 특별한 경우에는 구성에서 얻은 모든 내용이 셸에서 생성된 참조 값을 "읽는" 방법을 알고 있다는 점도 알아야 합니다 . 스크립트가 %q
생성 시스템의 기본 쉘(예: /bin/sh
)이 구문을 이해하지 못하는 쉘 언어로 작성된 경우(예:변화 많은때로는 구문이 생성되지만 $'blah'
일부 쉘은 이를 구문 분석하는 방법을 모릅니다.
답변2
스크립트에 PREFIX를 정의하지 않았으므로 제대로 작동하려면 다른 곳에 정의해야 하지만 제 생각에는 (경고: 나는 이것을 테스트하지 않았습니다.):
BUILD_CFLAGS="\"-mtune=core2 -flto -fomit-frame-pointer -momit-leaf-frame-pointer\""
BUILD_LFLAGS="\"-flto -fwhopr=${BUILD_CORES}\""
CONFIG_OPTS="--prefix=${PREFIX} --host=${HOST} --build=${BUILD} CFLAGS=${BUILD_CFLAGS}
LFLAGS=${BUILD_LFLAGS}"
MAKEOPTS="-s -j${BUILD_CORES}"
큰따옴표를 사용하면 변수가 문자열 내에서 확장됩니다(종종 변수 보간이라고 함). 또한 원본 스크립트에 인용문이 일치하지 않아 문제가 발생할 수 있다고 생각합니다.