Статьи

Linting без плагина

С «Eclipse and PC-lint: Linticator» у меня есть плагин для комфортного линтинга моих источников. Но я могу сделать это и без плагина. Для этого я использую командный файл с конфигурацией сборки и настройками, чтобы сообщения ПК-линта отображались в окне «Проблемы». Да, это звучит не просто, но очень выполнимо и понятно, как только я его настрою. Это дает мне полный контроль над каждой маленькой деталью. Вот как я это делаю …PC-lint похож на любой другой компилятор: он компилирует мои исходные файлы. Но он не производит объектный код: он производит сообщения. Поэтому мне нужно настроить компилятор для компиляции моих исходных кодов и для создания сообщений, чтобы я мог щелкать и переходить к исходным файлам и строкам, которые нарушали их работу. Запуск PC-lint с проектом в Eclipse означает решение трех задач:

  1. Как настроить PC-lint в качестве компилятора для моего проекта?
  2. Как передать параметры компилятору PC-lint?
  3. Как настроить сообщения для представления «Проблемы»?

Я использую совместный подход с конфигурацией сборки eclipse , командным файлом и файлами опций lint . Представленное здесь решение использует следующие шаги:

  1. Использование управляемой конфигурации сборки сборки
  2. Настройка командного файла для вызова PC-lint
  3. Определение списка файлов
  4. Указание опций
  5. Определение формата сообщения
  6. Линт это !

Шаг 1: Конфигурация сборки

В свой существующий проект я добавляю конфигурацию управляемой сборки для PC-lint. Конфигурация сборки настроена для вызова командного файла. Я выбираю проект и использую меню Project> Build Configuration> Manage… и создаю новую конфигурацию, используя кнопку New :

Создание новой конфигурации сборки

Создание новой конфигурации сборки

Для новой конфигурации я копирую настройки из существующей конфигурации:

Создание новой конфигурации

Создание новой конфигурации

Эта новая конфигурация будет использовать мой обычный компилятор. Вместо этого я хочу использовать компилятор lint. В Project> Properties> C / C ++ Build> Builder Settings я отключаю « Использовать команду сборки по умолчанию » и вместо этого использую:

${ProjDirPath}\lint\do_lint.bat "${ProjDirPath}" "${MCUToolsBaseDir}"

Я указываю на файл do_lint.bat внутри папки lint моего проекта, который я создам на следующем шаге. Дополнительно я отключаю « Автоматически генерировать Makefile »:

Настройки Builder для пакетного файла PC-lint

Настройки Builder для пакетного файла PC-lint

CodeWarrior для MCU10.2 по умолчанию использует параллельные сборки. Это добавит -j6 как параметр в командную строку. Чтобы отключить это, я настраиваю специфичные для проекта настройки на вкладке Build Behavior:

Поведение пользовательской сборки

Поведение пользовательской сборки

Шаг 2: Пакетный файл

Чтобы отделить файлы lint от остальной части моей сборки и проекта, я создаю подпапку lint внутри корня моего проекта с помощью пакетного файла do_lint.bat:

пакетный файл do_lint

пакетный файл do_lint

Do_lint.bat имеет следующий контент:

@rem The arguments for this batch file: 
@rem %1: The path to the project folder
@rem %2: The path to the CodeWarrior installation folder
@rem ------------------------------------------------------
@rem Path to my project folder
SET PROJ_PATH=%1
@rem Path to CodeWarrior installation folder (which is e.g. "C:\Freescale\CW MCU v10.2\eclipse\..\MCU")
SET CW_PATH=%2
@rem Path to lint-nt.exe
SET LINT_EXE=C:\lint\lint-nt.exe
@rem Path to my lint configuration files
SET LOCAL_LNT_FILES=C:\Freescale\PC-lint\fsl_lnt
@rem Path to my local lint folder inside the project
SET PROJ_LINT_PATH=%PROJ_PATH%\lint
@rem Lint configuration files and includes
SET LNT_INCLUDES=-i"%LOCAL_LNT_FILES%" "%LOCAL_LNT_FILES%\co-mwhc08.lnt" -i%LOCAL_LNT_FILES%
@rem --------------- Run PC-lint ---------------------------
%LINT_EXE% %LNT_INCLUDES% %PROJ_LINT_PATH%\proj_options.lnt %PROJ_LINT_PATH%\proj_files.lnt -vf

