From 5bc936d4f57473ccd6af3c083ab6d1364be6e5d6 Mon Sep 17 00:00:00 2001 From: VintagePC <53943260+vintagepc@users.noreply.github.com> Date: Wed, 27 Jul 2022 19:40:11 -0400 Subject: [PATCH] Remove helper file, fix lang ordering, check sizes --- CMakeLists.txt | 52 +++++++++++++++++++-------- cmake/Check_final_lang_bin_size.cmake | 11 ++++++ cmake/Check_lang_size.cmake | 9 +++++ cmake/helpers/Configuration_prusa.h | 24 ------------- 4 files changed, 58 insertions(+), 38 deletions(-) create mode 100644 cmake/Check_final_lang_bin_size.cmake create mode 100644 cmake/Check_lang_size.cmake delete mode 100644 cmake/helpers/Configuration_prusa.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a9a6b2f9e..30a618f9a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,13 @@ set (CMAKE_CXX_STANDARD 11) get_dependency_directory(prusa3dboards PRUSA_BOARDS_DIR) project(Prusa-Firmware) +FILE(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/config.h MAX_SIZE_LINE REGEX "^#define \+LANG_SIZE_RESERVED \+") +STRING(REGEX MATCH "0x[0-9]+" MAX_SIZE_HEX "${MAX_SIZE_LINE}") +math(EXPR LANG_MAX_SIZE "${MAX_SIZE_HEX}" OUTPUT_FORMAT DECIMAL) +message("Language maximum size (from config.h): ${LANG_MAX_SIZE} bytes") + +set (LANG_BIN_MAX 249856) # Ditto, this in xflash_layout.h + get_recommended_gcc_version(RECOMMENDED_TOOLCHAIN_VERSION) if(CMAKE_CROSSCOMPILING AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL ${RECOMMENDED_TOOLCHAIN_VERSION} @@ -83,6 +90,7 @@ file(GLOB AVR_SOURCES RELATIVE ${PROJECT_SOURCE_DIR} ${PRUSA_BOARDS_DIR}/cores/p file(GLOB LANG_VARIANTS RELATIVE ${PROJECT_SOURCE_DIR}/lang/po ${PROJECT_SOURCE_DIR}/lang/po/Firmware_??.po) string(REPLACE "Firmware_" "" LANG_VARIANTS "${LANG_VARIANTS}") string(REPLACE ".po" "" LANG_VARIANTS "${LANG_VARIANTS}") +list(SORT LANG_VARIANTS) message("Languages found: ${LANG_VARIANTS}") add_library(avr_core STATIC ${AVR_SOURCES}) @@ -94,10 +102,24 @@ target_compile_options(avr_core PUBLIC -mmcu=atmega2560) function(fw_add_variant variant_name) - add_executable(${variant_name} ${FW_SOURCES} ${FW_HEADERS}) + # Create the Configuration_Prusa.h for this variant so it can be #included. + set(VARIANT_CFG_DIR "${CMAKE_CURRENT_BINARY_DIR}/${variant_name}_include") + set(VARIANT_CFG_FILE "${VARIANT_CFG_DIR}/Configuration_prusa.h") + add_custom_command(OUTPUT ${VARIANT_CFG_FILE} + COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/Firmware/variants/${variant_name}.h ${VARIANT_CFG_FILE} + COMMENT "Generating Configuration_prusa.h for ${variant_name}" + BYPRODUCTS ${VARIANT_CFG_DIR} + ) + + add_executable(${variant_name} ${FW_SOURCES} ${FW_HEADERS} ${VARIANT_CFG_FILE}) set_target_properties(${variant_name} PROPERTIES CXX_STANDARD 14) + target_include_directories(${variant_name} PRIVATE Firmware + ${PRUSA_BOARDS_DIR}/cores/prusa_einsy_rambo/ + ${PRUSA_BOARDS_DIR}/variants/prusa_einsy_rambo/ + ${VARIANT_CFG_DIR} # Include the header for this variant. + ) # # configure linker script set(LINKER_SCRIPT ${PRUSA_BOARDS_DIR}/ldscripts/avr6.xn) @@ -125,23 +147,16 @@ function(fw_add_variant variant_name) # generate linker map file target_link_options(${variant_name} PUBLIC -Wl,-Map=${variant_name}.map) - - target_include_directories(${variant_name} PRIVATE Firmware - ${PRUSA_BOARDS_DIR}/cores/prusa_einsy_rambo/ - ${PRUSA_BOARDS_DIR}/variants/prusa_einsy_rambo/ - ${PROJECT_SOURCE_DIR}/cmake/helpers/ # Add our magic config helper :) - ) - target_compile_options(${variant_name} PRIVATE) # turn this on for lolz -Wdouble-promotion) - string(REPLACE "-" "_" DEFINE_NAME "${variant_name}") - target_compile_definitions(${variant_name} PRIVATE H${DEFINE_NAME} ARDUINO=10600 __AVR_ATmega2560__) + target_compile_definitions(${variant_name} PRIVATE ARDUINO=10600 __AVR_ATmega2560__) target_link_libraries(${variant_name} avr_core) #Construct language map - set(LANG_MAP ${CMAKE_CURRENT_BINARY_DIR}/lang/${variant_name}_lang.map) + set(LANG_TMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/lang) + set(LANG_MAP ${LANG_TMP_DIR}/${variant_name}_lang.map) set(LANG_FWBIN ${CMAKE_BINARY_DIR}/${variant_name}.bin) - set(LANG_FINAL_BIN ${CMAKE_CURRENT_BINARY_DIR}/lang/${variant_name}_lang.bin) - set(LANG_FINAL_HEX ${CMAKE_CURRENT_BINARY_DIR}/lang/${variant_name}_lang.hex) + set(LANG_FINAL_BIN ${LANG_TMP_DIR}/${variant_name}_lang.bin) + set(LANG_FINAL_HEX ${LANG_TMP_DIR}/${variant_name}_lang.hex) add_custom_command(OUTPUT ${LANG_FWBIN} COMMAND "${CMAKE_OBJCOPY}" -I ihex -O binary ${CMAKE_BINARY_DIR}/${variant_name}.hex ${LANG_FWBIN} @@ -153,22 +168,31 @@ function(fw_add_variant variant_name) ) set(LANG_BINS "") + foreach (LANG IN LISTS LANG_VARIANTS) - set(LANG_BIN ${CMAKE_CURRENT_BINARY_DIR}/lang/${variant_name}_${LANG}.bin) + set(LANG_BIN ${LANG_TMP_DIR}/${variant_name}_${LANG}.bin) set(PO_FILE "${CMAKE_CURRENT_SOURCE_DIR}/lang/po/Firmware_${LANG}.po") add_custom_command(OUTPUT ${LANG_BIN} # COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/lang/lang-check.py --no-warning --map "${LANG_MAP}" "${PO_FILE}" # COMMAND ${CMAKE_COMMAND} -E echo "Building lang_${LANG}.bin" COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/lang/lang-build.py ${LANG_MAP} ${PO_FILE} ${LANG_BIN} + # Check bin size: + COMMAND ${CMAKE_COMMAND} -DLANG_MAX_SIZE=${LANG_MAX_SIZE} + -DLANG_FILE=${LANG_BIN} + -P ${PROJECT_CMAKE_DIR}/Check_lang_size.cmake DEPENDS ${LANG_MAP} COMMENT "Generating ${variant_name}_${LANG}.bin from .po" ) LIST(APPEND LANG_BINS ${LANG_BIN}) + endforeach() add_custom_command( OUTPUT ${LANG_FINAL_BIN} # TODO - needs differentiation for platforms, e.g. copy /b on Win COMMAND cat ${LANG_BINS} > ${LANG_FINAL_BIN} + COMMAND ${CMAKE_COMMAND} -DLANG_MAX_SIZE=${LANG_BIN_MAX} + -DLANG_FILE=${LANG_FINAL_BIN} + -P ${PROJECT_CMAKE_DIR}/Check_final_lang_bin_size.cmake DEPENDS ${LANG_BINS} COMMENT "Merging language binaries" ) diff --git a/cmake/Check_final_lang_bin_size.cmake b/cmake/Check_final_lang_bin_size.cmake new file mode 100644 index 000000000..18079ea22 --- /dev/null +++ b/cmake/Check_final_lang_bin_size.cmake @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.18) +FILE(SIZE ${LANG_FILE} FILE_SIZE) +get_filename_component(FILE_BASE ${LANG_FILE} NAME) +MATH(EXPR PADDED_SIZE "((${FILE_SIZE}+4096-1) / 4096 * 4096 )") +message(STATUS "${FILE_BASE} raw size ${FILE_SIZE} bytes (${PADDED_SIZE} b padded)") +if(${PADDED_SIZE} GREATER ${LANG_MAX_SIZE}) + message(FATAL_ERROR "Language file ${FILE_BASE} (${PADDED_SIZE}b) exceeds maximum allowed size of ${LANG_MAX_SIZE} bytes - Aborting!") +else() + MATH(EXPR SIZE_PCT "( ${PADDED_SIZE} * 100) / ${LANG_MAX_SIZE} " ) + message(STATUS "Language file ${FILE_BASE} is ${PADDED_SIZE} bytes, ${SIZE_PCT}% of allowed space - OK") +endif() diff --git a/cmake/Check_lang_size.cmake b/cmake/Check_lang_size.cmake new file mode 100644 index 000000000..58efab7bf --- /dev/null +++ b/cmake/Check_lang_size.cmake @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.18) +FILE(SIZE ${LANG_FILE} FILE_SIZE) +get_filename_component(FILE_BASE ${LANG_FILE} NAME) +if(${FILE_SIZE} GREATER ${LANG_MAX_SIZE}) + message(FATAL_ERROR "Language file ${FILE_BASE} (${FILE_SIZE}b) exceeds maximum allowed size of ${LANG_MAX_SIZE} bytes - Aborting!") +else() + MATH(EXPR SIZE_PCT "( ${FILE_SIZE} * 100) / ${LANG_MAX_SIZE} " ) + message(STATUS "Language file ${FILE_BASE} is ${FILE_SIZE} bytes, ${SIZE_PCT}% of allowed space - OK") +endif() diff --git a/cmake/helpers/Configuration_prusa.h b/cmake/helpers/Configuration_prusa.h deleted file mode 100644 index a308af746..000000000 --- a/cmake/helpers/Configuration_prusa.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifdef H1_75mm_MK25_RAMBo10a_E3Dv6full -#include "variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h" -#endif -#ifdef H1_75mm_MK25_RAMBo13a_E3Dv6full -#include "variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h" -#endif -#ifdef H1_75mm_MK25S_RAMBo10a_E3Dv6full -#include "variants/1_75mm_MK25S-RAMBo10a-E3Dv6full.h" -#endif -#ifdef H1_75mm_MK25S_RAMBo13a_E3Dv6full -#include "variants/1_75mm_MK25S-RAMBo13a-E3Dv6full.h" -#endif -#ifdef H1_75mm_MK2_RAMBo10a_E3Dv6full -#include "variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h" -#endif -#ifdef H1_75mm_MK2_RAMBo13a_E3Dv6full -#include "variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h" -#endif -#ifdef H1_75mm_MK3_EINSy10a_E3Dv6full -#include "variants/1_75mm_MK3-EINSy10a-E3Dv6full.h" -#endif -#ifdef H1_75mm_MK3S_EINSy10a_E3Dv6full -#include "variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h" -#endif \ No newline at end of file