https://git.reactos.org/?p=reactos.git;a=commitdiff;h=b587e7b32eccdb85ee1865c5e7e241abe8580f20

commit b587e7b32eccdb85ee1865c5e7e241abe8580f20
Author:     Jérôme Gardou <jerome.gar...@reactos.org>
AuthorDate: Fri Nov 20 09:47:33 2020 +0100
Commit:     Jérôme Gardou <jerome.gar...@reactos.org>
CommitDate: Fri Nov 20 09:47:33 2020 +0100

    [CMAKE/WIDL] Run widl from the source directory
    
    This dramatically improves ccache direct hit rate as now the generated 
files are identical across build trees
---
 sdk/cmake/widl-support.cmake | 46 ++++++++++++++++++--------------------------
 1 file changed, 19 insertions(+), 27 deletions(-)

diff --git a/sdk/cmake/widl-support.cmake b/sdk/cmake/widl-support.cmake
index 267459383ba..1b55d21b226 100644
--- a/sdk/cmake/widl-support.cmake
+++ b/sdk/cmake/widl-support.cmake
@@ -32,8 +32,9 @@ function(add_idl_headers TARGET)
         set(HEADER ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.h)
         add_custom_command(
             OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.h
-            COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} -h -o 
${CMAKE_CURRENT_BINARY_DIR}/${NAME}.h ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}
-            DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} native-widl)
+            COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} -h -o 
${CMAKE_CURRENT_BINARY_DIR}/${NAME}.h ${FILE}
+            DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} native-widl
+            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
         list(APPEND HEADERS ${HEADER})
     endforeach()
     add_custom_target(${TARGET} DEPENDS ${HEADERS})
@@ -56,18 +57,21 @@ function(add_rpcproxy_files)
                 set(EXTRA_DEP 
${REACTOS_SOURCE_DIR}/sdk/include/psdk/${SPLIT_FILE})
             endif()
         endif()
-        list(APPEND IDLS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
+        list(APPEND IDLS ${FILE})
+        list(APPEND IDL_DEPS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} ${EXTRA_DEP})
         add_custom_command(
             OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.c 
${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.h
-            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}
-            DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} ${EXTRA_DEP} 
native-widl)
+            COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} -p -o 
${CMAKE_CURRENT_BINARY_DIR}/${NAME}_p.c -h -H ${NAME}_p.h ${FILE}
+            DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} ${EXTRA_DEP} 
native-widl
+            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     endforeach()
 
     # Extra pass to generate dlldata
     add_custom_command(
         OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c
         COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} --dlldata-only 
-o ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c ${IDLS}
-        DEPENDS ${IDLS} native-widl)
+        DEPENDS ${IDL_DEPS} native-widl
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
 endfunction()
 
 function(add_rpc_files __type)
@@ -86,32 +90,25 @@ function(add_rpc_files __type)
     foreach(FILE ${ARGN})
         get_filename_component(__name ${FILE} NAME_WE)
         set(__name ${CMAKE_CURRENT_BINARY_DIR}/${__name}${__suffix})
-        if(NOT IS_ABSOLUTE ${FILE})
-            set(FILE ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
-        endif()
         add_custom_command(
             OUTPUT ${__name}.c ${__name}.h
             COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} -h -H 
${__name}.h ${__server_client} ${__name}.c ${FILE}
-            DEPENDS ${FILE} native-widl)
+            DEPENDS ${FILE} native-widl
+            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     endforeach()
 endfunction()
 
 function(generate_idl_iids)
     foreach(IDL_FILE ${ARGN})
         get_filename_component(FILE ${IDL_FILE} NAME)
-        if(FILE STREQUAL "${IDL_FILE}")
-            set(IDL_FILE_FULL "${CMAKE_CURRENT_SOURCE_DIR}/${IDL_FILE}")
-        else()
-            set(IDL_FILE_FULL ${IDL_FILE})
-        endif()
         get_includes(INCLUDES)
         get_defines(DEFINES)
         get_filename_component(NAME ${IDL_FILE} NAME_WE)
         add_custom_command(
             OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c
-            COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} -u -o 
${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c ${IDL_FILE_FULL}
-            DEPENDS ${IDL_FILE_FULL} native-widl)
-        set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c 
PROPERTIES GENERATED TRUE)
+            COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} -u -o 
${CMAKE_CURRENT_BINARY_DIR}/${NAME}_i.c ${IDL_FILE}
+            DEPENDS ${IDL_FILE_FULL} native-widl
+            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     endforeach()
 endfunction()
 
@@ -127,19 +124,14 @@ function(add_iid_library TARGET)
 endfunction()
 
 function(add_idl_reg_script IDL_FILE)
-    get_filename_component(FILE ${IDL_FILE} NAME)
-    if(FILE STREQUAL "${IDL_FILE}")
-        set(IDL_FILE_FULL "${CMAKE_CURRENT_SOURCE_DIR}/${IDL_FILE}")
-    else()
-        set(IDL_FILE_FULL ${IDL_FILE})
-    endif()
     get_includes(INCLUDES)
     get_defines(DEFINES)
     get_filename_component(NAME ${IDL_FILE} NAME_WE)
     add_custom_command(
         OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}_r.res
-        COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} -r -o 
${CMAKE_CURRENT_BINARY_DIR}/${NAME}_r.res ${IDL_FILE_FULL}
-        DEPENDS ${IDL_FILE_FULL} native-widl)
-    set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${NAME}_r.res 
PROPERTIES 
+        COMMAND native-widl ${INCLUDES} ${DEFINES} ${IDL_FLAGS} -r -o 
${CMAKE_CURRENT_BINARY_DIR}/${NAME}_r.res ${IDL_FILE}
+        DEPENDS ${IDL_FILE_FULL} native-widl
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+    set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${NAME}_r.res 
PROPERTIES
         GENERATED TRUE EXTERNAL_OBJECT TRUE)
 endfunction()

Reply via email to