Пакетный файл вызывается из eclipse с двумя аргументами (% 1 и% 2): с путем к папке проекта и путем к папке установки CodeWarrior. Я назначаю их локальным переменным (PROJ_PATH и CW_PATH), чтобы использовать их в файлах .lnt. Чтобы узнать, где находится мой компилятор lint, я использую LINT_EXE. Я храню свои файлы конфигурации lint вне папки установки PC-lint, поэтому я определил переменную пути для этого: LOCAL_LINT_FILES. PROJ_LINT_PATH содержит подпапку проекта со всеми моими пакетными и линтовыми файлами для проекта. В LNT_INCLUDES я указываю свой файл конфигурации lint моего компилятора, плюс где lint будет искать мои файлы конфигурации lint. Наконец, он вызывает исполняемый файл lint с включаемыми файлами lint плюс два файла: параметры проекта (proj_options.lnt) ифайлы проекта (proj_files.lnt) . Я объясняю эти файлы в шаге 4.

Шаг 3: Список файлов

Я создал файл proj_files.lnt внутри моего проекта:

Список файлов для линта

Список файлов для линта

В этом файле перечислены все мои исходные файлы. И поскольку я определил переменные окружения, такие как PROJ_PATH, я могу использовать их здесь:

%PROJ_PATH%\Sources\main.c 
%PROJ_PATH%\Sources\Events.c

Шаг 4: Передача опций

Не хватает конкретных параметров проекта: я добавляю их в файл proj_options.lnt:

Файл опций проекта

Файл опций проекта

В этом файле я добавляю с опцией -i PC-lint все пути, где он может найти мои файлы:

// Include paths used
-i%PROJ_PATH%
-i%PROJ_PATH%\Sources
-i%PROJ_PATH%\Generated_Code
-i%CW_PATH%\lib\hc08c\include

Дополнительно я указываю все глобальные опции, например, для запрета сообщений:

// inhibit messages for Processor Expert libraries
-elib(19, 10)
-e766
+libh(Events.h, Cpu.h)

Step 5: Defining the message format

Last but not least: I need to tell PC-lint how to format the messages so they end up properly in the eclipse Problems view. I add them as well to the proj_options.lnt:

// Coerce messages for Eclipse
-hF1
+ffn
// Normally my format is defined as follows:
//-"format=%(\q%f\q %l %C%) %t %n: %m"
// For eclipse-usage, the GCC error format is necessary,
// since we have only the default eclipse error parser available.
-"format=%(%f:%l:%C:%) %t %n: %m"
// Enable warning 831 if you are interested.
-frl
// Do not break lines
-width(0) 
// And make sure no foreign includes change the format
+flm

Step 5: Linting in action

Time to see how this works! As I have set up a separate build configuration to lint my files, I can run it like any other build configuration:

Создайте мою конфигурацию пуха

Build my lint configuration

The example below shows several lint errors for main.c. The messages show up in the Problems view, and are listed as well in the Console view:

Linting в действии

Linting in action

Summary

The approach presented here does not need any other eclipse plugin. It is using a batch file, and uses a brute force approach: it will lint all files regardless if they have changed or not. This could be improved with a make file approach as outlined here. The approach presented here requires some setup, is pretty simple, and routes all lint messages to the Problems view. If I want to use more of a plugin approach, then the Linticator plugin is the alternative.

Thanks to Catherine for providing a lot of good ideas used in this article!

Happy linting :-)