Как я могу вручную указать исходные файлы, которые Ceedling не может подобрать?

Я разрабатываю функцию для встроенного приложения и использую Ceedling (который основан на тестовой среде Unity), чтобы протестировать ее. У меня проблема в том, что мне нужно использовать функциональность в исходных файлах C, которые Ceedling не компилирует / не связывает с моими файлами модульного теста.

Согласно документации Ceedling:

Ceedling знает, какие файлы нужно скомпилировать и связать в каждом отдельном исполняемом тестовом файле, используя список #include, содержащийся в каждом тестовом файле. Любые исходные файлы C в сконфигурированных каталогах поиска, которые соответствуют заголовочным файлам, включенным в тестовый файл, будут скомпилированы и связаны с результирующим исполняемым файлом тестового устройства.

Проблема в том, что я включаю заголовочный файл "RTOS.h" в мои модульные тесты, чтобы получить доступ к функциям RTOS embOS, но эти функции определены в "RTOSInit.c" и "os7m_tl__dp.a", и в соответствии с этим Документация Ceedling будет искать "RTOS.c" только тогда, когда он видит #include "RTOS.h" в коде модульного теста.

То, что я ищу, - это способ вручную указать, что эти дополнительные файлы должны быть скомпилированы и связаны при создании исполняемого файла тестового бегуна. Это кажется очень основным требованием к Ceedling, но я не вижу способа сделать это из документации.

Я также затронул эту проблему на сайте Ceedling Github.

Для справки, мой текущий файл "project.yml" (используемый Ceedling) приведен ниже:

:project:
  :use_exceptions: FALSE
  :use_test_preprocessor: FALSE
  :use_auxiliary_dependencies: TRUE
  :build_root: build
  :release_build: FALSE
  :test_file_prefix: test_

:environment:
  - :path:
    - 'C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\bin'
    - 'C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\common\bin'
    - #{ENV['PATH']}

:extension:
  :executable: .out

:paths:
  :test:
    - +:test/**
    - -:test/support
  :source:
    - src/main/c/**
    - src/main/include/**
    - src/main/resources/**
  :support:
    - test/support

:defines:
  :commmon: &common_defines []
  :test:
    - *common_defines
    - TEST
  :test_preprocess:
    - *common_defines
    - TEST

:cmock:
  :mock_prefix: mock_
  :when_no_prototypes: :warn
  :enforce_strict_ordering: TRUE
  :plugins:
    - :ignore
    - :callback
  :treat_as:
    uint8:    HEX8
    uint16:   HEX16
    uint32:   UINT32
    int8:     INT8
    bool:     UINT8

:tools:
  :test_compiler:
    :executable: iccarm
    :name: 'IAR test compiler'
    :arguments:
      - -D _DLIB_FILE_DESCRIPTOR=1
      - --debug
      - --endian=little
      - --cpu=Cortex-M3
      - -e
      - --fpu=None
      - -Ol
      - --preprocess "${3}"
      - --dlib_config "C:/Program Files (x86)/IAR Systems/Embedded Workbench 6.5/arm/INC/c/DLib_Config_Normal.h"
      - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
      - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
      - -o "${2}"
      - --diag_suppress=Pa050
      - '"${1}"'

  :test_linker:
    :executable: ilinkarm
    :name: 'IAR test linker'
    :arguments:
      - --vfe
      - --redirect _Printf=_PrintfFull
      - --redirect _Scanf=_ScanfFull
      - --semihosting
      - --config "C:/Program Files (x86)/IAR Systems/Embedded Workbench 6.5/arm/config/generic_cortex.icf"
      - --map "${3}"
      - -o "${2}"
      - '"${1}"'

  :test_fixture:
    :executable: cspybat
    :name: 'CSpyBat test runner'
    :arguments:
      - '"C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\bin\armproc.dll"'
      - '"C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\bin\armsim2.dll"'
      - '"${1}"'
      - --plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\bin\armbat.dll"
      - --backend -B
      - --endian=little
      - --cpu=Cortex-M3
      - --fpu=None
      - --semihosting

:plugins:
  :load_paths:
    - vendor/ceedling/plugins
  :enabled:
    - stdout_pretty_tests_report
    - module_generator
...

2 ответа

У меня была такая же проблема при тестировании ОСРВ nOS, и я использовал пустые файлы заголовков, чтобы заставить Ceedling скомпилировать соответствующие исходные файлы. К счастью, в Unity был добавлен новый макрос, который решает проблему. Просто добавьте что-то похожее вверху ваших тестовых файлов:

TEST_FILE("source_file_to_compile.c")

Убедитесь, что вы указали каталог, содержащий файл вproject.ymlисточники. Ceedling не выдаст вам никаких ошибок, если не сможет найти указанный файл. Вместо этого он может найти другой файл с тем же именем, но в другом месте (которое уже указано в качестве источника).

Другие вопросы по тегам