Skip to content

Commit 93e988c

Browse files
committed
Allow for autogen bypass, partial fix for #264 #252 #207, ref #303
Signed-off-by: Tim Paine <[email protected]>
1 parent 4a0a80c commit 93e988c

File tree

7 files changed

+757
-51
lines changed

7 files changed

+757
-51
lines changed

CMakeLists.txt

+21-13
Original file line numberDiff line numberDiff line change
@@ -242,26 +242,34 @@ function(csp_autogen MODULE_NAME DEST_FILENAME HEADER_NAME_OUTVAR SOURCE_NAME_OU
242242

243243
cmake_path(SET CSP_AUTOGEN_MODULE_PATH NORMALIZE "${CMAKE_SOURCE_DIR}/csp/build/csp_autogen.py")
244244
cmake_path(SET CSP_AUTOGEN_DESTINATION_FOLDER NORMALIZE "${CMAKE_CURRENT_BINARY_DIR}/csp_autogen")
245-
cmake_path(SET CSP_AUTOTGEN_CPP_OUT NORMALIZE "${CMAKE_CURRENT_BINARY_DIR}/csp_autogen/${DEST_FILENAME}.cpp")
246-
cmake_path(SET CSP_AUTOTGEN_H_OUT NORMALIZE "${CMAKE_CURRENT_BINARY_DIR}/csp_autogen/${DEST_FILENAME}.h")
245+
cmake_path(SET CSP_AUTOGEN_CPP_OUT NORMALIZE "${CMAKE_CURRENT_BINARY_DIR}/csp_autogen/${DEST_FILENAME}.cpp")
246+
cmake_path(SET CSP_AUTOGEN_CPP_MAYBE_EXISTING NORMALIZE "${CMAKE_CURRENT_SOURCE_DIR}/csp_autogen/${DEST_FILENAME}.cpp")
247+
cmake_path(SET CSP_AUTOGEN_H_OUT NORMALIZE "${CMAKE_CURRENT_BINARY_DIR}/csp_autogen/${DEST_FILENAME}.h")
248+
cmake_path(SET CSP_AUTOGEN_H_MAYBE_EXISTING NORMALIZE "${CMAKE_CURRENT_SOURCE_DIR}/csp_autogen/${DEST_FILENAME}.h")
247249

248250
if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
249251
set(CSP_AUTOGEN_PYTHONPATH ${PROJECT_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE};${CMAKE_SOURCE_DIR};%PYTHONPATH% )
250252
else()
251253
set(CSP_AUTOGEN_PYTHONPATH ${PROJECT_BINARY_DIR}/lib:${CMAKE_SOURCE_DIR}:$$PYTHONPATH )
252254
endif()
253255

254-
add_custom_command(OUTPUT "${CSP_AUTOTGEN_CPP_OUT}" "${CSP_AUTOTGEN_H_OUT}"
255-
COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${CSP_AUTOGEN_PYTHONPATH}" ${Python_EXECUTABLE} ${CSP_AUTOGEN_MODULE_PATH} -m ${MODULE_NAME} -d ${CSP_AUTOGEN_DESTINATION_FOLDER} -o ${DEST_FILENAME} ${CSP_AUTOGEN_EXTRA_ARGS}
256-
COMMENT "generating csp c++ types from module ${MODULE_NAME}"
257-
DEPENDS mkdir_autogen_${MODULE_NAME}
258-
${CMAKE_SOURCE_DIR}/csp/build/csp_autogen.py
259-
${CMAKE_SOURCE_DIR}/${MODULE_FILENAME}
260-
csptypesimpl
261-
)
262-
263-
set(${SOURCE_NAME_OUTVAR} "${CMAKE_CURRENT_BINARY_DIR}/csp_autogen/${DEST_FILENAME}.cpp" PARENT_SCOPE )
264-
set(${HEADER_NAME_OUTVAR} "${CMAKE_CURRENT_BINARY_DIR}/csp_autogen/${DEST_FILENAME}.h" PARENT_SCOPE )
256+
if (EXISTS "${CSP_AUTOGEN_CPP_MAYBE_EXISTING}" AND EXISTS "${CSP_AUTOGEN_H_MAYBE_EXISTING}")
257+
# Files exist in-source
258+
set(${SOURCE_NAME_OUTVAR} "${CSP_AUTOGEN_CPP_MAYBE_EXISTING}" PARENT_SCOPE )
259+
set(${HEADER_NAME_OUTVAR} "${CSP_AUTOGEN_H_MAYBE_EXISTING}" PARENT_SCOPE )
260+
else()
261+
add_custom_command(OUTPUT "${CSP_AUTOGEN_CPP_OUT}" "${CSP_AUTOGEN_H_OUT}"
262+
COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${CSP_AUTOGEN_PYTHONPATH}" ${Python_EXECUTABLE} ${CSP_AUTOGEN_MODULE_PATH} -m ${MODULE_NAME} -d ${CSP_AUTOGEN_DESTINATION_FOLDER} -o ${DEST_FILENAME} ${CSP_AUTOGEN_EXTRA_ARGS}
263+
COMMENT "generating csp c++ types from module ${MODULE_NAME}"
264+
DEPENDS mkdir_autogen_${MODULE_NAME}
265+
${CMAKE_SOURCE_DIR}/csp/build/csp_autogen.py
266+
${CMAKE_SOURCE_DIR}/${MODULE_FILENAME}
267+
csptypesimpl
268+
)
269+
270+
set(${SOURCE_NAME_OUTVAR} "${CSP_AUTOGEN_CPP_OUT}" PARENT_SCOPE )
271+
set(${HEADER_NAME_OUTVAR} "${CSP_AUTOGEN_H_OUT}" PARENT_SCOPE )
272+
endif()
265273
endfunction()
266274

267275

cpp/cmake/modules/Findcsp_autogen.cmake

+20-12
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,32 @@ function(csp_autogen MODULE_NAME DEST_FILENAME HEADER_NAME_OUTVAR SOURCE_NAME_OU
1515

1616
cmake_path(SET CSP_AUTOGEN_MODULE_PATH NORMALIZE "${CMAKE_SOURCE_DIR}/csp/build/csp_autogen.py")
1717
cmake_path(SET CSP_AUTOGEN_DESTINATION_FOLDER NORMALIZE "${CMAKE_CURRENT_BINARY_DIR}/csp_autogen")
18-
cmake_path(SET CSP_AUTOTGEN_CPP_OUT NORMALIZE "${CMAKE_CURRENT_BINARY_DIR}/csp_autogen/${DEST_FILENAME}.cpp")
19-
cmake_path(SET CSP_AUTOTGEN_H_OUT NORMALIZE "${CMAKE_CURRENT_BINARY_DIR}/csp_autogen/${DEST_FILENAME}.h")
18+
cmake_path(SET CSP_AUTOGEN_CPP_OUT NORMALIZE "${CMAKE_CURRENT_BINARY_DIR}/csp_autogen/${DEST_FILENAME}.cpp")
19+
cmake_path(SET CSP_AUTOGEN_CPP_MAYBE_EXISTING NORMALIZE "${CMAKE_CURRENT_SOURCE_DIR}/csp_autogen/${DEST_FILENAME}.cpp")
20+
cmake_path(SET CSP_AUTOGEN_H_OUT NORMALIZE "${CMAKE_CURRENT_BINARY_DIR}/csp_autogen/${DEST_FILENAME}.h")
21+
cmake_path(SET CSP_AUTOGEN_H_MAYBE_EXISTING NORMALIZE "${CMAKE_CURRENT_SOURCE_DIR}/csp_autogen/${DEST_FILENAME}.h")
2022

2123
if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
2224
set(CSP_AUTOGEN_PYTHONPATH ${PROJECT_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE};${CMAKE_SOURCE_DIR};%PYTHONPATH% )
2325
else()
2426
set(CSP_AUTOGEN_PYTHONPATH ${PROJECT_BINARY_DIR}/lib:${CMAKE_SOURCE_DIR}:$$PYTHONPATH )
2527
endif()
2628

27-
add_custom_command(OUTPUT "${CSP_AUTOTGEN_CPP_OUT}" "${CSP_AUTOTGEN_H_OUT}"
28-
COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${CSP_AUTOGEN_PYTHONPATH}" ${Python_EXECUTABLE} ${CSP_AUTOGEN_MODULE_PATH} -m ${MODULE_NAME} -d ${CSP_AUTOGEN_DESTINATION_FOLDER} -o ${DEST_FILENAME} ${CSP_AUTOGEN_EXTRA_ARGS}
29-
COMMENT "generating csp c++ types from module ${MODULE_NAME}"
30-
DEPENDS mkdir_autogen_${MODULE_NAME}
31-
${CMAKE_SOURCE_DIR}/csp/build/csp_autogen.py
32-
${CMAKE_SOURCE_DIR}/${MODULE_FILENAME}
33-
csptypesimpl
34-
)
29+
if (EXISTS "${CSP_AUTOGEN_CPP_MAYBE_EXISTING}" AND EXISTS "${CSP_AUTOGEN_H_MAYBE_EXISTING}")
30+
# Files exist in-source
31+
set(${SOURCE_NAME_OUTVAR} "${CSP_AUTOGEN_CPP_MAYBE_EXISTING}" PARENT_SCOPE )
32+
set(${HEADER_NAME_OUTVAR} "${CSP_AUTOGEN_H_MAYBE_EXISTING}" PARENT_SCOPE )
33+
else()
34+
add_custom_command(OUTPUT "${CSP_AUTOGEN_CPP_OUT}" "${CSP_AUTOGEN_H_OUT}"
35+
COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${CSP_AUTOGEN_PYTHONPATH}" ${Python_EXECUTABLE} ${CSP_AUTOGEN_MODULE_PATH} -m ${MODULE_NAME} -d ${CSP_AUTOGEN_DESTINATION_FOLDER} -o ${DEST_FILENAME} ${CSP_AUTOGEN_EXTRA_ARGS}
36+
COMMENT "generating csp c++ types from module ${MODULE_NAME}"
37+
DEPENDS mkdir_autogen_${MODULE_NAME}
38+
${CMAKE_SOURCE_DIR}/csp/build/csp_autogen.py
39+
${CMAKE_SOURCE_DIR}/${MODULE_FILENAME}
40+
csptypesimpl
41+
)
3542

36-
set(${SOURCE_NAME_OUTVAR} "${CMAKE_CURRENT_BINARY_DIR}/csp_autogen/${DEST_FILENAME}.cpp" PARENT_SCOPE )
37-
set(${HEADER_NAME_OUTVAR} "${CMAKE_CURRENT_BINARY_DIR}/csp_autogen/${DEST_FILENAME}.h" PARENT_SCOPE )
43+
set(${SOURCE_NAME_OUTVAR} "${CSP_AUTOGEN_CPP_OUT}" PARENT_SCOPE )
44+
set(${HEADER_NAME_OUTVAR} "${CSP_AUTOGEN_H_OUT}" PARENT_SCOPE )
45+
endif()
3846
endfunction()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
2+
// AUTOGENERATED BY CSP_AUTOGEN
3+
// DO NOT MODIFY DIRECTLY
4+
// command: python csp/build/csp_autogen.py -m csp.adapters.websocket_types -d cpp/csp/adapters/websocket/csp_autogen/ -o websocket_types
5+
6+
#include "websocket_types.h"
7+
#include <csp/python/Common.h>
8+
#include <csp/python/PyStruct.h>
9+
#include <csp/python/PyCspEnum.h>
10+
#include <iostream>
11+
#include <stdlib.h>
12+
#include <Python.h>
13+
14+
namespace csp::autogen
15+
{
16+
17+
#define _offsetof( C, M ) ( ( char * ) &( ( C * ) nullptr ) -> M - ( char * ) 0 )
18+
19+
static void assert_or_die( bool assertion, const char * error )
20+
{
21+
if( !assertion )
22+
{
23+
std::cerr << "Fatal error on import of " << __FILE__ << ": " << error << std::endl;
24+
if( PyErr_Occurred() )
25+
PyErr_Print();
26+
abort();
27+
}
28+
}
29+
30+
31+
bool WebsocketStatus::static_init()
32+
{
33+
if( Py_IsInitialized() )
34+
{
35+
csp::python::AcquireGIL gil;
36+
37+
// initialize EnumMeta from python type if we're in python
38+
PyObject * pymodule = PyImport_ImportModule( "csp.adapters.websocket_types" );
39+
assert_or_die( pymodule != nullptr, "failed to import struct module csp.adapters.websocket_types" );
40+
41+
PyObject * enumType = PyObject_GetAttrString(pymodule, "WebsocketStatus" );
42+
assert_or_die( enumType != nullptr, "failed to find num type WebsocketStatus in module csp.adapters.websocket_types" );
43+
44+
// should add some assertion here..
45+
csp::python::PyCspEnumMeta * pymeta = ( csp::python::PyCspEnumMeta * ) enumType;
46+
s_meta = pymeta -> enumMeta;
47+
}
48+
49+
return true;
50+
}
51+
52+
bool static_init_WebsocketStatus = WebsocketStatus::static_init();
53+
std::shared_ptr<csp::CspEnumMeta> WebsocketStatus::s_meta;
54+
WebsocketStatus WebsocketStatus::ACTIVE = WebsocketStatus::create("ACTIVE");
55+
WebsocketStatus WebsocketStatus::GENERIC_ERROR = WebsocketStatus::create("GENERIC_ERROR");
56+
WebsocketStatus WebsocketStatus::CONNECTION_FAILED = WebsocketStatus::create("CONNECTION_FAILED");
57+
WebsocketStatus WebsocketStatus::CLOSED = WebsocketStatus::create("CLOSED");
58+
WebsocketStatus WebsocketStatus::MESSAGE_SEND_FAIL = WebsocketStatus::create("MESSAGE_SEND_FAIL");
59+
60+
61+
bool WebsocketHeaderUpdate::static_init()
62+
{
63+
64+
if( Py_IsInitialized() )
65+
{
66+
//Note that windows requires we grab the GIL since the windows DLL loading code releases GIL
67+
csp::python::AcquireGIL gil;
68+
69+
// initialize StructMeta from python type if we're in python
70+
PyObject * pymodule = PyImport_ImportModule( "csp.adapters.websocket_types" );
71+
assert_or_die( pymodule != nullptr, "failed to import struct module csp.adapters.websocket_types" );
72+
73+
PyObject * structType = PyObject_GetAttrString(pymodule, "WebsocketHeaderUpdate" );
74+
assert_or_die( structType != nullptr, "failed to find struct type WebsocketHeaderUpdate in module csp.adapters.websocket_types" );
75+
76+
// should add some assertion here..
77+
csp::python::PyStructMeta * pymeta = ( csp::python::PyStructMeta * ) structType;
78+
s_meta = pymeta -> structMeta;
79+
}
80+
81+
return true;
82+
}
83+
84+
bool static_init_WebsocketHeaderUpdate = WebsocketHeaderUpdate::static_init();
85+
csp::StructMetaPtr WebsocketHeaderUpdate::s_meta;
86+
87+
}

0 commit comments

Comments
 (0)