С некоторый пор я переехал с emacs’а на atom, который выглядел как более современная замена. Что для меня было важным — у него очень хорошая работа с CMake и автодополнение для оного. Вскоре ко всему этому делу я прикрутил lint и autocomplete через clang. И то и другое мне понравилось, но хотело актуального .clang_autocomplete в корне проекта. Однако, если проект получает от системы сборки кучу дефайнов, то управлять этим файликом руками становится больно и неприятно. Выход — генерить его на лету. Вот мой костыль для CMake:
message(STATUS "Generarating ${CMAKE_SOURCE_DIR}/.clang_complete")
get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
file(WRITE ${CMAKE_SOURCE_DIR}/.clang_complete "")
foreach(dir ${dirs})
file(APPEND ${CMAKE_SOURCE_DIR}/.clang_complete "-I${dir}\n")
endforeach()
string(REPLACE "'" "" CMAKE_C_FLAGS_SPLIT ${CMAKE_C_FLAGS})
string(REPLACE " " ";" CMAKE_C_FLAGS_SPLIT ${CMAKE_C_FLAGS_SPLIT})
foreach(flag ${CMAKE_C_FLAGS_SPLIT})
file(APPEND ${CMAKE_SOURCE_DIR}/.clang_complete "${flag}\n")
endforeach() |
message(STATUS "Generarating ${CMAKE_SOURCE_DIR}/.clang_complete")
get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
file(WRITE ${CMAKE_SOURCE_DIR}/.clang_complete "")
foreach(dir ${dirs})
file(APPEND ${CMAKE_SOURCE_DIR}/.clang_complete "-I${dir}\n")
endforeach()
string(REPLACE "'" "" CMAKE_C_FLAGS_SPLIT ${CMAKE_C_FLAGS})
string(REPLACE " " ";" CMAKE_C_FLAGS_SPLIT ${CMAKE_C_FLAGS_SPLIT})
foreach(flag ${CMAKE_C_FLAGS_SPLIT})
file(APPEND ${CMAKE_SOURCE_DIR}/.clang_complete "${flag}\n")
endforeach()
Очевидно, если мы используем C++ в проекте, то и обрабатывать схожим образом надо переменную CMAKE_CXX_FLAGS. У этого кода есть очевидное ограничение: Если мы передаем через -D дефайны с несколькими словами — нас ждет облом (напр. -DRELEASE_CODENAME=»Black Burned Cookies»)
Поделиться ссылкой:
-
Нажмите для печати (Открывается в новом окне)
Печать
-
Послать ссылку другу по электронной почте (Открывается в новом окне)
E-mail
-
Нажмите, чтобы поделиться на Reddit (Открывается в новом окне)
Reddit
-
Нажмите, чтобы поделиться в Telegram (Открывается в новом окне)
Telegram
-
Нажмите, чтобы поделиться в Mastodon (Открывается в новом окне)
Mastodon
-
Нажмите, чтобы поделиться в WhatsApp (Открывается в новом окне)
WhatsApp
-
Нажмите, чтобы поделиться в Nextdoor (Открывается в новом окне)
Nextdoor
-
Нажмите, чтобы открыть на Facebook (Открывается в новом окне)
Facebook
-
Нажмите, чтобы поделиться на LinkedIn (Открывается в новом окне)
LinkedIn
-
Нажмите, чтобы поделиться записями на Tumblr (Открывается в новом окне)
Tumblr
-
Нажмите, чтобы поделиться записями на Pinterest (Открывается в новом окне)
Pinterest
-
Нажмите, чтобы поделиться записями на Pocket (Открывается в новом окне)
Pocket