2015-11-20 2 views
2

Я использую CLion 1.2 для создания встроенного проекта C для цели STM32. Кросс-компиляция с использованием инструментов GNU ARM работает хорошо, однако я бы хотел запустить arm-none-eabi-size после создания исполняемого файла и вывести вывод этой команды в окно вывода сборки.CMake post-build output command с печатью

У меня был обстоятельный взгляд на макрос add_custom_command, однако я не собираюсь генерировать выходной файл, что и делает макрос.

Ниже CMakeLists.txt, что я использую в проекте:

cmake_minimum_required(VERSION 3.3) 
include(CMakeForceCompiler) 
project(rtos_clion) 
# ------------------------------------------------------------------- 

set(CMAKE_SYSTEM_PROCESSOR cortex-m0) 
SET(CMAKE_SYSTEM_NAME Generic) 

# Target Environment 
SET(CMAKE_FIND_ROOT_PATH "C:/Program Files (x86)/GNU Tools ARM Embedded/4.9 2015q2") 

# Cross compiler 
CMAKE_FORCE_C_COMPILER(arm-none-eabi-gcc GNU) 
CMAKE_FORCE_CXX_COMPILER(arm-none-eabi-g++ GNU) 

# Executable type 
set(CMAKE_EXECUTABLE_SUFFIX ".elf") 

# Compiler flags 
set(ARM_FLAGS "-mcpu=cortex-m0 -mthumb -Os") 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARM_FLAGS} -std=gnu++11 -fabi-version=0 -fno-exceptions -fno-rtti -fno-use-cxa-atexit -fno-threadsafe-statics -ffunction-sections -g") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11 ${ARM_FLAGS} -ffunction-sections -fmessage-length=0 -fsigned-char -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra -g") 
set(CMAKE_EXE_LINKER_FLAGS "${ARM_FLAGS} -g -Wl,--library-path=\"${PROJECT_SOURCE_DIR}\" -T mem.ld -T libs.ld -T sections.ld -Xlinker --gc-sections -Wl,-Map=${PROJECT_NAME}.map --specs=nano.specs") 

set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <LINK_FLAGS> -o <TARGET> <OBJECTS>") 
set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <LINK_FLAGS> -o <TARGET> <OBJECTS>") 
# ------------------------------------------------------------------- 

# Global definitions 
add_definitions(-DDEBUG -DUSE_FULL_ASSERT -DSTM32F051x8 -DHSE_VALUE=8000000) 

include_directories(
    # My include directories 
) 

set(SOURCE_FILES 
    # My source files 
) 

add_executable(${PROJECT_NAME} ${SOURCE_FILES}) 

# search for programs in the build host directories 
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 

Это то, что arm-none-eabi-size печатает при выполнении в консоли:

$arm-none-eabi-size --format=berkeley "rtos_clion.elf" 

text data  bss  dec  hex filename 
32840  308 7796 40944 9ff0 rtos_clion.elf 

Как бы я, что бег и есть что выводится в окне сборки?

Спасибо!

ответ

5

Просто используйте TARGET поток add_custom_command:

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD 
    COMMAND arm-none-eabi-size --format=berkeley "rtos_clion.elf") 

Команда будет выполнена после того, как исполняемый файл был (повторно) построен.

+0

Это было довольно много легче, чем я думал. Благодаря! – WoodyWoodsta

0

Даже .elf файл может быть взят из переменной:

set_target_properties(${TARGET} PROPERTIES SUFFIX ".elf") 
add_custom_command(TARGET ${MAIN_TARGET} POST_BUILD 
     COMMAND arm-none-eabi-size --format=berkeley --totals "$<TARGET_FILE:${TARGET}>" 
     COMMENT "Invoking: Cross ARM GNU Print Size") 
Смежные вопросы