C/C++ RPM 파일에 빌드 구성을 안정적으로 수정하고 컴파일러 플래그를 추가하는 방법은 무엇입니까?

C/C++ RPM 파일에 빌드 구성을 안정적으로 수정하고 컴파일러 플래그를 추가하는 방법은 무엇입니까?

테스트를 위해 다수의 rpm 파일의 빌드 구성을 변경해야 합니다. 여기서는 C/C++ 코드에 대해서만 이야기하고 있습니다. 반드시 자동화하고 싶지는 않지만 손으로 ​​할 수도 있습니다.

이번에는 문제를 더 명확하게 하기 위해 구체적인 예를 사용합니다. Perl 호환 정규식 라이브러리 rpm이 있고사양 문서가지다:

%configure \
%ifarch s390 s390x sparc64 sparcv9 riscv64
    --disable-jit \
%else
    --enable-jit \
%endif
    --enable-pcretest-libreadline \
    --enable-utf \
    --enable-unicode-properties \
    --enable-pcre8 \
    --enable-pcre16 \
    --enable-pcre32 \
    --disable-silent-rules
%{make_build}

AddressSanitizer에 대한 컴파일러 플래그를 추가하고 싶어서 다음을 추가했습니다 --disable-silent-rules.

   CFLAGS="$CFLAGS -fsanitize=address -g3"
   CXXFLAGS="$CXXFLAGS -fsanitize=address -g3" \
   LDFLAGS="$LDFLAGS -fsanitize=address -g3" \
   LSAN_OPTIONS="verbosity=1:log_threads=1:log_pointers=1"
   ASAN_OPTIONS="detect_leaks=0"

이것이 최선의 방법입니까? 나는 때때로 이것이 작동하지 않는다는 것을 발견했습니다. 이 경우 출력 .sos를 확인했는데 asan 부분이나 디버그 정보가 없습니다 -g3... 이 경우 asan 및 디버그 정보를 추가하는 안정적인 방법을 찾고 있지만 이는 다음 중 어떤 경우에도 작동할 수 있습니다. 이 클래스 컴파일러 플래그. 이 작업을 수동으로 수행할 수도 있지만 RPM 사양 파일에 지정된 정확한 빌드를 안정적으로 재현할 수 있도록 RPM 도구를 사용하는 것을 선호합니다.

답변1

대부분의 소프트웨어 패키지에 적용되는 가장 일반적인 방법은 사용자 정의 optflags매크로입니다.

$HOME/.rpmrc사용자 정의 값을 생성하고 배치 할 수 있습니다 .

운영 체제의 현재 값을 얻으려면 먼저 다음을 실행할 수 있습니다.

rpm --eval %{optflags}

예를 들어 RHEL 8에서는 다음이 생성됩니다.

-O2 -g -pipe -Wall -Werror=안전한 포맷 -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fExceptionions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/ redhat /redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection

필요에 따라 매개변수를 수정하면서 결과를 복사하여 붙여넣습니다. 예를 들어 -g로 변경하여 -g3저장 합니다 ~/.rpmrc.

위의 명령을 다시 실행하여 수정된 값을 가져와서 모든 작업을 올바르게 수행했는지 확인하세요.

관련 정보