我最近发现了Ceedling(https://github.com/ThrowTheSwitch/Ceedling),这是一个很好的基于rake的工具来构建和单元测试C项目。当我玩了一点时,我有一个普遍积极的经验,并认为我可以用它开始我的下一个C项目。
但是,对于构建包含多个可执行文件或需要特定编译标志的项目,似乎ceedling不具备(或在此方面未记录)。您是否知道使用Rake / Ceedling构建共享库,配置LDFLAGS,CFLAGS以及具有多个目标的C项目的任何示例?
答案 0 :(得分: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
...
正如您在:tools:和:environment:部分中所看到的那样,您可以做很多事情来自定义编译项目的方式以及您想要的确切设置/标记。
还有github docs更深入地讨论这个问题,甚至可以通过以下方式展示:工具:选项中的某些设置如下所示:
示例[:tools] YAML blurbs
: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)
前面示例[:tools] YAML blurbs
产生的命令行结构> 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