diff --git a/cmake/xo_macros/xo_cxx.cmake b/cmake/xo_macros/xo_cxx.cmake index ba43b34e..182f1599 100644 --- a/cmake/xo_macros/xo_cxx.cmake +++ b/cmake/xo_macros/xo_cxx.cmake @@ -1646,14 +1646,17 @@ macro(xo_add_genfacet) REQUIRED) message(STATUS "GENFACET_EXECUTABLE=${GENFACET_EXECUTABLE}") + set(generatedFiles + ${GF_OUTPUT_HPP_DIR}/${FACET}.hpp + ${GF_OUTPUT_HPP_DIR}/${GF_OUTPUT_IMPL_SUBDIR}/A${FACET}.hpp + ${GF_OUTPUT_HPP_DIR}/${GF_OUTPUT_IMPL_SUBDIR}/I${FACET}_Any.hpp + ${GF_OUTPUT_HPP_DIR}/${GF_OUTPUT_IMPL_SUBDIR}/I${FACET}_Xfer.hpp + ${GF_OUTPUT_HPP_DIR}/${GF_OUTPUT_IMPL_SUBDIR}/R${FACET}.hpp + ${GF_OUTPUT_CPP_DIR}/I${FACET}_Any.cpp) + # Build the genfacet command add_custom_command( - OUTPUT ${GF_OUTPUT_HPP_DIR}/${FACET}.hpp - ${GF_OUTPUT_HPP_DIR}/${GF_OUTPUT_IMPL_SUBDIR}/A${FACET}.hpp - ${GF_OUTPUT_HPP_DIR}/${GF_OUTPUT_IMPL_SUBDIR}/I${FACET}_Any.hpp - ${GF_OUTPUT_HPP_DIR}/${GF_OUTPUT_IMPL_SUBDIR}/I${FACET}_Xfer.hpp - ${GF_OUTPUT_HPP_DIR}/${GF_OUTPUT_IMPL_SUBDIR}/R${FACET}.hpp - ${GF_OUTPUT_CPP_DIR}/I${FACET}_Any.cpp + OUTPUT $generatedFiles COMMAND ${GENFACET_EXECUTABLE} --input ${GF_INPUT} --output-hpp ${GF_OUTPUT_HPP_DIR} @@ -1666,7 +1669,50 @@ macro(xo_add_genfacet) ) # Create a target for this generation - add_custom_target(${GF_TARGET} - DEPENDS ${GF_GENERATED_FILES} - ) + add_custom_target(${GF_TARGET} DEPENDS ${generatedFiles}) +endmacro() + +macro(xo_add_genfacetimpl) + # Parse arguments + set(options "") + set(oneValueArgs + TARGET # Name for this generation target + FACET # facet name + REPR # representation name + INPUT # Input .json5 file + OUTPUT_HPP_DIR # Directory for .hpp files + OUTPUT_IMPL_SUBDIR # Subdirectory name for impl headers + OUTPUT_CPP_DIR # Directory for .cpp files + ) + set(multiValueArgs "") + + cmake_parse_arguments(GF "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + find_program(GENFACET_EXECUTABLE NAMES genfacet + HINTS ${CMAKE_SOURCE_DIR}/xo-facet/codegen + DOC "path to xo genfacet code generator" + REQUIRED) + message(STATUS "GENFACET_EXECUTABLE=${GENFACET_EXECUTABLE}") + + set(generatedFiles + ${GF_OUTPUT_HPP_DIR}/${FACET}.hpp + ${GF_OUTPUT_HPP_DIR}/${GF_OUTPUT_IMPL_SUBDIR}/I${FACET}_D${REPR}.hpp + ${GF_OUTPUT_CPP_DIR}/I${FACET}_D${REPR}.cpp) + + # Build the genfacet command + add_custom_command( + OUTPUT ${generatedFiles} + COMMAND ${GENFACET_EXECUTABLE} + --input ${GF_INPUT} + --output-hpp ${GF_OUTPUT_HPP_DIR} + --output-impl-hpp ${GF_OUTPUT_IMPL_SUBDIR} + --output-cpp ${GF_OUTPUT_CPP_DIR} + DEPENDS ${GF_INPUT} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Generating facet source files from ${GF_INPUT}" + VERBATIM + ) + + # Create a target for this generation + add_custom_target(${GF_TARGET} DEPENDS ${generatedFiles}) endmacro()