[CMAKE]
[reactos.git] / reactos / cmake / midl-support.cmake
1
2 #idl files support
3 if(ARCH MATCHES i386)
4 set(IDL_FLAGS /nologo /win32 /no_def_idir)
5 elseif(ARCH MATCHES amd64)
6 set(IDL_FLAGS /nologo /amd64 /no_def_idir)
7 else()
8 set(IDL_FLAGS /nologo /no_def_idir)
9 endif()
10
11 function(add_typelib)
12 get_includes(INCLUDES)
13 get_defines(DEFINES)
14 foreach(FILE ${ARGN})
15 get_filename_component(NAME ${FILE} NAME_WE)
16 add_custom_command(
17 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.tlb
18 COMMAND midl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} /tlb ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.tlb ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}
19 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
20 endforeach()
21 endfunction()
22
23 function(add_idl_headers TARGET)
24 get_includes(INCLUDES)
25 get_defines(DEFINES)
26 foreach(_input_file ${ARGN})
27 get_filename_component(_name ${_input_file} NAME_WE)
28 set(_name ${CMAKE_CURRENT_BINARY_DIR}/${_name})
29 add_custom_command(
30 OUTPUT ${_name}.h
31 COMMAND midl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} /h ${_name}.h /iid ${_name}_dummy_i.h ${CMAKE_CURRENT_SOURCE_DIR}/${_input_file}
32 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_input_file})
33 list(APPEND _target_dependencies ${_name}.h)
34 endforeach()
35 add_custom_target(${TARGET} DEPENDS ${_target_dependencies})
36 endfunction()
37
38 function(add_rpcproxy_files)
39 get_includes(INCLUDES)
40 get_defines(DEFINES)
41 set(OUTPUT_FILES "")
42 foreach(FILE ${ARGN})
43 get_filename_component(NAME ${FILE} NAME_WE)
44 add_custom_command(
45 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.c ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.h ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c
46 COMMAND midl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} /proxy ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.c /h ${NAME}_p.h ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} /dlldata ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c
47 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} ${OUTPUT_FILES})
48 list(APPEND OUTPUT_FILES ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.c)
49 list(APPEND OUTPUT_FILES ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.h)
50 endforeach()
51 set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c PROPERTIES GENERATED TRUE)
52 endfunction()
53
54 function(add_rpc_files __type)
55 get_includes(INCLUDES)
56 get_defines(DEFINES)
57 # Is it a client or server module?
58 if(__type STREQUAL server)
59 set(__server_client /sstub)
60 set(__suffix _s)
61 elseif(__type STREQUAL client)
62 set(__server_client /cstub)
63 set(__suffix _c)
64 else()
65 message(FATAL_ERROR "Please pass either server or client as argument to add_rpc_files")
66 endif()
67 foreach(FILE ${ARGN})
68 get_filename_component(__name ${FILE} NAME_WE)
69 set(__name ${CMAKE_CURRENT_BINARY_DIR}/${__name}${__suffix})
70 if(NOT IS_ABSOLUTE ${FILE})
71 set(FILE ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
72 endif()
73 add_custom_command(
74 OUTPUT ${__name}.c ${__name}.h
75 COMMAND midl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} /h ${__name}.h ${__server_client} ${__name}.c ${FILE}
76 DEPENDS ${FILE})
77 endforeach()
78 endfunction()
79
80 function(generate_idl_iids IDL_FILE)
81 get_filename_component(FILE ${IDL_FILE} NAME)
82 if(FILE STREQUAL "${IDL_FILE}")
83 set(IDL_FILE_FULL "${CMAKE_CURRENT_SOURCE_DIR}/${IDL_FILE}")
84 else()
85 set(IDL_FILE_FULL ${IDL_FILE})
86 endif()
87 get_includes(INCLUDES)
88 get_defines(DEFINES)
89 get_filename_component(NAME ${IDL_FILE} NAME_WE)
90 add_custom_command(
91 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c
92 COMMAND midl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} /iid ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c ${IDL_FILE_FULL}
93 DEPENDS ${IDL_FILE_FULL})
94 set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c PROPERTIES GENERATED TRUE)
95 endfunction()
96
97 function(add_iid_library TARGET)
98 foreach(IDL_FILE ${ARGN})
99 get_filename_component(NAME ${IDL_FILE} NAME_WE)
100 generate_idl_iids(${IDL_FILE})
101 list(APPEND IID_SOURCES ${NAME}_i.c)
102 endforeach()
103 add_library(${TARGET} ${IID_SOURCES})
104 add_dependencies(${TARGET} psdk)
105 set_target_properties(${TARGET} PROPERTIES EXCLUDE_FROM_ALL TRUE)
106 endfunction()