Skip to content

Commit b16f482

Browse files
committed
Encapsulate code gen in reusable cmake functions
1 parent 230f368 commit b16f482

File tree

127 files changed

+404
-389
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

127 files changed

+404
-389
lines changed

cmake/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ write_basic_package_version_file(${PROJECT_NAME}-config-version.cmake COMPATIBIL
1010
install(FILES
1111
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}-config.cmake
1212
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
13+
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}-functions.cmake
14+
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}-update-schema-files.cmake
1315
DESTINATION ${GRAPHQL_INSTALL_CMAKE_DIR}/${PROJECT_NAME})

cmake/cppgraphqlgen-config.cmake

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
cppgraphqlgen
66
-------------
77
8-
The following import targets are created
8+
The following import targets are created:
99
1010
::
1111
@@ -15,8 +15,18 @@ The following import targets are created
1515
cppgraphqlgen::graphqlintrospection
1616
cppgraphqlgen::graphqljson
1717
cppgraphqlgen::schemagen
18+
cppgraphqlgen::clientgen
19+
20+
The following functions are defined to help with code generation and build targets:
21+
22+
::
23+
24+
update_graphql_schema_files
25+
add_graphql_schema_target
26+
add_graphql_schema_no_introspection_target
1827
#]=======================================================================]
1928

2029
include(CMakeFindDependencyMacro)
2130
find_package(Threads REQUIRED)
2231
include("${CMAKE_CURRENT_LIST_DIR}/cppgraphqlgen-targets.cmake")
32+
include("${CMAKE_CURRENT_LIST_DIR}/cppgraphqlgen-functions.cmake")

