[CMAKE]
[reactos.git] / cmake / idl-support.cmake
1
2 #idl files support
3 if(MSVC)
4 set(IDL_COMPILER midl)
5 set(IDL_HEADER_ARG /h) #.h
6 set(IDL_HEADER_ARG2 /h) #.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)
12 if(ARCH MATCHES i386)
13 set(IDL_FLAGS /win32)
14 elseif(ARCH MATCHES amd64)
15 set(IDL_FLAGS /amd64)
16 else()
17 set(IDL_FLAGS "")
18 endif()
19 else()
20 set(IDL_COMPILER native-widl)
21 set(IDL_HEADER_ARG -h -o) #.h
22 set(IDL_HEADER_ARG2 -h -H) #.h
23 set(IDL_TYPELIB_ARG -t -o) #.tlb
24 set(IDL_SERVER_ARG -s -S) #.c for server library
25 set(IDL_CLIENT_ARG -c -C) #.c for stub client library
26 set(IDL_PROXY_ARG -p -P)
27 set(IDL_INTERFACE_ARG -u -o)
28 if(ARCH MATCHES i386)
29 set(IDL_FLAGS -m32 --win32)
30 elseif(ARCH MATCHES amd64)
31 set(IDL_FLAGS -m64 --win64)
32 else()
33 set(IDL_FLAGS "")
34 endif()
35 endif()
36
37
38 macro(get_includes OUTPUT_VAR)
39 get_directory_property(_includes INCLUDE_DIRECTORIES)
40 foreach(arg ${_includes})
41 set(${OUTPUT_VAR} -I${arg} ${${OUTPUT_VAR}})
42 endforeach()
43 endmacro()
44
45 macro(get_defines OUTPUT_VAR)
46 get_directory_property(_defines COMPILE_DEFINITIONS)
47 foreach(arg ${_defines})
48 set(${OUTPUT_VAR} ${${OUTPUT_VAR}} -D${arg})
49 endforeach()
50 endmacro()
51
52 macro(add_typelib TARGET)
53 get_includes(INCLUDES)
54 get_defines(DEFINES)
55 foreach(FILE ${ARGN})
56 get_filename_component(NAME ${FILE} NAME_WE)
57 add_custom_command(
58 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.tlb
59 COMMAND ${IDL_COMPILER} ${INCLUDES} ${DEFINES} ${IDL_FLAGS} ${IDL_TYPELIB_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.tlb ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}
60 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
61 list(APPEND OBJECTS ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.tlb)
62 endforeach()
63 add_custom_target(${TARGET} ALL DEPENDS ${OBJECTS})
64 endmacro()
65
66 macro(add_idl_headers TARGET)
67 get_includes(INCLUDES)
68 get_defines(DEFINES)
69 foreach(FILE ${ARGN})
70 get_filename_component(NAME ${FILE} NAME_WE)
71 set(HEADER ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.h)
72 add_custom_command(
73 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.h
74 COMMAND ${IDL_COMPILER} ${INCLUDES} ${DEFINES} ${IDL_FLAGS} ${IDL_HEADER_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.h ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}
75 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
76 list(APPEND HEADERS ${HEADER})
77 endforeach()
78 add_custom_target(${TARGET} ALL DEPENDS ${HEADERS})
79 endmacro()
80
81 macro(add_rpcproxy_library TARGET)
82 get_includes(INCLUDES)
83 get_defines(DEFINES)
84 foreach(FILE ${ARGN})
85 get_filename_component(NAME ${FILE} NAME_WE)
86 if(MSVC)
87 set(IDL_DLLDATA_ARG /dlldata ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_proxy.dlldata.c)
88 else()
89 set(IDL_DLLDATA_ARG "")
90 endif()
91 add_custom_command(
92 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.h ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.c
93 COMMAND ${IDL_COMPILER} ${INCLUDES} ${DEFINES} ${IDL_FLAGS} ${IDL_HEADER_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.h ${IDL_PROXY_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.c ${IDL_DLLDATA_ARG} ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}
94 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
95 set_source_files_properties(
96 ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_c.h ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.c
97 PROPERTIES GENERATED TRUE)
98 list(APPEND rpcproxy_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.c)
99 list(APPEND IDLS ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.idl)
100 endforeach()
101
102 if(NOT MSVC)
103 # Extra pass to generate dlldata for widl
104 add_custom_command(
105 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_proxy.dlldata.c
106 COMMAND ${IDL_COMPILER} ${INCLUDES} ${DEFINES} ${IDL_FLAGS} --dlldata-only -o ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_proxy.dlldata.c ${IDLS}
107 DEPENDS ${IDLS})
108 endif()
109 set_source_files_properties(
110 ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_proxy.dlldata.c
111 PROPERTIES GENERATED TRUE)
112 add_library(${TARGET} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_proxy.dlldata.c ${rpcproxy_SOURCES})
113 endmacro()
114
115 macro(add_rpc_library TARGET)
116 get_includes(INCLUDES)
117 get_defines(DEFINES)
118 foreach(FILE ${ARGN})
119 get_filename_component(NAME ${FILE} NAME_WE)
120 add_custom_command(
121 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_s.h ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_s.c
122 COMMAND ${IDL_COMPILER} ${INCLUDES} ${DEFINES} ${IDL_FLAGS} ${IDL_HEADER_ARG2} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_s.h ${IDL_SERVER_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_s.c ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}
123 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
124 set_source_files_properties(
125 ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_s.h ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_s.c
126 PROPERTIES GENERATED TRUE)
127 list(APPEND server_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_s.c)
128
129 add_custom_command(
130 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_c.h ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_c.c
131 COMMAND ${IDL_COMPILER} ${INCLUDES} ${DEFINES} ${IDL_FLAGS} ${IDL_HEADER_ARG2} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_c.h ${IDL_CLIENT_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_c.c ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}
132 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
133 set_source_files_properties(
134 ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_c.h ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_c.c
135 PROPERTIES GENERATED TRUE)
136 list(APPEND client_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_c.c)
137 endforeach()
138 add_library(${TARGET} ${server_SOURCES} ${client_SOURCES})
139 add_dependencies(${TARGET} psdk)
140 endmacro()
141
142 macro(generate_idl_iids IDL_FILE)
143 get_includes(INCLUDES)
144 get_defines(DEFINES)
145 get_filename_component(NAME ${IDL_FILE} NAME_WE)
146 add_custom_command(
147 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c
148 COMMAND ${IDL_COMPILER} ${INCLUDES} ${DEFINES} ${IDL_FLAGS} ${IDL_INTERFACE_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c ${CMAKE_CURRENT_SOURCE_DIR}/${IDL_FILE}
149 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${IDL_FILE})
150 set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c PROPERTIES GENERATED TRUE)
151 endmacro()