5 set(IDL_HEADER_ARG /h) #.h
6 set(IDL_HEADER_ARG2 /header) #.h
7 set(IDL_TYPELIB_ARG /tlb) #.tlb
8 set(IDL_SERVER_ARG /sstub) #.c for stub server library
9 set(IDL_CLIENT_ARG /cstub) #.c for stub client library
10 set(IDL_PROXY_ARG /proxy)
11 set(IDL_INTERFACE_ARG /iid)
13 set(IDL_FLAGS /nologo /win32)
14 elseif(ARCH MATCHES amd64)
15 set(IDL_FLAGS /nologo /amd64)
17 set(IDL_FLAGS /nologo)
21 set(IDL_COMPILER native-widl)
22 set(IDL_HEADER_ARG -h -o) #.h
23 set(IDL_HEADER_ARG2 -h -H) #.h
24 set(IDL_TYPELIB_ARG -t -o) #.tlb
25 set(IDL_SERVER_ARG -Oif -s -o) #.c for server library
26 set(IDL_CLIENT_ARG -Oif -c -o) #.c for stub client library
27 set(IDL_PROXY_ARG -p -o)
28 set(IDL_INTERFACE_ARG -u -o)
30 set(IDL_FLAGS -m32 --win32)
31 elseif(ARCH MATCHES amd64)
32 set(IDL_FLAGS -m64 --win64)
36 set(IDL_DEPENDS native-widl)
40 function(get_includes OUTPUT_VAR)
41 get_directory_property(_includes INCLUDE_DIRECTORIES)
42 foreach(arg ${_includes})
43 list(APPEND __tmp_var -I${arg})
45 set(${OUTPUT_VAR} ${__tmp_var} PARENT_SCOPE)
48 function(get_defines OUTPUT_VAR)
49 get_directory_property(_defines COMPILE_DEFINITIONS)
50 foreach(arg ${_defines})
51 list(APPEND __tmp_var -D${arg})
53 set(${OUTPUT_VAR} ${__tmp_var} PARENT_SCOPE)
56 function(add_typelib TARGET)
57 get_includes(INCLUDES)
60 get_filename_component(NAME ${FILE} NAME_WE)
62 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.tlb
63 COMMAND ${IDL_COMPILER} ${INCLUDES} ${DEFINES} ${IDL_FLAGS} ${IDL_TYPELIB_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.tlb ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}
64 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} ${IDL_DEPENDS})
65 list(APPEND OBJECTS ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.tlb)
67 add_custom_target(${TARGET} ALL DEPENDS ${OBJECTS})
70 function(add_idl_headers TARGET)
71 get_includes(INCLUDES)
74 get_filename_component(NAME ${FILE} NAME_WE)
75 set(HEADER ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.h)
77 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.h
78 COMMAND ${IDL_COMPILER} ${INCLUDES} ${DEFINES} ${IDL_FLAGS} ${IDL_HEADER_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.h ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}
79 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} ${IDL_DEPENDS})
80 list(APPEND HEADERS ${HEADER})
82 add_custom_target(${TARGET} DEPENDS ${HEADERS})
85 function(add_rpcproxy_files)
86 get_includes(INCLUDES)
90 set(DLLDATA_ARG /dlldata ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c)
91 set(DLLDATA_DEPENDENCIES "")
94 get_filename_component(NAME ${FILE} NAME_WE)
96 set(DLLDATA_DEPENDENCIES ${DLLDATA_DEPENDENCIES} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.c)
98 list(APPEND IDLS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
101 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.c ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.h
102 COMMAND ${IDL_COMPILER} ${INCLUDES} ${DEFINES} ${IDL_FLAGS} ${IDL_PROXY_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.c ${IDL_HEADER_ARG2} ${NAME}_p.h ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} ${DLLDATA_ARG}
103 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} ${IDL_DEPENDS})
106 # Extra pass to generate dlldata
108 #touch it, so we're sure it's older than its dependencies
110 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c
111 COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c
112 DEPENDS ${DLLDATA_DEPENDENCIES})
113 set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c PROPERTIES GENERATED TRUE)
116 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c
117 COMMAND ${IDL_COMPILER} ${INCLUDES} ${DEFINES} ${IDL_FLAGS} --dlldata-only -o ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c ${IDLS}
118 DEPENDS ${IDLS} ${IDL_DEPENDS})
122 function(add_rpc_files __type)
123 get_includes(INCLUDES)
125 # Is it a client or server module?
126 if(__type STREQUAL server)
127 set(__server_client ${IDL_SERVER_ARG})
129 elseif(__type STREQUAL client)
130 set(__server_client ${IDL_CLIENT_ARG})
133 message(FATAL_ERROR "Please pass either server or client as argument to add_rpc_files")
135 foreach(FILE ${ARGN})
136 get_filename_component(__name ${FILE} NAME_WE)
137 set(__name ${__name}${__suffix})
138 if(NOT IS_ABSOLUTE ${FILE})
139 set(FILE ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
142 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${__name}.c ${CMAKE_CURRENT_BINARY_DIR}/${__name}.h
143 COMMAND ${IDL_COMPILER} ${INCLUDES} ${DEFINES} ${IDL_FLAGS} ${IDL_HEADER_ARG2} ${CMAKE_CURRENT_BINARY_DIR}/${__name}.h ${__server_client} ${CMAKE_CURRENT_BINARY_DIR}/${__name}.c ${FILE}
144 DEPENDS ${FILE} ${IDL_DEPENDS})
148 function(generate_idl_iids IDL_FILE)
149 get_filename_component(FILE ${IDL_FILE} NAME)
150 if(FILE STREQUAL "${IDL_FILE}")
151 set(IDL_FILE_FULL "${CMAKE_CURRENT_SOURCE_DIR}/${IDL_FILE}")
153 set(IDL_FILE_FULL ${IDL_FILE})
155 get_includes(INCLUDES)
157 get_filename_component(NAME ${IDL_FILE} NAME_WE)
159 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c
160 COMMAND ${IDL_COMPILER} ${INCLUDES} ${DEFINES} ${IDL_FLAGS} ${IDL_INTERFACE_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c ${IDL_FILE_FULL}
161 DEPENDS ${IDL_FILE_FULL} ${IDL_DEPENDS})
162 set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c PROPERTIES GENERATED TRUE)
165 function(add_iid_library TARGET)
166 foreach(IDL_FILE ${ARGN})
167 get_filename_component(NAME ${IDL_FILE} NAME_WE)
168 generate_idl_iids(${IDL_FILE})
169 list(APPEND IID_SOURCES ${NAME}_i.c)
171 add_library(${TARGET} ${IID_SOURCES})
172 add_dependencies(${TARGET} psdk)
173 set_target_properties(${TARGET} PROPERTIES EXCLUDE_FROM_ALL TRUE)