cmake/cppgraphqlgen-functions.cmake

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Copyright (c) Microsoft Corporation. All rights reserved.
2+
# Licensed under the MIT License.
3+
4+
get_filename_component(GRAPHQL_UPDATE_SCHEMA_FILES_SCRIPT
5+
"${CMAKE_CURRENT_LIST_DIR}/cppgraphqlgen-update-schema-files.cmake"
6+
ABSOLUTE)
7+
8+
function(update_graphql_schema_files SCHEMA_TARGET SCHEMA_GRAPHQL SCHEMA_PREFIX SCHEMA_NAMESPACE)
9+
set_property(DIRECTORY APPEND
10+
PROPERTY CMAKE_CONFIGURE_DEPENDS ${SCHEMA_TARGET}_schema_files)
11+
12+
# Collect optional arguments
13+
set(ADDITIONAL_SCHEMAGEN_ARGS "")
14+
if(ARGC GREATER 4)
15+
math(EXPR LAST_ARG "${ARGC} - 1")
16+
foreach(ARGN RANGE 4 ${LAST_ARG})
17+
set(NEXT_ARG "${ARGV${ARGN}}")
18+
list(APPEND ADDITIONAL_SCHEMAGEN_ARGS "${NEXT_ARG}")
19+
endforeach()
20+
endif()
21+
22+
add_custom_command(
23+
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${SCHEMA_TARGET}_schema_files
24+
COMMAND
25+
${CMAKE_COMMAND} "-DSCHEMA_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
26+
"-DSCHEMA_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
27+
"-DSCHEMAGEN_PROGRAM=$<TARGET_FILE:cppgraphqlgen::schemagen>"
28+
"-DSCHEMA_TARGET=${SCHEMA_TARGET}" "-DSCHEMA_GRAPHQL=${SCHEMA_GRAPHQL}"
29+
"-DSCHEMA_PREFIX=${SCHEMA_PREFIX}" "-DSCHEMA_NAMESPACE=${SCHEMA_NAMESPACE}"
30+
"-DADDITIONAL_SCHEMAGEN_ARGS=${ADDITIONAL_SCHEMAGEN_ARGS}"
31+
-P ${GRAPHQL_UPDATE_SCHEMA_FILES_SCRIPT}
32+
DEPENDS ${SCHEMA_GRAPHQL} ${GRAPHQL_UPDATE_SCHEMA_FILES_SCRIPT}
33+
COMMENT "Generating ${SCHEMA_TARGET} GraphQL schema"
34+
VERBATIM)
35+
endfunction()
36+
37+
function(add_graphql_schema_target SCHEMA_TARGET)
38+
add_custom_target(${SCHEMA_TARGET}_update_schema ALL
39+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SCHEMA_TARGET}_schema_files)
40+
41+
file(STRINGS ${SCHEMA_TARGET}_schema_files SCHEMA_FILES)
42+
add_library(${SCHEMA_TARGET}_schema STATIC ${SCHEMA_FILES})
43+
add_dependencies(${SCHEMA_TARGET}_schema ${SCHEMA_TARGET}_update_schema)
44+
target_include_directories(${SCHEMA_TARGET}_schema PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
45+
target_link_libraries(${SCHEMA_TARGET}_schema PUBLIC cppgraphqlgen::graphqlintrospection)
46+
endfunction()
47+
48+
function(add_graphql_schema_no_introspection_target SCHEMA_NO_INTROSPECTION_TARGET)
49+
add_custom_target(${SCHEMA_NO_INTROSPECTION_TARGET}_update_schema ALL
50+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SCHEMA_NO_INTROSPECTION_TARGET}_schema_files)
51+
52+
file(STRINGS ${SCHEMA_NO_INTROSPECTION_TARGET}_schema_files SCHEMA_FILES)
53+
add_library(${SCHEMA_NO_INTROSPECTION_TARGET}_schema STATIC ${SCHEMA_FILES})
54+
add_dependencies(${SCHEMA_NO_INTROSPECTION_TARGET}_schema ${SCHEMA_NO_INTROSPECTION_TARGET}_update_schema)
55+
target_include_directories(${SCHEMA_NO_INTROSPECTION_TARGET}_schema PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
56+
target_link_libraries(${SCHEMA_NO_INTROSPECTION_TARGET}_schema PUBLIC cppgraphqlgen::graphqlservice)
57+
endfunction()
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Copyright (c) Microsoft Corporation. All rights reserved.
2+
# Licensed under the MIT License.
3+
4+
# Normalize the filesystem paths
5+
get_filename_component(SCHEMA_SOURCE_DIR ${SCHEMA_SOURCE_DIR} ABSOLUTE)
6+
get_filename_component(SCHEMA_BINARY_DIR ${SCHEMA_BINARY_DIR} ABSOLUTE)
7+
get_filename_component(SCHEMAGEN_PROGRAM ${SCHEMAGEN_PROGRAM} ABSOLUTE)
8+
get_filename_component(SCHEMA_GRAPHQL "${SCHEMA_SOURCE_DIR}/${SCHEMA_GRAPHQL}" ABSOLUTE)
9+
10+
file(MAKE_DIRECTORY ${SCHEMA_BINARY_DIR})
11+
12+
# Cleanup all of the stale files in the binary directory
13+
file(GLOB PREVIOUS_FILES ${SCHEMA_BINARY_DIR}/*.h ${SCHEMA_BINARY_DIR}/*.cpp
14+
${SCHEMA_BINARY_DIR}/${SCHEMA_TARGET}_schema_files)
15+
foreach(PREVIOUS_FILE ${PREVIOUS_FILES})
16+
file(REMOVE ${PREVIOUS_FILE})
17+
endforeach()
18+
19+
set(SCHEMAGEN_ARGS "--schema=${SCHEMA_GRAPHQL}" "--prefix=${SCHEMA_PREFIX}" "--namespace=${SCHEMA_NAMESPACE}")
20+
foreach(SCHEMAGEN_ARG ${ADDITIONAL_SCHEMAGEN_ARGS})
21+
list(APPEND SCHEMAGEN_ARGS ${SCHEMAGEN_ARG})
22+
endforeach()
23+
24+
# Regenerate the sources in the binary directory
25+
execute_process(
26+
COMMAND ${SCHEMAGEN_PROGRAM} ${SCHEMAGEN_ARGS}
27+
OUTPUT_FILE ${SCHEMA_TARGET}_schema_files
28+
WORKING_DIRECTORY ${SCHEMA_BINARY_DIR})
29+
30+
# Get the up-to-date list of files in the binary directory
31+
set(FILE_NAMES "")
32+
file(GLOB NEW_FILES ${SCHEMA_BINARY_DIR}/*.h ${SCHEMA_BINARY_DIR}/*.cpp)
33+
foreach(NEW_FILE ${NEW_FILES})
34+
get_filename_component(NEW_FILE ${NEW_FILE} NAME)
35+
list(APPEND FILE_NAMES "${NEW_FILE}")
36+
endforeach()
37+
38+
# Don't update the files in the source directory if no files were generated in the binary directory.
39+
if(NOT FILE_NAMES)
40+
message(FATAL_ERROR "Schema generation failed!")
41+
endif()
42+
43+
# Remove stale files in the source directory
44+
cmake_policy(SET CMP0057 NEW)
45+
file(GLOB OLD_FILES ${SCHEMA_SOURCE_DIR}/*.h ${SCHEMA_SOURCE_DIR}/*.cpp)
46+
foreach(OLD_FILE ${OLD_FILES})
47+
get_filename_component(OLD_FILE ${OLD_FILE} NAME)
48+
if(NOT OLD_FILE IN_LIST FILE_NAMES)
49+
file(REMOVE "${SCHEMA_SOURCE_DIR}/${OLD_FILE}")
50+
endif()
51+
endforeach()
52+
53+
# Copy new and modified files from the binary directory to the source directory
54+
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
55+
${SCHEMA_BINARY_DIR}/${SCHEMA_TARGET}_schema_files
56+
${NEW_FILES}
57+
${SCHEMA_SOURCE_DIR})

0 commit comments

Comments
 (0)