diff --git a/cmake/TupleTreeGenerator.cmake b/cmake/TupleTreeGenerator.cmake index 460368357..363a4d3d2 100644 --- a/cmake/TupleTreeGenerator.cmake +++ b/cmake/TupleTreeGenerator.cmake @@ -230,3 +230,63 @@ function(tuple_tree_generator_generate_jsonschema DEPENDS "${YAML_DEFINITIONS}" ${TUPLE_TREE_GENERATOR_SOURCES} ) endfunction() + +function( + target_tuple_tree_and_schema_generate + HEADER_DIRECTORY + NAMESPACE + SCHEMA_PATH + TARGET_ID + JSONSCHEMA_PATH + JSONSCHEMA_ROOT_TYPE + STRING_TYPES + SEPARATE_STRING_TYPES + ) + +# Generate C++ headers from the collected YAML +set(OUTPUT_DIR "${CMAKE_BINARY_DIR}/include/revng/${HEADER_DIRECTORY}/Generated") +tuple_tree_generator( + generate-${TARGET_ID}-tuple-tree-code + "${ARGN}" + TUPLE-TREE-YAML + ${NAMESPACE} + "${SCHEMA_PATH}" + "${OUTPUT_DIR}" + "revng/${HEADER_DIRECTORY}" + GENERATED_HEADERS + GENERATED_IMPLS + "${JSONSCHEMA_PATH}" + ${JSONSCHEMA_ROOT_TYPE} + "${STRING_TYPES}" + "${SEPARATE_STRING_TYPES}" +) + +install( + DIRECTORY ${OUTPUT_DIR} + DESTINATION include/revng/${HEADER_DIRECTORY} +) + +target_sources(${TARGET_ID} PRIVATE ${GENERATED_IMPLS}) + +add_dependencies(${TARGET_ID} generate-${TARGET_ID}-tuple-tree-code) + +endfunction() + +function( + target_tuple_tree_generate + HEADER_DIRECTORY + NAMESPACE + SCHEMA_PATH + TARGET_ID + ) + target_tuple_tree_and_schema_generate( + ${HEADER_DIRECTORY} + ${NAMESPACE} + ${SCHEMA_PATH} + ${TARGET_ID} + "" + ${TARGET_ID}_schema + "" + "" + "${ARGN}") +endfunction() diff --git a/lib/Model/CMakeLists.txt b/lib/Model/CMakeLists.txt index aedd04c9b..0629ccfcb 100644 --- a/lib/Model/CMakeLists.txt +++ b/lib/Model/CMakeLists.txt @@ -2,9 +2,31 @@ # This file is distributed under the MIT License. See LICENSE.md for details. # +# Define revngModel library +revng_add_analyses_library_internal( + revngModel + Binary.cpp + LoadModelPass.cpp + Processing.cpp + SerializeModelPass.cpp + Type.cpp +) + +target_link_libraries(revngModel revngSupport) + # Header files containing model YAML must be added here set(MODEL_HEADERS_DIR "${CMAKE_SOURCE_DIR}/include/revng/Model") -set(MODEL_HEADERS +set(SCHEMA_PATH "${CMAKE_BINARY_DIR}/model-schema.yml") +set(JSONSCHEMA_PATH "${CMAKE_BINARY_DIR}/model-jsonschema.yml") +target_tuple_tree_and_schema_generate( + Model + model + ${SCHEMA_PATH} + revngModel + "${JSONSCHEMA_PATH}" + Binary + "Identifier" + "MetaAddress" "${MODEL_HEADERS_DIR}/CABIFunctionType.h" "${MODEL_HEADERS_DIR}/EnumType.h" "${MODEL_HEADERS_DIR}/PrimitiveType.h" @@ -40,43 +62,4 @@ set(MODEL_HEADERS "${MODEL_HEADERS_DIR}/UnionField.h" ) -# Generate C++ headers from the collected YAML -set(HEADERS_DIR "${CMAKE_BINARY_DIR}/include/revng/Model/Generated") -set(SCHEMA_PATH "${CMAKE_BINARY_DIR}/model-schema.yml") -set(JSONSCHEMA_PATH "${CMAKE_BINARY_DIR}/model-jsonschema.yml") -tuple_tree_generator( - generate-model-tuple-tree-code - "${MODEL_HEADERS}" - TUPLE-TREE-YAML - model - "${SCHEMA_PATH}" - "${HEADERS_DIR}" - "revng/Model" - GENERATED_HEADERS - GENERATED_IMPLS - "${JSONSCHEMA_PATH}" - Binary - "Identifier" - "MetaAddress" -) - -install( - DIRECTORY ${HEADERS_DIR} - DESTINATION include/revng/Model -) - -# Define revngModel library -revng_add_analyses_library_internal( - revngModel - Binary.cpp - LoadModelPass.cpp - Processing.cpp - SerializeModelPass.cpp - Type.cpp - ${GENERATED_IMPLS} -) - -target_link_libraries(revngModel revngSupport) -add_dependencies(revngModel generate-model-tuple-tree-code) - add_subdirectory(Pass) diff --git a/lib/Support/CMakeLists.txt b/lib/Support/CMakeLists.txt index 910b89507..b954a30c8 100644 --- a/lib/Support/CMakeLists.txt +++ b/lib/Support/CMakeLists.txt @@ -33,4 +33,4 @@ target_include_directories(revngSupport # on support and would generate a cyclic dependency. # # TODO: drop dependency from model in revng.h -add_dependencies(revngSupport generate-model-tuple-tree-code) +add_dependencies(revngSupport generate-revngModel-tuple-tree-code) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index b17f20a82..86ec3bf34 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -72,7 +72,7 @@ add_custom_command( --target-python-version 3.6 --input "${MODEL_JSONSCHEMA_PATH}" > "${CMAKE_BINARY_DIR}/lib/python/${PYTHON_GENERATED_MODEL_PATH}" - DEPENDS generate-model-tuple-tree-code + DEPENDS generate-revngModel-tuple-tree-code ) add_custom_target(python-model-generated DEPENDS "${CMAKE_BINARY_DIR}/lib/python/${PYTHON_GENERATED_MODEL_PATH}") add_dependencies(revng-lift python-model-generated)