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