diff --git a/CMakeLists.txt b/CMakeLists.txt index cf2b75068..ae0ae93b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,7 @@ if(MSVC) endif() else() if(MINGW) + set(CMAKE_WIDL "widl" CACHE STRING "wine IDL header file generation program") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_WIN32_WINNT=0x0600 -DWINVER=0x0600") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x0600 -DWINVER=0x0600") endif() diff --git a/cmake/Modules/IDLFileHelper.cmake b/cmake/Modules/IDLFileHelper.cmake new file mode 100644 index 000000000..a486d6a67 --- /dev/null +++ b/cmake/Modules/IDLFileHelper.cmake @@ -0,0 +1,65 @@ +macro(add_idl_files generated_files) + foreach(filename ${ARGN}) + get_filename_component(file_we ${filename} NAME_WE) + get_filename_component(file_path ${filename} PATH) + + set(file_c ${file_we}_i.c) + set(file_h ${file_we}.h) + set(bin_file_h ${CMAKE_CURRENT_BINARY_DIR}/${file_h}) + set(bin_file_c ${CMAKE_CURRENT_BINARY_DIR}/${file_c}) + + if(MSVC) + add_custom_command( + OUTPUT ${bin_file_h} ${bin_file_c} + DEPENDS ${filename} + COMMAND midl /h ${file_h} /iid ${file_c} /notlb ${CMAKE_CURRENT_SOURCE_DIR}/${filename} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + else() + execute_process(COMMAND echo + COMMAND ${CMAKE_C_COMPILER} -v -x c++ -E - + ERROR_VARIABLE cpp_inc_output + OUTPUT_QUIET + ERROR_STRIP_TRAILING_WHITESPACE) + + string(REPLACE ";" " " include_dirs ${cpp_inc_output}) + string(REPLACE "\n" ";" include_dirs ${cpp_inc_output}) + + set(include_params) + foreach(include_dir ${include_dirs}) + string(SUBSTRING ${include_dir} 0 1 first_char) + if(${first_char} STREQUAL " ") + string(LENGTH "${include_dir}" include_dir_len) + math(EXPR include_dir_len "${include_dir_len} - 1") + string(SUBSTRING ${include_dir} 1 ${include_dir_len} include_dir) + set(include_params "-I\"${include_dir}\" ${include_params}") + endif() + endforeach() + + if(WIN32) + separate_arguments(include_params WINDOWS_COMMAND ${include_params}) + endif() + + add_custom_command( + OUTPUT ${file_h} + DEPENDS ${filename} + COMMAND ${CMAKE_WIDL} ${include_params} -h -o ${file_h} ${CMAKE_CURRENT_SOURCE_DIR}/${filename} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + + file(WRITE ${bin_file_c} "#include \n#include <${file_h}>\n") + endif() + + set_source_files_properties( + ${bin_file_h} + ${bin_file_c} + PROPERTIES + GENERATED TRUE) + + set(${generated_files} ${${generated_file}} + ${bin_file_h} + ${bin_file_c}) + + set_source_files_properties(${filename} + PROPERTIES + HEADER_FILE_ONLY TRUE) + endforeach(filename ${ARGN}) +endmacro(add_idl_files)