Bug 34685

Summary: llvm-config возвращает опции не совместимые с gcc
Product: Sisyphus Reporter: obirvalger <obirvalger>
Component: llvm11.0-develAssignee: Arseny Maslennikov <arseny>
Status: RESOLVED LATER QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: glebfm, lakostis
Version: unstable   
Hardware: all   
OS: Linux   
Bug Depends on:    
Bug Blocks: 34681    

Description obirvalger@altlinux.org 2018-03-21 22:27:55 MSK
Ожидается, что llvm-config --cxxflags будет возвращать опции, совместимые с gcc.

Выводятся несовместимые опции:
-Wcovered-switch-default
-Wstring-conversion
-fcolor-diagnostics

Пример из официальной документации, где используется g++:

http://llvm.org/docs/CommandGuide/llvm-config.html

g++ `llvm-config --cxxflags` -o HowToUseJIT.o -c HowToUseJIT.cpp
g++ `llvm-config --ldflags` -o HowToUseJIT HowToUseJIT.o \
    `llvm-config --libs engine bcreader scalaropts`
Comment 1 Konstantin A Lepikhov (L.A. Kostis) 2018-03-22 00:03:58 MSK
Опции сборки llvm будут совместимы с gcc только если сам llvm собран gcc, а сейчас это не так.

Я не очень хочу пересобирать llvm, потому потеряются возможности lld и thinLTO, поэтому в качестве варианта можно использовать след.

1) Пересобрать проект clang'ом. Должно получиться, если проект уже собирается нативно под Darwin.

2) Отфильтровать ненужные флаги, как это, например, делают в Mesalib:

# Call this inside ` ` to get the return value.                                                                                                                                                                                                               
# $1 is the llvm-config command with arguments.                                                                                                                                                                                                               
strip_unwanted_llvm_flags() {                                                                                                                                                                                                                                 
    echo " `$1` " | sed -E \                                                                                                                                                                                                                                  
        -e 's/[[[:space:]]]+-m[[^[:space:]]]*//g' \                                                                                                                                                                                                           
        -e 's/[[[:space:]]]+-DNDEBUG[[[:space:]]]/ /g' \                                                                                                                                                                                                      
        -e 's/[[[:space:]]]+-D_GNU_SOURCE[[[:space:]]]/ /g' \                                                                                                                                                                                                 
        -e 's/[[[:space:]]]+-pedantic[[[:space:]]]/ /g' \                                                                                                                                                                                                     
        -e 's/[[[:space:]]]+-W[[^[:space:]]]*//g' \                                                                                                                                                                                                           
        -e 's/[[[:space:]]]+-O[[^[:space:]]]*//g' \                                                                                                                                                                                                           
        -e 's/[[[:space:]]]+-g[[^[:space:]]]*//g' \                                                                                                                                                                                                           
        -e 's/-fno-rtti[[[:space:]]]/-Fno-rtti /g' \                                                                                                                                                                                                          
        -e 's/[[[:space:]]]+-f[[^[:space:]]]*//g' \                                                                                                                                                                                                           
        -e 's/-Fno-rtti[[[:space:]]]/-fno-rtti /g' \                                                                                                                                                                                                          
        -e 's/^[[[:space:]]]//' \                                                                                                                                                                                                                             
        -e 's/[[[:space:]]]$//'                                                                                                                                                                                                                               
}
...

dnl                                                                                                                                                                                                                                                           
dnl Set defines and buildtime variables only when using LLVM.                                                                                                                                                                                                 
dnl                                                                                                                                                                                                                                                           
if test "x$enable_llvm" = xyes; then                                                                                                                                                                                                                          
    DEFINES="${DEFINES} -DHAVE_LLVM=0x0$LLVM_VERSION_INT -DMESA_LLVM_VERSION_PATCH=$LLVM_VERSION_PATCH"                                                                                                                                                       
                                                                                                                                                                                                                                                              
    LLVM_LDFLAGS=`$LLVM_CONFIG --ldflags`                                                                                                                                                                                                                     
    LLVM_CFLAGS=$LLVM_CPPFLAGS   # CPPFLAGS seem to be sufficient                                                                                                                                                                                             
    LLVM_CXXFLAGS=`strip_unwanted_llvm_flags "$LLVM_CONFIG --cxxflags"
Comment 2 Konstantin A Lepikhov (L.A. Kostis) 2021-02-11 22:52:49 MSK
Дарю новому мантейнеру, не благодарите.
Comment 3 Arseny Maslennikov 2021-02-12 12:26:56 MSK
Сейчас, спустя 3 года, у нас llvm собирается gcc, начиная ещё с 11.0.0-alt1. Если включить --with clang, то см. аннотацию к коммиту http://git.altlinux.org/people/arseny/packages/llvm11.0.git?p=llvm11.0.git;a=commit;h=4b3c6c13e4d70fd201691c636d57b5b020e00709 , это отдельная проблема, которой не было в llvm 10.

Это имеет смысл переоткрыть, когда мы начнём собирать llvm при помощи clang.