IDLFileHelper.cmake 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. macro(add_idl_files_base generated_files with_tlb)
  2. foreach(filename ${ARGN})
  3. get_filename_component(file_we ${filename} NAME_WE)
  4. get_filename_component(file_path ${filename} PATH)
  5. set(file_c ${file_we}_i.c)
  6. set(file_h ${file_we}.h)
  7. set(bin_file_h ${CMAKE_CURRENT_BINARY_DIR}/${file_h})
  8. set(bin_file_c ${CMAKE_CURRENT_BINARY_DIR}/${file_c})
  9. if(MSVC)
  10. if(${with_tlb})
  11. set(file_tlb ${file_we}.tlb)
  12. set(bin_file_tlb ${CMAKE_CURRENT_BINARY_DIR}/${file_tlb})
  13. set(tlb_opt "")
  14. else()
  15. set(tlb_opt "/notlb")
  16. endif()
  17. add_custom_command(
  18. OUTPUT ${bin_file_h} ${bin_file_c}
  19. DEPENDS ${filename}
  20. COMMAND
  21. midl /h ${file_h} /iid ${file_c} ${tlb_opt}
  22. $<IF:$<EQUAL:${CMAKE_SIZEOF_VOID_P},8>,/win64,/win32>
  23. ${CMAKE_CURRENT_SOURCE_DIR}/${filename}
  24. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  25. else()
  26. execute_process(
  27. COMMAND echo
  28. COMMAND ${CMAKE_C_COMPILER} -v -x c++ -E -
  29. ERROR_VARIABLE cpp_inc_output
  30. OUTPUT_QUIET ERROR_STRIP_TRAILING_WHITESPACE)
  31. string(REPLACE ";" " " include_dirs ${cpp_inc_output})
  32. string(REPLACE "\n" ";" include_dirs ${cpp_inc_output})
  33. set(include_params)
  34. foreach(include_dir ${include_dirs})
  35. string(SUBSTRING ${include_dir} 0 1 first_char)
  36. if(${first_char} STREQUAL " ")
  37. string(LENGTH "${include_dir}" include_dir_len)
  38. math(EXPR include_dir_len "${include_dir_len} - 1")
  39. string(SUBSTRING ${include_dir} 1 ${include_dir_len} include_dir)
  40. set(include_params "-I\"${include_dir}\" ${include_params}")
  41. endif()
  42. endforeach()
  43. if(WIN32)
  44. separate_arguments(include_params WINDOWS_COMMAND ${include_params})
  45. endif()
  46. add_custom_command(
  47. OUTPUT ${file_h}
  48. DEPENDS ${filename}
  49. COMMAND ${CMAKE_WIDL} ${include_params} -h -o ${file_h}
  50. ${CMAKE_CURRENT_SOURCE_DIR}/${filename}
  51. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  52. file(WRITE ${bin_file_c} "#include <initguid.h>\n#include <${file_h}>\n")
  53. endif()
  54. set_source_files_properties(${bin_file_h} ${bin_file_c} PROPERTIES GENERATED
  55. TRUE)
  56. set(${generated_files} ${${generated_file}} ${bin_file_h} ${bin_file_c})
  57. set_source_files_properties(${filename} PROPERTIES HEADER_FILE_ONLY TRUE)
  58. endforeach(filename ${ARGN})
  59. endmacro(add_idl_files_base)
  60. macro(add_idl_files generated_files)
  61. add_idl_files_base(${generated_files} FALSE ${ARGN})
  62. endmacro(add_idl_files)
  63. macro(add_idl_files_with_tlb generated_files)
  64. add_idl_files_base(${generated_files} TRUE ${ARGN})
  65. endmacro(add_idl_files_with_tlb)