2015-03-01 3 views
1

Недавно я нашел Ceedling (https://github.com/ThrowTheSwitch/Ceedling), отличный инструмент для создания грабли и сборки тестов C. Поскольку я немного играл с этим, у меня был в целом положительный опыт, и я подумал, что я могу начать свой следующий проект C с ним.Использование Ceedling/Rake для создания общей библиотеки и исполняемого файла

Однако кажется, что ceedling не способен (или недокументирован в этом отношении) для создания проектов, которые состоят из более чем исполняемого файла или требуют определенных флагов компиляции. Знаете ли вы какой-либо пример проекта C, который использует Rake/Ceedling для создания разделяемых библиотек, настраивает LDFLAGS, CFLAGS и имеет несколько целей?

ответ

2

Пример проекта blinky показывает, что вам нужно сделать, чтобы скомпилировать более продвинутые проекты. Вы можете получить его, запустив ceedling example blinky. Project.yaml за это выглядит следующим образом:

--- 
​ 
# Notes: 
# This is a fully tested project that demonstrates the use 
# of a timer ISR to blink the on board LED of an Arduino UNO 
:project: 
    :use_exceptions: FALSE 
    :use_test_preprocessor: TRUE 
    :use_auxiliary_dependencies: TRUE 
    :build_root: build 
    :release_build: TRUE 
    :test_file_prefix: test_ 
​ 
#You'll have to specify these 
:environment: 
    - :mcu: atmega328p 
    - :f_cpu: 16000000UL 
    - :serial_port: COM8 #change this to the serial port you are using!!! 
    - :objcopy: avr-objcopy 
    # Uncomment these lines if you are using windows and don't have these tools in your path 
    # - :path: 
    # - C:\mingw\bin 
    # - C:\WinAVR-20100110\bin 
    # - C:\WinAVR-20100110\utils\bin 
    # - #{ENV['PATH']} 
​ 
:extension: 
    :executable: .bin 
​ 
:release_build: 
    :output: blinky 
​ 
:paths: 
    :test: 
    - +:test/** 
    - -:test/support 
    :source: 
    - src/** 
    :support: 
    - test/support 
​ 
:defines: 
    # in order to add common defines: 
    # 1) remove the trailing [] from the :common: section 
    # 2) add entries to the :common: section (e.g. :test: has TEST defined) 
    :commmon: &common_defines [] 
    :test: 
    - *common_defines 
    - TEST 
    :test_preprocess: 
    - *common_defines 
    - TEST 
​ 
:tools: 
    :release_compiler: 
    :executable: avr-gcc 
    :arguments: 
     - ${1} 
     - -DTARGET 
     - -DF_CPU=#{ENV['F_CPU']} 
     - -mmcu=#{ENV['MCU']} 
     - -Iinclude/ 
     - -Wall 
     - -Os 
     - -c 
     - -o ${2} 
    :release_linker: 
    :executable: avr-gcc 
    :arguments: 
     - -mmcu=#{ENV['MCU']} 
     - ${1} 
     - -o ${2}.bin 
​ 
:cmock: 
    :mock_prefix: mock_ 
    :when_no_prototypes: :warn 
    :enforce_strict_ordering: TRUE 
    :plugins: 
    - :ignore 
    :treat_as: 
    uint8: HEX8 
    uint16: HEX16 
    uint32: UINT32 
    int8:  INT8 
    bool:  UINT8 
​ 
#:tools: 
# Ceedling defaults to using gcc for compiling, linking, etc. 
# As [:tools] is blank, gcc will be used (so long as it's in your system path) 
# See documentation to configure a given toolchain for use 
​ 
:plugins: 
    :load_paths: 
    - vendor/ceedling/plugins 
    :enabled: 
    - stdout_pretty_tests_report 
    - module_generator 
... 

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

Там github docs также говорить об этом более подробно и даже дает walkthough, чтобы показать, какие определенные параметры в: инструменты: опции работают, как показано ниже:

Пример [: инструменты] YAML реклам

:tools: 
    :test_compiler: 
    :executable: compiler    #exists in system search path 
    :name: 'acme test compiler' 
    :arguments: 
     - -I"$”: COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE    #expands to -I search paths 
     - -I"$”: COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR #expands to -I search paths 
     - -D$: COLLECTION_TEST_DEFINES #expands to all -D defined symbols 
     - --network-license    #simple command line argument 
     - -optimize-level 4    #simple command line argument 
     - "#{`args.exe -m acme.prj`}" #in-line ruby sub to shell out & build string of arguments 
     - -c ${1}      #source code input file (Ruby method call param list sub) 
     - -o ${2}      #object file output (Ruby method call param list sub) 
    :test_linker: 
    :executable: /programs/acme/bin/linker.exe #absolute file path 
    :name: 'acme test linker' 
    :arguments: 
     - ${1}    #list of object files to link (Ruby method call param list sub) 
     - -l$-lib:   #inline yaml array substitution to link in foo-lib and bar-lib 
      - foo 
      - bar 
     - -o ${2}   #executable file output (Ruby method call param list sub) 
    :test_fixture: 
    :executable: tools/bin/acme_simulator.exe #relative file path to command line simulator 
    :name: 'acme test fixture' 
    :stderr_redirect: :win      #inform Ceedling what model of $stderr capture to use 
    :arguments: 
     - -mem large #simple command line argument 
     - -f "${1}" #binary executable input file to simulator (Ruby method call param list sub) 

Результирующие конструкции командной строки из предыдущего примера [: инструменты] Разметки YAML

> compiler -I"/usr/include” -I”project/tests” 
    -I"project/tests/support” -I”project/source” -I”project/include” 
    -DTEST -DLONG_NAMES -network-license -optimize-level 4 arg-foo 
    arg-bar arg-baz -c project/source/source.c -o 
    build/tests/out/source.o 
Смежные вопросы