[TCPIP] Fix bugcheck when using fragmented datagrams
[reactos.git] / sdk / cmake / widl-support.cmake
1
2 #idl files support
3 if(ARCH STREQUAL "i386")
4 set(IDL_FLAGS -m32 --win32)
5 elseif(ARCH STREQUAL "amd64")
6 set(IDL_FLAGS -m64 --win64)
7 else()
8 set(IDL_FLAGS "")
9 endif()
10
11 function(add_typelib)
12 get_includes(INCLUDES)
13 get_defines(DEFINES)
14 foreach(FILE ${ARGN})
15 if(${FILE} STREQUAL "std_ole_v1.idl")
16 set(IDL_FLAGS ${IDL_FLAGS} --oldtlb)
17 endif()
18 get_filename_component(NAME ${FILE} NAME_WE)
19 add_custom_command(
20 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.tlb
21 COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} -t -o ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.tlb ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}
22 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} native-widl)
23 list(APPEND OBJECTS ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.tlb)
24 endforeach()
25 endfunction()
26
27 function(add_idl_headers TARGET)
28 get_includes(INCLUDES)
29 get_defines(DEFINES)
30 foreach(FILE ${ARGN})
31 get_filename_component(NAME ${FILE} NAME_WE)
32 set(HEADER ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.h)
33 add_custom_command(
34 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.h
35 COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} -h -o ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.h ${FILE}
36 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} native-widl
37 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
38 list(APPEND HEADERS ${HEADER})
39 endforeach()
40 add_custom_target(${TARGET} DEPENDS ${HEADERS})
41 endfunction()
42
43 function(add_rpcproxy_files)
44 get_includes(INCLUDES)
45 get_defines(DEFINES)
46
47 foreach(FILE ${ARGN})
48 get_filename_component(NAME ${FILE} NAME_WE)
49 # Most proxy idl's have names like <proxyname>_<original>.idl
50 # We use this to create a dependency from the proxy to the original idl
51 string(REPLACE "_" ";" SPLIT_FILE ${FILE})
52 list(LENGTH SPLIT_FILE len)
53 unset(EXTRA_DEP)
54 if(len STREQUAL "2")
55 list(GET SPLIT_FILE 1 SPLIT_FILE)
56 if(EXISTS "${REACTOS_SOURCE_DIR}/sdk/include/psdk/${SPLIT_FILE}")
57 set(EXTRA_DEP ${REACTOS_SOURCE_DIR}/sdk/include/psdk/${SPLIT_FILE})
58 endif()
59 endif()
60 list(APPEND IDLS ${FILE})
61 list(APPEND IDL_DEPS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} ${EXTRA_DEP})
62 add_custom_command(
63 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.c ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.h
64 # We generate the two files in two passes because WIDL accepts only one custom file name as output
65 COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} -p -o ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.c -H ${NAME}_p.h ${FILE}
66 COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} -h -o ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.h ${FILE}
67 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} ${EXTRA_DEP} native-widl
68 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
69 endforeach()
70
71 # Extra pass to generate dlldata
72 add_custom_command(
73 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c
74 COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} --dlldata-only -o ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c ${IDLS}
75 DEPENDS ${IDL_DEPS} native-widl
76 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
77 endfunction()
78
79 function(add_rpc_files __type)
80 get_includes(INCLUDES)
81 get_defines(DEFINES)
82 set(__additional_flags -Oif)
83 # Is it a client or server module?
84 if(__type STREQUAL "server")
85 set(__server_client -s)
86 set(__suffix _s)
87 elseif(__type STREQUAL "client")
88 set(__server_client -c)
89 set(__suffix _c)
90 else()
91 message(FATAL_ERROR "Please pass either server or client as argument to add_rpc_files")
92 endif()
93 foreach(FILE ${ARGN})
94 get_filename_component(__name ${FILE} NAME_WE)
95 set(__name ${__name}${__suffix})
96 add_custom_command(
97 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${__name}.c ${CMAKE_CURRENT_BINARY_DIR}/${__name}.h
98 # We generate the two files in two passes because WIDL accepts only one custom file name as output
99 COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} ${__additional_flags} ${__server_client} -o ${CMAKE_CURRENT_BINARY_DIR}/${__name}.c -H ${__name}.h ${FILE}
100 COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} ${__additional_flags} -h -o ${CMAKE_CURRENT_BINARY_DIR}/${__name}.h ${FILE}
101 DEPENDS ${FILE} native-widl
102 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
103 endforeach()
104 endfunction()
105
106 function(generate_idl_iids)
107 foreach(IDL_FILE ${ARGN})
108 get_filename_component(FILE ${IDL_FILE} NAME)
109 get_includes(INCLUDES)
110 get_defines(DEFINES)
111 get_filename_component(NAME ${IDL_FILE} NAME_WE)
112 add_custom_command(
113 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c
114 COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} -u -o ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c ${IDL_FILE}
115 DEPENDS ${IDL_FILE_FULL} native-widl
116 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
117 endforeach()
118 endfunction()
119
120 function(add_iid_library TARGET)
121 foreach(IDL_FILE ${ARGN})
122 get_filename_component(NAME ${IDL_FILE} NAME_WE)
123 generate_idl_iids(${IDL_FILE})
124 list(APPEND IID_SOURCES ${NAME}_i.c)
125 endforeach()
126 add_library(${TARGET} ${IID_SOURCES})
127 add_dependencies(${TARGET} psdk)
128 set_target_properties(${TARGET} PROPERTIES EXCLUDE_FROM_ALL TRUE)
129 endfunction()
130
131 function(add_idl_reg_script IDL_FILE)
132 get_includes(INCLUDES)
133 get_defines(DEFINES)
134 get_filename_component(NAME ${IDL_FILE} NAME_WE)
135 add_custom_command(
136 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_r.res
137 COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} -r -o ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_r.res ${IDL_FILE}
138 DEPENDS ${IDL_FILE_FULL} native-widl
139 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
140 set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${NAME}_r.res PROPERTIES
141 GENERATED TRUE EXTERNAL_OBJECT TRUE)
142 endfunction()