【问题标题】:Use Ceedling / Rake for building a shared library and executable使用 Ceedling / Rake 构建共享库和可执行文件
【发布时间】:2015-03-01 11:45:33
【问题描述】:

我最近发现了 Ceedling (https://github.com/ThrowTheSwitch/Ceedling),这是一个不错的基于 rake 的工具,用于构建和单元测试 C 项目。在我玩了一点之后,我总体上获得了积极的体验,并认为我可以用它开始我的下一个 C 项目。

但是,ceedling 似乎无法(或在这方面没有记录)构建包含多个可执行文件或需要特定编译标志的项目。您知道使用 Rake /Ceedling 构建共享库、配置 LDFLAGS、CFLAGS 并具有多个目标的 C 项目示例吗?

【问题讨论】:

    标签: makefile rake ceedling


    【解决方案1】:

    示例项目 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: 选项中的某些设置的工作原理,如下所示:

    示例 [:tools] 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)
    

    来自前面示例 [:tools] 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
    

    【讨论】:

      猜你喜欢
      • 2021-10-25
      • 2021-07-17
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      相关资源
      最近更新 更多