Como criamos um novo check para a ferramenta clang-tidy?
Vemos isso logo depois de descobrirmos como compilar o compilador LLVM/Clang …
Clonar e compilar o LLVM
Link: https://github.com/llvm/llvm-project
Link: https://clang.llvm.org/get_started.html
O primeiro passo que precisamos realizar é clonar e compilar o repositório do LLVM.
$ git clone https://github.com/llvm/llvm-project $ cd llvm-project $ cmake -S llvm -B build -G Ninja \ -DCMAKE_INSTALL_PREFIX="$HOME/bin/clang" \ -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" \ -DCMAKE_BUILD_TYPE=Release \ -DLLVM_PARALLEL_LINK_JOBS=1 $ cmake --build build
Compilar o repositório inteiro demora um pouco. Porém nas vezes seguintes apenas os arquivos modificados serão recompilados e, portanto, o processo será mais rápido.
O consumo de memória RAM pode ser um problema. Ao linkar são necessário 8 GB de RAM por linker, talvez mais. Para reduzir a memória RAM utilizada durante a compilação fazemos uma build do tipo “Release” e limitamos a um linker executando por vez.
Depois de tudo compilado, pode-se recompilar apenas o clang-tidy com o comando
$ cmake --build build clang-tidy
Além disso, para compilar e executar os testes de unidade do clang-tidy use o comando
$ cmake --build build check-extra-tools
Testar o Clang-tidy Recém Compilado
Agora vamos ter certeza que o executável do clang-tidy está compilado.
$ cd build/bin $ ./clang-tidy --version LLVM (http://llvm.org/): LLVM version 15.0.0git Optimized build. Default target: x86_64-unknown-linux-gnu Host CPU: ivybridge
Podemos também verificar os checks disponíveis:
$ ./clang-tidy --list-checks --checks="*" Enabled checks: abseil-cleanup-ctad abseil-duration-addition ... readability-use-anyofallof zircon-temporary-objects
Criando o Novo Check do Clang-tidy
Link: https://clang.llvm.org/extra/clang-tidy/Contributing.html
Agora vamos criar os arquivos base para o novo check:
- Módulo: readability
- Nome do check: awesome-function-names
$ cd clang-tools-extra $ python3 clang-tidy/add_new_check.py readability awesome-function-names $ cmake --build build
Veja agora os checks disponíveis no clang-tidy recém compilado:
$ ./clang-tidy --list-checks --checks="*" Enabled checks: ... readability-awesome-function-names ...
Teste o novo check. O check padrão vai reclamar de qualquer função que não inicie com “awesome_”. Por exemplo:
// FILE.cpp void func1() {} // Ocorre warning; e void awesome_func2() {} // Não ocorre warning.
Vamos executar o clang-tidy com o novo check. O executável deve estar na pasta build/bin/:
$ build/bin/clang-tidy --checks="-*,readability-awesome-function-names" FILE.cpp
Usando ‘–checks=”-*” ‘ desabilitamos todos os checks e, em seguida adicionamos o nosso novo check, chamado “readability-awesome-function-names“.
Use o comando “git status” para ver os arquivos criados e modificados pelo comando “add_new_check.py“.
$ git status Changes not staged for commit: modified: clang-tidy/readability/CMakeLists.txt modified: clang-tidy/readability/ReadabilityTidyModule.cpp modified: docs/ReleaseNotes.rst modified: docs/clang-tidy/checks/list.rst Untracked files: clang-tidy/readability/AwesomeFunctionNamesCheck.cpp clang-tidy/readability/AwesomeFunctionNamesCheck.h docs/clang-tidy/checks/readability-awesome-function-names.rst test/clang-tidy/checkers/readability-awesome-function-names.cpp
Edite o arquivo AwesomeFunctionNamesCheck.cpp para customizar o seu check. Este passo está além do escopo deste post e vamos terminar por aqui.
Considerações Finais
Neste post vimos como compilar as ferramentas extra do compilador LLVM/Clang e como criar o código base para um check da ferramenta clang-tidy.