-
-
Save JrGoodle/1d4b70c13b8f4612b936 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
include(CMakeParseArguments) | |
# Function to wrap a given string into multiple lines at the given column position. | |
# Parameters: | |
# VARIABLE - The name of the CMake variable holding the string. | |
# AT_COLUMN - The column position at which string will be wrapped. | |
function(WRAP_STRING) | |
set(oneValueArgs VARIABLE AT_COLUMN) | |
cmake_parse_arguments(WRAP_STRING "${options}" "${oneValueArgs}" "" ${ARGN}) | |
string(LENGTH ${${WRAP_STRING_VARIABLE}} stringLength) | |
math(EXPR offset "0") | |
while(stringLength GREATER 0) | |
if(stringLength GREATER ${WRAP_STRING_AT_COLUMN}) | |
math(EXPR length "${WRAP_STRING_AT_COLUMN}") | |
else() | |
math(EXPR length "${stringLength}") | |
endif() | |
string(SUBSTRING ${${WRAP_STRING_VARIABLE}} ${offset} ${length} line) | |
set(lines "${lines}\n${line}") | |
math(EXPR stringLength "${stringLength} - ${length}") | |
math(EXPR offset "${offset} + ${length}") | |
endwhile() | |
set(${WRAP_STRING_VARIABLE} "${lines}" PARENT_SCOPE) | |
endfunction() | |
# Function to embed contents of a file as byte array in C/C++ header file(.h). The header file | |
# will contain a byte array and integer variable holding the size of the array. | |
# Parameters | |
# SOURCE_FILE - The path of source file whose contents will be embedded in the header file. | |
# VARIABLE_NAME - The name of the variable for the byte array. The string "_SIZE" will be append | |
# to this name and will be used a variable name for size variable. | |
# HEADER_FILE - The path of header file. | |
# APPEND - If specified appends to the header file instead of overwriting it | |
# NULL_TERMINATE - If specified a null byte(zero) will be append to the byte array. This will be | |
# useful if the source file is a text file and we want to use the file contents | |
# as string. But the size variable holds size of the byte array without this | |
# null byte. | |
# Usage: | |
# bin2h(SOURCE_FILE "Logo.png" HEADER_FILE "Logo.h" VARIABLE_NAME "LOGO_PNG") | |
function(BIN2H) | |
set(options APPEND NULL_TERMINATE) | |
set(oneValueArgs SOURCE_FILE VARIABLE_NAME HEADER_FILE) | |
cmake_parse_arguments(BIN2H "${options}" "${oneValueArgs}" "" ${ARGN}) | |
# reads source file contents as hex string | |
file(READ ${BIN2H_SOURCE_FILE} hexString HEX) | |
string(LENGTH ${hexString} hexStringLength) | |
# appends null byte if asked | |
if(BIN2H_NULL_TERMINATE) | |
set(hexString "${hexString}00") | |
endif() | |
# wraps the hex string into multiple lines at column 32(i.e. 16 bytes per line) | |
wrap_string(VARIABLE hexString AT_COLUMN 32) | |
math(EXPR arraySize "${hexStringLength} / 2") | |
# adds '0x' prefix and comma suffix before and after every byte respectively | |
string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1, " arrayValues ${hexString}) | |
# removes trailing comma | |
string(REGEX REPLACE ", $" "" arrayValues ${arrayValues}) | |
# converts the variable name into proper C identifier | |
string(MAKE_C_IDENTIFIER "${BIN2H_VARIABLE_NAME}" BIN2H_VARIABLE_NAME) | |
string(TOUPPER "${BIN2H_VARIABLE_NAME}" BIN2H_VARIABLE_NAME) | |
# declares byte array and the length variables | |
set(arrayDefinition "const unsigned char ${BIN2H_VARIABLE_NAME}[] = { ${arrayValues} };") | |
set(arraySizeDefinition "const size_t ${BIN2H_VARIABLE_NAME}_SIZE = ${arraySize};") | |
set(declarations "${arrayDefinition}\n\n${arraySizeDefinition}\n\n") | |
if(BIN2H_APPEND) | |
file(APPEND ${BIN2H_HEADER_FILE} "${declarations}") | |
else() | |
file(WRITE ${BIN2H_HEADER_FILE} "${declarations}") | |
endif() | |
endfunction() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment