Skip to content

Commit

Permalink
Add CMakeScripts folder; used for printing GC options in external models
Browse files Browse the repository at this point in the history
We have placed a copy of CMakeScripts/GC-Helpers.cmake in this repository
so that we can call upon this to print out GEOS-Chem options when
compiled in external contexts like GCHPctm or GEOS.

Signed-off-by: Bob Yantosca <[email protected]>
  • Loading branch information
yantosca committed Sep 30, 2020
1 parent 6e004b7 commit dee7870
Showing 1 changed file with 185 additions and 0 deletions.
185 changes: 185 additions & 0 deletions CMakeScripts/GC-Helpers.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@

#[[ stringify_list
Stringify a list of strings.
Usage:
stringify_list(<list>
[PRINT]
[LINE_LENGTH <length>]
[HIGHLIGHT <keyword> ...]
[JOIN <token> ...]
[AFTER]
)
Options:
PRINT Print the stringified list to console. Highlighted text
will also be colorized.
LINE_LENGTH When JOINing a list of string, the resulting lines will
be limited to <length> characters. The resulting <list>
will be a list of lines that can then be JOINed with
newlines.
HIGHLIGHT A list of keywords to highlight.
JOIN A list of tokens that will be used sequentially to join
list items. The last token will be used to join all
remaining items.
AFTER Place the JOIN tokens after the item, rather than before.
]]
function(stringify_list LIST)
cmake_parse_arguments(BETTER
"PRINT;AFTER"
"LINE_LENGTH"
"HIGHLIGHT;JOIN"
${ARGN}
)

if(NOT DEFINED BETTER_LINE_LENGTH)
set(BETTER_LINE_LENGTH 1000) # Arbitrary big number
endif()

set(STR ${${LIST}})

# Limit joined line length
if(DEFINED BETTER_JOIN)
set(TEMP "")
set(CUR_LEN "0")

set(JOIN_IDX "0 - 1")
list(LENGTH BETTER_JOIN JOIN_LEN)

foreach(ITEM ${STR})
# Get the join token
math(EXPR JOIN_IDX "${JOIN_IDX} + 1")
if(${JOIN_IDX} LESS ${JOIN_LEN})
list(GET BETTER_JOIN "${JOIN_IDX}" JOIN_TOKEN)
endif()
string(LENGTH "${JOIN_TOKEN}" SEP_LEN)

# If a line length was
string(LENGTH "${ITEM}" WORD_LEN)
math(EXPR POST_LEN "${WORD_LEN} + ${CUR_LEN} + ${SEP_LEN}")
if("${POST_LEN}" LESS "${BETTER_LINE_LENGTH}")
if(${BETTER_AFTER})
set(TEMP "${TEMP}${ITEM}${JOIN_TOKEN}")
else()
set(TEMP "${TEMP}${JOIN_TOKEN}${ITEM}")
endif()
set(CUR_LEN "${POST_LEN}")
else()
if(${BETTER_AFTER})
set(TEMP "${TEMP};${ITEM}${JOIN_TOKEN}")
else()
set(TEMP "${TEMP};${JOIN_TOKEN}${ITEM}")
endif()
set(CUR_LEN "0")
math(EXPR CUR_LEN "${SEP_LEN} + ${WORD_LEN}")
endif()
endforeach()

set(STR "${TEMP}")
endif()

# Highlight selected words
if(DEFINED BETTER_HIGHLIGHT)
foreach(KEYWORD ${BETTER_HIGHLIGHT})
string(REPLACE "${KEYWORD}" "[${KEYWORD}]" STR "${STR}")
endforeach()
endif()

if(${BETTER_PRINT})
string(ASCII 27 Esc)
if(${CMAKE_COLOR_MAKEFILE})
string(REGEX REPLACE "\\[([a-zA-Z0-9_\\.]+)\\]" "${Esc}[32m\\1${Esc}[m" COLORIZED "${STR}")
else()
set(COLORIZED "${STR}")
endif()
string(REGEX REPLACE "\n$" "" COLORIZED "${COLORIZED}")
message("${COLORIZED}")
endif()


# Export the new string
set(${LIST} "${STR}" PARENT_SCOPE)
endfunction()

#[[ get_repo_version
Variable with name ${VARNAME} gets set to first 7 characters of the hash
of the last commit to the repo at ${DIR}.
Usage:
get_repo_version(VARNAME DIR)
]]
macro(get_repo_version VARNAME DIR)
execute_process(
COMMAND git describe --tags --dirty=.dirty
WORKING_DIRECTORY ${DIR}
OUTPUT_VARIABLE ${VARNAME}
OUTPUT_STRIP_TRAILING_WHITESPACE
)
endmacro()

function(gc_pretty_print)
cmake_parse_arguments(ARGS
"IS_BOOLEAN"
"VARIABLE;SECTION"
"OPTIONS"
${ARGN}
)

if(DEFINED ARGS_VARIABLE)
if(ARGS_IS_BOOLEAN)
set(LOGLINE "ON" "OFF")
# Split list with " "
stringify_list(LOGLINE
JOIN " "
LINE_LENGTH 60
)
# Wrap lines
stringify_list(LOGLINE
JOIN " * ${ARGS_VARIABLE}:\t" "\n ... \t"
)
if("${${ARGS_VARIABLE}}")
stringify_list(LOGLINE PRINT HIGHLIGHT "ON")
else()
stringify_list(LOGLINE PRINT HIGHLIGHT "OFF")
endif()
elseif(DEFINED ARGS_OPTIONS)
set(LOGLINE ${ARGS_OPTIONS})
# Split list with " "
stringify_list(LOGLINE
JOIN " "
LINE_LENGTH 60
)
# Wrap lines
stringify_list(LOGLINE
JOIN " * ${ARGS_VARIABLE}:\t" "\n ... \t"
)
stringify_list(LOGLINE PRINT HIGHLIGHT ${${ARGS_VARIABLE}})
else()
if(NOT DEFINED ${ARGS_VARIABLE})
set(LOGLINE " ") # special case for empty variable
else()
set(LOGLINE ${${ARGS_VARIABLE}})
endif()
# Split list with " "
stringify_list(LOGLINE
JOIN " "
LINE_LENGTH 60
)
# Wrap lines
stringify_list(LOGLINE
JOIN " + ${ARGS_VARIABLE}:\t" "\n ... \t"
)
stringify_list(LOGLINE PRINT)
endif()
elseif(DEFINED ARGS_SECTION)
message(STATUS "${ARGS_SECTION}:")
endif()
endfunction()

0 comments on commit dee7870

Please sign in to comment.