Skip to content

Commit 422f5d0

Browse files
author
Andres Sevillano
committed
cmake tool execution
1 parent 675bb07 commit 422f5d0

File tree

4 files changed

+74
-5
lines changed

4 files changed

+74
-5
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ project(${LOCAL_CMAKE_PROJECT_NAME} NONE)
66
### Specific configuration ###
77
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
88
message(STATUS "${LOCAL_CMAKE_PROJECT_NAME} cmake module path: ${CMAKE_MODULE_PATH}")
9-
find_package(DecoupleUserOutputRules)
9+
find_package(${LOCAL_CMAKE_PROJECT_NAME}Rules)
1010

1111
### Code ###
1212
add_subdirectory("src")

cmake/FindDecoupleUserOutputRules.cmake renamed to cmake/FindBoilerplateCodeDocRules.cmake

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ endif(DOXYGEN_FOUND)
7171
set(VERSION_VAR_NAME "${LOCAL_CMAKE_PROJECT_NAME}_VERSION")
7272
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/templates/version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/src/version.h @ONLY)
7373

74+
7475
####################################
7576
# build/install/pack instructions #
7677
####################################
@@ -119,6 +120,72 @@ set(${LOCAL_CMAKE_PROJECT_NAME}_STATIC_LIB "${CMAKE_CURRENT_BINARY_DIR}/${LOCAL_
119120
set(${LOCAL_CMAKE_PROJECT_NAME}_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${LOCAL_CMAKE_PROJECT_NAME}/include")
120121
set(LIB_SHARED_NAME "${LOCAL_CMAKE_PROJECT_NAME}")
121122
set(TEST_NAME "${LOCAL_CMAKE_PROJECT_NAME}_test")
123+
set(TOOL_NAME "${LOCAL_CMAKE_PROJECT_NAME}_tool")
124+
set(TOOL_INPUT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/json/schema.json")
125+
set(TOOL_CPP_OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${LOCAL_CMAKE_PROJECT_NAME}.h")
126+
set(TOOL_HTML_OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${LOCAL_CMAKE_PROJECT_NAME}.html")
127+
128+
###############################################
129+
# html & cpp code generation by external tool #
130+
###############################################
131+
function(locate_boilerplate_tool TOOL_NAME TOOL_DIR TOOL_SOURCE_DIR TOOL_INCLUDE_DIR TOOL_BINARY)
132+
set(TOOL_NAME_VAR "${TOOL_NAME}")
133+
set(TOOL_DIR_VAR "${TOOL_DIR}")
134+
set(TOOL_SOURCE_DIR_VAR "${TOOL_SOURCE_DIR}")
135+
set(TOOL_INCLUDE_DIR_VAR "${TOOL_INCLUDE_DIR}")
136+
find_program(TOOL_BINARY_VAR NAME ${TOOL_NAME_VAR} HINTS ${TOOL_DIR_VAR})
137+
if(NOT TOOL_BINARY_VAR)
138+
# time to build it in a very dirty way but fast!
139+
file(GLOB TOOL_SOURCE_FILES ${TOOL_SOURCE_DIR_VAR}/*.cpp)
140+
if(EXISTS ${TOOL_DIR_VAR})
141+
message(STATUS "Using tool directory: ${TOOL_DIR_VAR}")
142+
else()
143+
message(STATUS "Creating tool at directory: ${TOOL_DIR_VAR}")
144+
file(MAKE_DIRECTORY ${TOOL_DIR_VAR})
145+
endif()
146+
set(EXECUTE_COMMAND ${CMAKE_CXX_COMPILER} -v
147+
-o ${TOOL_DIR_VAR}/${TOOL_NAME_VAR}
148+
-I${TOOL_INCLUDE_DIR} -I${TOOL_SOURCE_DIR}/.
149+
${TOOL_SOURCE_FILES})
150+
execute_process(COMMAND ${EXECUTE_COMMAND} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} TIMEOUT 5
151+
RESULT_VARIABLE TOOL_BINARY_RESULT OUTPUT_VARIABLE TOOL_BINARY_OUTPUT ERROR_VARIABLE TOOL_BINARY_ERROR)
152+
find_program(TOOL_BINARY_VAR NAME ${TOOL_NAME_VAR} HINTS ${TOOL_DIR_VAR})
153+
endif()
154+
message(STATUS "Tool: ${TOOL_BINARY_VAR}")
155+
if(NOT TOOL_BINARY_VAR)
156+
message(STATUS "Tool name: ${TOOL_NAME_VAR}")
157+
message(STATUS "Tool dir: ${TOOL_DIR_VAR}")
158+
message(STATUS "Tool source dir: ${TOOL_SOURCE_DIR_VAR}")
159+
message(STATUS "Tool include dir: ${TOOL_INCLUDE_DIR_VAR}")
160+
message(STATUS "Tool binary generation: result<${TOOL_BINARY_RESULT}> output<${TOOL_BINARY_OUTPUT}> error<${TOOL_BINARY_ERROR}>")
161+
message(FATAL_ERROR "Unable to find or build ${TOOL_NAME_VAR} required to generate needed code")
162+
endif()
163+
set(${TOOL_BINARY} "${TOOL_BINARY_VAR}" PARENT_SCOPE)
164+
endfunction(locate_boilerplate_tool TOOL_NAME TOOL_DIR TOOL_BINARY)
165+
166+
## tool directory
167+
if(EXISTS ${TOOL_DIR})
168+
message(STATUS "Tool directory: ${TOOL_DIR}")
169+
else(EXISTS ${TOOL_DIR})
170+
if(EXISTS $ENV{JSONSCHEMA2CPP})
171+
set(TOOL_DIR "$ENV{JSONSCHEMA2CPP}")
172+
else()
173+
set(TOOL_DIR "${CMAKE_CURRENT_BINARY_DIR}/src")
174+
endif(EXISTS $ENV{JSONSCHEMA2CPP})
175+
endif(EXISTS ${TOOL_DIR})
176+
177+
## tool binary
178+
locate_boilerplate_tool(${TOOL_NAME} ${TOOL_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include" TOOL_BINARY)
179+
180+
## Now that tool is found or created, high time to use it!
181+
execute_process(COMMAND ${TOOL_BINARY} ${TOOL_INPUT_FILE} ${TOOL_HTML_OUTPUT_FILE} ${TOOL_CPP_OUTPUT_FILE} TIMEOUT 5
182+
RESULT_VARIABLE TOOL_BINARY_RESULT OUTPUT_VARIABLE TOOL_BINARY_OUTPUT ERROR_VARIABLE TOOL_BINARY_ERROR)
183+
if(TOOL_BINARY_RESULT)
184+
message(FATAL_ERROR "Unable to generated C++/HTML code")
185+
else()
186+
message(STATUS "Generated HTML: ${TOOL_HTML_OUTPUT_FILE}")
187+
message(STATUS "Generated C++: ${TOOL_CPP_OUTPUT_FILE}")
188+
endif()
122189

123190
### Install ###
124191
if(DEFINED ENV{INSTALL_PREFIX})

src/CMakeLists.txt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,18 @@ add_library(${LIB_STATIC_NAME} STATIC $<TARGET_OBJECTS:${LIB_OBJECT_NAME}>)
1212
#add_library(${LIB_SHARED_NAME} SHARED $<TARGET_OBJECTS:${LIB_OBJECT_NAME}>)
1313
#set_target_properties(${LIB_SHARED_NAME} PROPERTIES VERSION ${HUMAN_VERSION})
1414

15-
# binary
16-
add_executable(${LOCAL_CMAKE_PROJECT_NAME}_tool ${TOOL_SOURCES} ${LIB_SOURCES})
15+
# tool binary
16+
add_executable(${TOOL_NAME} ${TOOL_SOURCES})
17+
add_dependencies(${TOOL_NAME} ${LIB_STATIC_NAME})
18+
target_link_libraries(${TOOL_NAME} ${LIB_STATIC_NAME} ${STATIC_LIB_LINKER})
1719

1820
### Only if this the principal project ###
1921
if("${LOCAL_CMAKE_PROJECT_NAME}" STREQUAL "${CMAKE_PROJECT_NAME}")
2022

2123
### Install binaries ###
2224
install(TARGETS ${LIB_STATIC_NAME} ARCHIVE DESTINATION ${LIB_INSTALL_DIR})
2325
#install(TARGETS ${LIB_SHARED_NAME} LIBRARY DESTINATION ${LIB_INSTALL_DIR})
24-
install(TARGETS ${LOCAL_CMAKE_PROJECT_NAME}_tool RUNTIME DESTINATION ${LIB_INSTALL_DIR})
26+
install(TARGETS ${LOCAL_TOOL} RUNTIME DESTINATION ${LIB_INSTALL_DIR})
2527

2628
### Install headers ###
2729
file(GLOB HEADERS ../include/*.h)

test/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ if(Boost_FOUND)
1515
link_directories(${LIB_PATH} ${STATIC_LIB_PATH})
1616
add_executable(${TEST_NAME} ${SOURCES_MAIN} ${EXTRA_MAIN})
1717
add_dependencies(${TEST_NAME} ${LIB_STATIC_NAME} ${TEST_NAME}_data)
18-
target_link_libraries(${TEST_NAME} BoilerplateCodeDoc_static ${LIB_STATIC_NAME} ${STATIC_LIB_LINKER} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
18+
target_link_libraries(${TEST_NAME} ${LIB_STATIC_NAME} ${STATIC_LIB_LINKER} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
1919
add_test(UnitTest ${TEST_NAME})
2020

2121
install(TARGETS ${TEST_NAME} RUNTIME DESTINATION ${TEST_INSTALL_DIR})

0 commit comments

Comments
 (0)