LINUX.ORG.RU

Показать список include директорий gcc

 , ,


0

1

Привет!

Надо бы получить строкой стандартные пути, которые gcc использует для поиска заголовочных файлов под mingw.

Сейчас делаю так:

MINGW_BIN_DIR=$(basename $(type -pf gcc))
MINGW_ROOT_DIR="${MINGW_ROOT_DIR}/.."

get_target() {
    echo "i686-w64-mingw32" # хардкод, хочу генерировать на лету
}

MINGW_INCLUDE_DIR="${MINGW_ROOT_DIR}/include:${MINGW_ROOT_DIR}/$(get_target)/include"

Также знаю о gcc -print-search-dirs, но не уверен, надо ли мне вся строка, так как там куча невалидных путей:

$ gcc -print-search-dirs

install: c:/install/Qt/Qt5.4.1/Tools/mingw491_32/bin/../lib/gcc/i686-w64-mingw32/4.9.1/
programs: =c:/install/Qt/Qt5.4.1/Tools/mingw491_32/bin/../libexec/gcc/i686-w64-mingw32/4.9.1/;c:/install/Qt/Qt5.4.1/Tools/mingw491_32/bin/../libexec/gcc/;c:/install/Qt/Qt5.4.1/Tools/mingw491_32/bin/../lib/gcc/i686-w64-mingw32/4.9.1/../../../../i686-w64-mingw32/bin/i686-w64-mingw32/4.9.1/;c:/install/Qt/Qt5.4.1/Tools/mingw491_32/bin/../lib/gcc/i686-w64-mingw32/4.9.1/../../../../i686-w64-mingw32/bin/
libraries: =c:/install/Qt/Qt5.4.1/Tools/mingw491_32/bin/../lib/gcc/i686-w64-mingw32/4.9.1/;c:/install/Qt/Qt5.4.1/Tools/mingw491_32/bin/../lib/gcc/;c:/install/Qt/Qt5.4.1/Tools/mingw491_32/bin/../lib/gcc/i686-w64-mingw32/4.9.1/../../../../i686-w64-mingw32/lib/i686-w64-mingw32/4.9.1/;c:/install/Qt/Qt5.4.1/Tools/mingw491_32/bin/../lib/gcc/i686-w64-mingw32/4.9.1/../../../../i686-w64-mingw32/lib/../lib/;c:/install/Qt/Qt5.4.1/Tools/mingw491_32/bin/../lib/gcc/i686-w64-mingw32/4.9.1/../../../i686-w64-mingw32/4.9.1/;c:/install/Qt/Qt5.4.1/Tools/mingw491_32/bin/../lib/gcc/i686-w64-mingw32/4.9.1/../../../../lib/;C:/mingw491/i686-491-posix-dwarf-rt_v3-rev2/mingw32/mingw/lib/i686-w64-mingw32/4.9.1/;C:/mingw491/i686-491-posix-dwarf-rt_v3-rev2/mingw32/mingw/lib/../lib/;c:/install/Qt/Qt5.4.1/Tools/mingw491_32/bin/../lib/gcc/i686-w64-mingw32/4.9.1/../../../../i686-w64-mingw32/lib/;c:/install/Qt/Qt5.4.1/Tools/mingw491_32/bin/../lib/gcc/i686-w64-mingw32/4.9.1/../../../;C:/mingw491/i686-491-posix-dwarf-rt_v3-rev2/mingw32/mingw/lib/

И вообще — надёжно ли парсить?

★★★★★

Последнее исправление: KennyMinigun (всего исправлений: 4)

Ничего не понял. Ты хочешь получить «системный» mingw? Не надо, их может быть несколько. 32/64 битные как минимум + какой-то другой версии. Лучше пусть пользователь пишет префикс/таргет, как в автотулз

anonymous
()

Я этот вывод парсил:

gcc -x c -v -E /dev/null
Оно там в разных строчках и имеет удобные маркеры, такие:
...
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib64/gcc/x86_64-slackware-linux/4.9.2/include
 /usr/local/include
 /usr/lib64/gcc/x86_64-slackware-linux/4.9.2/include-fixed
 /usr/include
End of search list.
...

И вообще — надёжно ли парсить?

А почему нет? Данные от драйвера компилятора, кому как ни ему знать где заголовки искать.

Вывод -print-search-dirs не содержит у меня всех путей, которые приведены выше.

xaizek ★★★★★
()
Ответ на: комментарий от anonymous

Нет, я хочу узнать откуда текущий mingw берёт свои инклюды. И, если я правильно понимаюто мне нужно узнать название target'а для которого собирает текущий gcc.

KennyMinigun ★★★★★
() автор топика
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от xaizek

А вот это спасибо! Сделал на CMake :D

if(MINGW AND CMAKE_COMPILER_IS_GNUCC)
    # MinGW usually has sql.h in its own include directories
    execute_process(COMMAND ${CMAKE_C_COMPILER} -Wp,-v -x c -fsyntax-only nul
        ERROR_VARIABLE _cc_out
    )

    set(_begin_pattern "#include <\\.\\.\\.> search starts here:")
    set(_end_pattern "End of search list\\.")

    string(REGEX REPLACE ".*${_begin_pattern}(.*)${_end_pattern}.*" "\\1" _raw_result ${_cc_out})
    string(REPLACE "\n" ";" _raw_list ${_raw_result})

    foreach(_raw_dir IN LISTS _raw_list)
        if(NOT ${_raw_dir} STREQUAL "")
            string(SUBSTRING "${_raw_dir}" 1 -1 _dir)
            list(APPEND MINGW_INCLUDE_DIRS ${_dir})
        endif()
    endforeach(_raw_dir)
endif()

Единственное, что осталось — удостоверится, что gcc запускается с английской локалью (en_US.UTF-8, C).

KennyMinigun ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.