IDLFileHelper.cmake 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. macro(add_idl_files generated_files)
  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. add_custom_command(
  11. OUTPUT ${bin_file_h} ${bin_file_c}
  12. DEPENDS ${filename}
  13. COMMAND midl /h ${file_h} /iid ${file_c} /notlb ${CMAKE_CURRENT_SOURCE_DIR}/${filename}
  14. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  15. else()
  16. execute_process(COMMAND echo
  17. COMMAND ${CMAKE_C_COMPILER} -v -x c++ -E -
  18. ERROR_VARIABLE cpp_inc_output
  19. OUTPUT_QUIET
  20. ERROR_STRIP_TRAILING_WHITESPACE)
  21. string(REPLACE ";" " " include_dirs ${cpp_inc_output})
  22. string(REPLACE "\n" ";" include_dirs ${cpp_inc_output})
  23. set(include_params)
  24. foreach(include_dir ${include_dirs})
  25. string(SUBSTRING ${include_dir} 0 1 first_char)
  26. if(${first_char} STREQUAL " ")
  27. string(LENGTH "${include_dir}" include_dir_len)
  28. math(EXPR include_dir_len "${include_dir_len} - 1")
  29. string(SUBSTRING ${include_dir} 1 ${include_dir_len} include_dir)
  30. set(include_params "-I\"${include_dir}\" ${include_params}")
  31. endif()
  32. endforeach()
  33. if(WIN32)
  34. separate_arguments(include_params WINDOWS_COMMAND ${include_params})
  35. endif()
  36. add_custom_command(
  37. OUTPUT ${file_h}
  38. DEPENDS ${filename}
  39. COMMAND ${CMAKE_WIDL} ${include_params} -h -o ${file_h} ${CMAKE_CURRENT_SOURCE_DIR}/${filename}
  40. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  41. file(WRITE ${bin_file_c} "#include <initguid.h>\n#include <${file_h}>\n")
  42. endif()
  43. set_source_files_properties(
  44. ${bin_file_h}
  45. ${bin_file_c}
  46. PROPERTIES
  47. GENERATED TRUE)
  48. set(${generated_files} ${${generated_file}}
  49. ${bin_file_h}
  50. ${bin_file_c})
  51. set_source_files_properties(${filename}
  52. PROPERTIES
  53. HEADER_FILE_ONLY TRUE)
  54. endforeach(filename ${ARGN})
  55. endmacro(add_idl_files)