developer tip

GNU autotools : 디버그 / 릴리스 타겟?

copycodes 2020. 12. 10. 20:40
반응형

GNU autotools : 디버그 / 릴리스 타겟?


나는 이것을 한동안 찾고 있었다 : 현재 Eclipse 기반 방법 (메이크 파일 사용)에서 오는 중형 프로그램을 autotools로 변환하고 있습니다.

나는 항상 모든 디버그 기호와 최적화가없는 "디버그"빌드와 디버그 기호와 최상의 최적화없이 "릴리스"빌드를 사용하는 데 익숙합니다.

이제 autotools를 사용하여 어떤 방식 으로든 이것을 복제하려고 시도하고 있으므로 (아마도) 다음과 같이 할 수 있습니다.

./configure
make debug

모든 디버그 기호가 있고 최적화가 없으며, 여기서 :

./configure
make

"릴리스"버전 (기본값)이됩니다.

추신 : --enable-debug 플래그 / 기능에 대해 읽었지만 현재 (간단한) 설정에서는이를 사용하여 인식하지 못합니다. configure


귀하의 configure.in또는 configure.ac파일에 조항을 추가 하십시오.

AC_ARG_ENABLE(debug,
AS_HELP_STRING([--enable-debug],
               [enable debugging, default: no]),
[case "${enableval}" in
             yes) debug=true ;;
             no)  debug=false ;;
             *)   AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;;
esac],
[debug=false])

AM_CONDITIONAL(DEBUG, test x"$debug" = x"true")

이제 귀하의 Makefile.in또는 Makefile.am;

if DEBUG
AM_CFLAGS = -g3 -O0
AM_CXXFLAGS = -g3 -O0
else
AM_CFLAGS = -O2
AM_CXXFLAGS = -O2
endif

따라서 debug가 활성화 되면 {C/CXX}FLAGS디버그 정보를 활성화 하도록 수정할 수 있습니다 .


ismail의 솔루션은 일반적인 접근 방식이지만 몇 가지 심각한 문제가 있습니다. 사용자가 './configure --enable-debug'를 수행하여 디버그 빌드를 얻으려고하면 구성 스크립트는 CFLAGS를 '-g -O2'로 설정하고 Makefile은 '-g3 -O0 ... -g를 사용합니다. -O2 '실행 파일을 빌드 할 때. 이 경우 gcc는 -O2를 사용하고 일부 컴파일러는 충돌하는 -O 옵션으로 인해 중단됩니다. 두 시나리오 모두 예상되는 동작이 아닙니다.

디버그 기호로 빌드하거나 빌드하지 않는 것은 프로젝트 관리자가 전혀 걱정할 것이 아닙니다. 이것은 사용자의 문제입니다. 프로젝트가 있고 디버그 빌드 또는 릴리스 빌드를 만들려는 경우 구성시 다른 옵션을 사용해야합니다. 예를 들면

$ mkdir 디버그
$ mkdir 릴리스
$ cd 디버그 && / 경로 / to / configure --prefix = / dbg \
   CPPFLAGS = -DDEBUG CXXFLAGS = "-g -O0"&& make && make install
$ cd ../release && / path / to / configure CPPFLAGS = -DNDEBUG && make && make install

이것은 / dbg / bin에 디버그 빌드를 설치하고 / usr / local / bin에 'release'설치를 설치합니다.

또한 CONFIG_SITE 파일을 사용하여 필요한 타이핑의 지루함을 크게 줄일 수 있습니다. 예를 들어 다음을 수행 할 수 있습니다.

echo 'CPPFLAGS = -DDEBUG CFLAGS = "-g -O0"'>> /dbg/share/config.site

그런 다음 'configure --prefix = / dbg'의 모든 향후 호출은 명령 줄에서 지정할 필요없이 CPPFLAGS 및 CFLAGS에 대한 설정을 자동으로 상속합니다.

, 패키지 관리자, 당신은 "디버그 버전"을 구축 할 수있는 쉬운 방법을 사용자에게 제공 할 경우, 적절한 인수와 원용로 구성 스크립트를 호출 분포 스크립트를 포함하는 완벽하게 수용 make && make install이 있지만, 당신의 autotool 메타 파일을 그런 엉망진창으로 흩뿌 릴 필요가 전혀 없습니다. 그것은 단순히 거기에 속하지 않습니다. 그리고 많은 패키지 --enable-debug가 단순히 잘못된 것을 추가하려고 시도했습니다 . 사용자가 호출 configure CFLAGS="-g -O0"했지만 예기치 않은 플래그를 적용하는 빌드가 발생하면 버그가 있고 패키지가 손상된 것 입니다. 이것은 모든 너무 일반적인 경험, 그리고 패키지를 유지하는 경우 (현재에 대해 생각 tmux하고curl) 사용자가을 호출 한 후 합리적인 사람이 "디버그 빌드"라고 부르는 것을 얻지 못하는 경우 configure CFLAGS="-g -O0"패키지가 손상 됩니다.

autotools로 패키지를 유지할 때 항상 기억해야 할 중요한 점은 사용자가 귀하와 완전히 다른 도구 체인을 사용할 수 있다는 것입니다. 사용자의 도구 체인에 -DMAKE_IT_A_DEBUG또는 -DUSE_DEBUG또는 이 필요할 수 -I/usr/banana-split/debug/build/with/georges/headers있습니다. 아마도 그것은 필요 -O145하거나 -Q컴파일러에 -debug전달되거나 링커에 전달되거나 ... 관리자는 "디버그 빌드"라는 문구를 모든 사용자에게 의미있게 만드는 데 필요한 정보가 없습니다. 따라서 특정 사용자 집합에 대해 소프트웨어를 빌드 할 수 없게 만들 수 있으므로 시도하지 마십시오.


The default Makefile created with autotools produces binaries with debug symbos. Use make install-strip to produce a release target.


Another example to configure CFLAGS/CXXFLAGS without editing Makefile.in or Makefile.am. Add this code to your configure.in or configure.ac file:

test -z "$SED" && SED=sed

AC_ARG_ENABLE([debug],
  [AS_HELP_STRING([--enable-debug],
                  [whether to include debug symbols (default is no)])],
  [enable_debug=$enableval],
  [enable_debug=no]
)

if test "x$enable_debug" = xyes; then
  dnl Remove all optimization flags from CFLAGS
  changequote({,})
  CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9s]*//g'`
  CXXFLAGS=`echo "$CXXFLAGS" | $SED -e 's/-O[0-9s]*//g'`

  CFLAGS=`echo "$CFLAGS" | $SED -e 's/-g[0-9]*//g'`
  CXXFLAGS=`echo "$CXXFLAGS" | $SED -e 's/-g[0-9]*//g'`
  changequote([,])

  CFLAGS="$CFLAGS -g -O0"
  CXXFLAGS="$CXXFLAGS -g -O0"
fi

echo "CFLAGS=$CFLAGS"

Test it:

$ ./configure --enable-debug | grep CFLAGS

참고URL : https://stackoverflow.com/questions/4553735/gnu-autotools-debug-release-targets

반응형