cmake: Add a helper script which defines generator rules for eo files

eo_rule_create adds rules to generate to .eo.x .eo.h .eot.h files.
It also monitors its deps.

@feature
This commit is contained in:
Marcel Hollerbach 2015-11-25 12:22:59 +01:00
parent 7b9bb510b4
commit 9218241da6
2 changed files with 82 additions and 1 deletions

View File

@ -297,7 +297,8 @@ cmakeconfig/EoConfigVersion.cmake
eolian_cmakeconfigdir = $(libdir)/cmake/Eolian/
eolian_cmakeconfig_DATA = \
cmakeconfig/EolianConfig.cmake \
cmakeconfig/EolianConfigVersion.cmake
cmakeconfig/EolianConfigVersion.cmake \
cmakeconfig/EolianHelper.cmake
eolian_cxx_cmakeconfigdir = $(libdir)/cmake/EolianCxx/
eolian_cxx_cmakeconfig_DATA = \

View File

@ -0,0 +1,80 @@
find_package(Eolian 1.16 REQUIRED)
# macro to create a eolian generated c source file
#
# macro adds a generate rule, which depends on the original file the rule will output file.x
#
# The passed include snippet will just be added to the command
macro(_rule_eox file include deps)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${file}.x
COMMAND eolian_gen ${include} --gc -o ${CMAKE_CURRENT_SOURCE_DIR}/${file}.x ${CMAKE_CURRENT_SOURCE_DIR}/${file}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file}
DEPENDS ${deps}
)
endmacro()
# macro to create a eolian generated header file
#
# other details are like the eox rule
macro(_rule_eoh file include deps)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${file}.h
COMMAND eolian_gen ${include} --gh -o ${CMAKE_CURRENT_SOURCE_DIR}/${file}.h ${CMAKE_CURRENT_SOURCE_DIR}/${file}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file}
DEPENDS ${deps}
)
endmacro()
# Can be used to create .eo.x , .eo.h, .eot.h generator rules.
# <file>.eo files are generated into <file>.eo.x and <file>.eo.h files
# <file>.eot files are generated into <file>.eot.h files
# The standard include path of efl eolian files is automatically added to the includes
#
# build_files - A list of files
# relative_include_dirs - A list of dirs to include
#
# If one of the included files is changed the file will be rebuilded at the next
# make call
#
# The macro scans for .eo files, hey have to be in the build_files.
# The generator rules are just executed if the file is a dependecy of some lib/executable.
function(eo_rule_create build_files relative_include_dirs)
string(REPLACE "\n" "" EOLIAN_EO_DIR_WITHOUT_NEWLINE "${EOLIAN_EO_DIR}")
# add std includes
list(APPEND include_dirs
${EOLIAN_EO_DIR_WITHOUT_NEWLINE}
)
# convert relative to absolut
foreach(relative_include_dir ${relative_include_dirs})
list(APPEND include_dirs
${CMAKE_CURRENT_SOURCE_DIR}/${relative_include_dir}
)
endforeach()
# work with the absolut paths
foreach(include_cmd ${include_dirs})
# build include cmd
string(CONCAT includes "${includes}" " -I${include_cmd}")
# fetch dep files
file(GLOB_RECURSE files "${include_cmd}/*.eo")
foreach(file ${files})
list(APPEND dep_files ${file})
endforeach()
endforeach()
string(REPLACE " " ";" includes "${includes}")
foreach(file ${build_files})
get_filename_component(ext ${file} EXT)
if (ext MATCHES "^\\.eo$")
_rule_eoh("${file}" "${includes}" "${dep_files}")
_rule_eox("${file}" "${includes}" "${dep_files}")
endif()
if (ext MATCHES "^\\.eot$")
_rule_eoh("${file}" "${includes}" "${dep_files}")
endif()
endforeach()
endfunction()