@ -74,23 +74,48 @@ endfunction()
@@ -74,23 +74,48 @@ endfunction()
# I n t e r n a l h e l p e r f u n c t i o n t o p r o v i d e t h e c o r r e c t i n i t i a l i z e r f o r a l i s t i n t h e
# J S O N c o n t e n t .
function ( internal_yaml_list_initializer var )
set ( ${ var } "[]" PARENT_SCOPE )
function ( internal_yaml_list_initializer var genex )
if ( genex )
set ( ${ var } "\" @YAML-LIST@\ "" PARENT_SCOPE )
else ( )
set ( ${ var } "[]" PARENT_SCOPE )
endif ( )
endfunction ( )
# I n t e r n a l h e l p e r f u n c t i o n t o a p p e n d i t e m s t o a l i s t i n t h e J S O N c o n t e n t .
# U n a s s i g n e d a r g u m e n t s a r e t h e v a l u e s t o b e a p p e n d e d .
function ( internal_yaml_list_append var key )
function ( internal_yaml_list_append var genex key )
set ( json_content "${${var}}" )
string ( JSON subjson GET "${json_content}" ${ key } )
string ( JSON index LENGTH "${subjson}" )
list ( LENGTH ARGN length )
math ( EXPR stop "${index} + ${length} - 1" )
if ( NOT length EQUAL 0 )
foreach ( i RANGE ${ index } ${ stop } )
list ( POP_FRONT ARGN value )
string ( JSON json_content SET "${json_content}" ${ key } ${ i } "\" ${ value } \"")
endforeach ( )
if ( genex )
# n e w l i s t s a r e s t o r e d i n C M a k e s t r i n g f o r m a t , b u t t h o s e i m p o r t e d v i a
# yaml_load ( ) a r e p r o p e r J S O N a r r a y s . W h e n a n a p p e n d i s r e q u e s t e d , t h o s e
# m u s t b e c o n v e r t e d b a c k t o a C M a k e l i s t .
string ( JSON type TYPE "${json_content}" ${ key } )
if ( type STREQUAL ARRAY )
string ( JSON arraylength LENGTH "${subjson}" )
internal_yaml_list_initializer ( subjson TRUE )
if ( ${ arraylength } GREATER 0 )
math ( EXPR arraystop "${arraylength} - 1" )
foreach ( i RANGE 0 ${ arraystop } )
string ( JSON item GET "${json_content}" ${ key } ${ i } )
list ( APPEND subjson ${ item } )
endforeach ( )
endif ( )
endif ( )
list ( APPEND subjson ${ ARGN } )
string ( JSON json_content SET "${json_content}" ${ key } "\" ${ subjson } \"")
else ( )
# l i s t s a r e s t o r e d a s J S O N a r r a y s
string ( JSON index LENGTH "${subjson}" )
list ( LENGTH ARGN length )
math ( EXPR stop "${index} + ${length} - 1" )
if ( NOT length EQUAL 0 )
foreach ( i RANGE ${ index } ${ stop } )
list ( POP_FRONT ARGN value )
string ( JSON json_content SET "${json_content}" ${ key } ${ i } "\" ${ value } \"")
endforeach ( )
endif ( )
endif ( )
set ( ${ var } "${json_content}" PARENT_SCOPE )
endfunction ( )
@ -148,6 +173,7 @@ function(yaml_create)
@@ -148,6 +173,7 @@ function(yaml_create)
if ( DEFINED ARG_YAML_FILE )
zephyr_set ( FILE ${ ARG_YAML_FILE } SCOPE ${ ARG_YAML_NAME } )
endif ( )
zephyr_set ( GENEX FALSE SCOPE ${ ARG_YAML_NAME } )
zephyr_set ( JSON "{}" SCOPE ${ ARG_YAML_NAME } )
endfunction ( )
@ -172,7 +198,7 @@ function(yaml_load)
@@ -172,7 +198,7 @@ function(yaml_load)
zephyr_set ( FILE ${ ARG_YAML_FILE } SCOPE ${ ARG_YAML_NAME } )
execute_process ( COMMAND ${ PYTHON_EXECUTABLE } -c
" i m p o r t j s o n ; i m p o r t y a m l ; print ( json.dumps(yaml.safe_load(open(' ${ ARG_YAML_FILE } ' ) ) ) ) "
" i m p o r t j s o n ; i m p o r t y a m l ; print ( json.dumps(yaml.safe_load(open(' ${ ARG_YAML_FILE } ' ) ) o r { } ) ) "
O U T P U T _ V A R I A B L E j s o n _ l o a d _ o u t
E R R O R _ V A R I A B L E j s o n _ l o a d _ e r r o r
R E S U L T _ V A R I A B L E j s o n _ l o a d _ r e s u l t
@ -184,6 +210,7 @@ function(yaml_load)
@@ -184,6 +210,7 @@ function(yaml_load)
)
endif ( )
zephyr_set ( GENEX FALSE SCOPE ${ ARG_YAML_NAME } )
zephyr_set ( JSON "${json_load_out}" SCOPE ${ ARG_YAML_NAME } )
endfunction ( )
@ -264,8 +291,8 @@ function(yaml_length out_var)
@@ -264,8 +291,8 @@ function(yaml_length out_var)
endfunction ( )
# U s a g e :
# yaml_set ( NAME <name> KEY <key>... VALUE <value> )
# yaml_set ( NAME <name> KEY <key>... [APPEND] LIST <value>... )
# yaml_set ( NAME <name> KEY <key>... [GENEX] VALUE <value> )
# yaml_set ( NAME <name> KEY <key>... [APPEND] [GENEX] LIST <value>... )
#
# S e t a v a l u e o r a l i s t o f v a l u e s t o g i v e n k e y .
#
@ -275,18 +302,22 @@ endfunction()
@@ -275,18 +302,22 @@ endfunction()
# N A M E < n a m e > : N a m e o f t h e Y A M L c o n t e x t .
# K E Y < k e y > . . . : N a m e o f k e y .
# V A L U E < v a l u e > : N e w v a l u e f o r t h e k e y .
# L i s t < v a l u e s > : N e w l i s t o f v a l u e s f o r t h e k e y .
# L I S T < v a l u e s > : N e w l i s t o f v a l u e s f o r t h e k e y .
# A P P E N D : A p p e n d t h e l i s t o f v a l u e s t o t h e l i s t o f v a l u e s f o r t h e k e y .
# G E N E X : T h e value ( s ) c o n t a i n g e n e r a t o r e x p r e s s i o n s . W h e n u s i n g t h i s
# o p t i o n , a l s o s e e t h e n o t e s i n t h e yaml_save ( ) f u n c t i o n .
#
function ( yaml_set )
cmake_parse_arguments ( ARG_YAML "APPEND" "NAME;VALUE" "KEY;LIST" ${ ARGN } )
cmake_parse_arguments ( ARG_YAML "APPEND;GENEX " "NAME;VALUE" "KEY;LIST" ${ ARGN } )
zephyr_check_arguments_required_all ( ${ CMAKE_CURRENT_FUNCTION } ARG_YAML NAME KEY )
zephyr_check_arguments_required_allow_empty ( ${ CMAKE_CURRENT_FUNCTION } ARG_YAML VALUE LIST )
zephyr_check_arguments_exclusive ( ${ CMAKE_CURRENT_FUNCTION } ARG_YAML VALUE LIST )
internal_yaml_context_required ( NAME ${ ARG_YAML_NAME } )
zephyr_get_scoped ( json_content ${ ARG_YAML_NAME } JSON )
if ( ARG_YAML_GENEX )
zephyr_set ( GENEX TRUE SCOPE ${ ARG_YAML_NAME } )
endif ( )
if ( DEFINED ARG_YAML_LIST
O R L I S T I N _ L I S T A R G _ Y A M L _ K E Y W O R D S _ M I S S I N G _ V A L U E S )
@ -317,7 +348,7 @@ function(yaml_set)
@@ -317,7 +348,7 @@ function(yaml_set)
list ( REVERSE yaml_key_undefined )
if ( NOT "${yaml_key_undefined}" STREQUAL "" )
if ( key_is_list )
internal_yaml_list_initializer ( json_string )
internal_yaml_list_initializer ( json_string ${ genex } )
else ( )
set ( json_string "\" \"")
endif ( )
@ -332,11 +363,11 @@ function(yaml_set)
@@ -332,11 +363,11 @@ function(yaml_set)
if ( key_is_list )
if ( NOT ARG_YAML_APPEND )
internal_yaml_list_initializer ( json_string )
internal_yaml_list_initializer ( json_string ${ genex } )
string ( JSON json_content SET "${json_content}" ${ ARG_YAML_KEY } "${json_string}" )
endif ( )
internal_yaml_list_append ( json_content "${ARG_YAML_KEY}" ${ ARG_YAML_LIST } )
internal_yaml_list_append ( json_content ${ genex } "${ARG_YAML_KEY}" ${ ARG_YAML_LIST } )
else ( )
string ( JSON json_content SET "${json_content}" ${ ARG_YAML_KEY } "\" ${ ARG_YAML_VALUE } \"")
endif ( )
@ -372,8 +403,12 @@ endfunction()
@@ -372,8 +403,12 @@ endfunction()
# U s a g e :
# yaml_save ( NAME <name> [FILE <file>] )
#
# W r i t e t h e Y A M L c o n t e x t < n a m e > t o t h e f i l e w h i c h w e r e g i v e n w i t h t h e e a r l i e r
# ' yaml_load ( ) ' o r ' yaml_create ( ) ' c a l l .
# W r i t e t h e Y A M L c o n t e x t < n a m e > t o < f i l e > , o r t h e o n e g i v e n w i t h t h e e a r l i e r
# ' yaml_load ( ) ' o r ' yaml_create ( ) ' c a l l . T h i s w i l l b e p e r f o r m e d i m m e d i a t e l y i f
# t h e c o n t e x t d o e s n o t u s e g e n e r a t o r e x p r e s s i o n s ; o t h e r w i s e , k e y s t h a t i n c l u d e
# a g e n e r a t o r e x p r e s s i o n w i l l i n i t i a l l y b e w r i t t e n a s c o m m e n t s , a n d t h e f u l l
# c o n t e n t s w i l l b e a v a i l a b l e a t b u i l d t i m e . B u i l d s t e p s t h a t d e p e n d o n t h e f i l e
# b e i n g c o m p l e t e m u s t d e p e n d o n t h e ' < n a m e > _ y a m l _ s a v e d ' t a r g e t .
#
# N A M E < n a m e > : N a m e o f t h e Y A M L c o n t e x t
# F I L E < f i l e > : P a t h t o f i l e t o w r i t e t h e c o n t e x t .
@ -391,22 +426,67 @@ function(yaml_save)
@@ -391,22 +426,67 @@ function(yaml_save)
if ( NOT yaml_file )
zephyr_check_arguments_required ( ${ CMAKE_CURRENT_FUNCTION } ARG_YAML FILE )
endif ( )
zephyr_get_scoped ( json_content ${ ARG_YAML_NAME } JSON )
to_yaml ( "${json_content}" 0 yaml_out )
if ( DEFINED ARG_YAML_FILE )
set ( yaml_file ${ ARG_YAML_FILE } )
else ( )
zephyr_get_scoped ( yaml_file ${ ARG_YAML_NAME } FILE )
endif ( )
zephyr_get_scoped ( genex ${ ARG_YAML_NAME } GENEX )
zephyr_get_scoped ( json_content ${ ARG_YAML_NAME } JSON )
to_yaml ( "${json_content}" 0 yaml_out ${ genex } )
if ( EXISTS ${ yaml_file } )
FILE ( RENAME ${ yaml_file } ${ yaml_file } .bak )
endif ( )
FILE ( WRITE ${ yaml_file } "${yaml_out}" )
set ( save_target ${ ARG_YAML_NAME } _yaml_saved )
if ( NOT TARGET ${ save_target } )
# C r e a t e a t a r g e t f o r t h e c o m p l e t i o n o f t h e Y A M L s a v e o p e r a t i o n .
# T h i s w i l l b e a d u m m y u n l e s s g e n e x e s a r e u s e d .
add_custom_target ( ${ save_target } ALL DEPENDS ${ yaml_file } )
set_target_properties ( ${ save_target } PROPERTIES
g e n e x _ s a v e _ c o u n t 0
t e m p _ f i l e s " "
)
endif ( )
if ( genex )
get_property ( genex_save_count TARGET ${ save_target } PROPERTY genex_save_count )
if ( ${ genex_save_count } EQUAL 0 )
# F i r s t yaml_save ( ) f o r t h i s c o n t e x t w i t h g e n e x e s e n a b l e d
add_custom_command (
O U T P U T $ { y a m l _ f i l e }
D E P E N D S $ < T A R G E T _ P R O P E R T Y : $ { s a v e _ t a r g e t } , j s o n _ f i l e >
C O M M A N D $ { C M A K E _ C O M M A N D }
- D J S O N _ F I L E = " $ < T A R G E T _ P R O P E R T Y : $ { s a v e _ t a r g e t } , j s o n _ f i l e > "
- D Y A M L _ F I L E = " $ { y a m l _ f i l e } "
- D T E M P _ F I L E S = " $ < T A R G E T _ P R O P E R T Y : $ { s a v e _ t a r g e t } , t e m p _ f i l e s > "
- P $ { Z E P H Y R _ B A S E } / c m a k e / y a m l - f i l t e r . c m a k e
)
endif ( )
math ( EXPR genex_save_count "${genex_save_count} + 1" )
set_property ( TARGET ${ save_target } PROPERTY genex_save_count ${ genex_save_count } )
cmake_path ( SET yaml_path "${yaml_file}" )
cmake_path ( GET yaml_path STEM yaml_file_no_ext )
set ( json_file ${ yaml_file_no_ext } _ ${ genex_save_count } .json )
set_property ( TARGET ${ save_target } PROPERTY json_file ${ json_file } )
# c o m m e n t t h i s t o k e e p t h e t e m p o r a r y J S O N f i l e s
get_property ( temp_files TARGET ${ save_target } PROPERTY temp_files )
list ( APPEND temp_files ${ json_file } )
set_property ( TARGET ${ save_target } PROPERTY temp_files ${ temp_files } )
FILE ( GENERATE OUTPUT ${ json_file }
C O N T E N T " $ { j s o n _ c o n t e n t } "
)
endif ( )
endfunction ( )
function ( to_yaml json level yaml )
function ( to_yaml json level yaml genex )
if ( level GREATER 0 )
math ( EXPR level_dec "${level} - 1" )
set ( indent_ ${ level } "${indent_${level_dec}} " )
@ -425,10 +505,12 @@ function(to_yaml json level yaml)
@@ -425,10 +505,12 @@ function(to_yaml json level yaml)
string ( JSON type TYPE "${json}" ${ member } )
string ( JSON subjson GET "${json}" ${ member } )
if ( type STREQUAL OBJECT )
# J S O N o b j e c t - > Y A M L d i c t i o n a r y
set ( ${ yaml } "${${yaml}}${indent_${level}}${member}:\n" )
math ( EXPR sublevel "${level} + 1" )
to_yaml ( "${subjson}" ${ sublevel } ${ yaml } )
to_yaml ( "${subjson}" ${ sublevel } ${ yaml } ${ genex } )
elseif ( type STREQUAL ARRAY )
# J S O N a r r a y - > Y A M L l i s t
set ( ${ yaml } "${${yaml}}${indent_${level}}${member}:" )
string ( JSON arraylength LENGTH "${subjson}" )
if ( ${ arraylength } LESS 1 )
@ -441,7 +523,33 @@ function(to_yaml json level yaml)
@@ -441,7 +523,33 @@ function(to_yaml json level yaml)
set ( ${ yaml } "${${yaml}}${indent_${level}} - ${item}\n" )
endforeach ( )
endif ( )
elseif ( type STREQUAL STRING )
# J S O N s t r i n g m a p s t o m u l t i p l e Y A M L t y p e s :
# - w i t h u n e x p a n d e d g e n e r a t o r e x p r e s s i o n s : s a v e a s Y A M L c o m m e n t
# - i f i t m a t c h e s t h e s p e c i a l p r e f i x : c o n v e r t t o Y A M L l i s t
# - o t h e r w i s e : s a v e a s Y A M L s c a l a r
if ( subjson MATCHES "\\$<.*>" AND ${ genex } )
# Y e t u n e x p a n d e d g e n e r a t o r e x p r e s s i o n : s a v e a s c o m m e n t
string ( SUBSTRING ${ indent_${level } } 1 -1 short_indent )
set ( ${ yaml } "${${yaml}}#${short_indent}${member}: ${subjson}\n" )
elseif ( subjson MATCHES "^@YAML-LIST@" )
# L i s t - a s - s t r i n g : c o n v e r t t o l i s t
set ( ${ yaml } "${${yaml}}${indent_${level}}${member}:" )
list ( POP_FRONT subjson )
if ( subjson STREQUAL "" )
set ( ${ yaml } "${${yaml}} []\n" )
else ( )
set ( ${ yaml } "${${yaml}}\n" )
foreach ( item ${ subjson } )
set ( ${ yaml } "${${yaml}}${indent_${level}} - ${item}\n" )
endforeach ( )
endif ( )
else ( )
# R a w s t r i n g s : s a v e a s i s
set ( ${ yaml } "${${yaml}}${indent_${level}}${member}: ${subjson}\n" )
endif ( )
else ( )
# O t h e r J S O N d a t a t y p e - > Y A M L s c a l a r , a s - i s
set ( ${ yaml } "${${yaml}}${indent_${level}}${member}: ${subjson}\n" )
endif ( )
endforeach ( )