hgt.cmake 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. find_package(Python3 REQUIRED)
  2. set(hgt_dir ${CMAKE_BINARY_DIR}/hgt) # hgt 文件储存位置
  3. file(MAKE_DIRECTORY ${hgt_dir})
  4. to_native_path(${hgt_dir} hgt_dir_n) # hgt 温江储存位置
  5. to_native_path(${CMAKE_CURRENT_LIST_DIR}/tr tr_n) # tr 文件储存位置
  6. to_native_path(${CMAKE_SOURCE_DIR}/src src_n) # src 文件储存位置 【需要遍历】
  7. to_native_path(${CMAKE_SOURCE_DIR}/include include_n) # include 文件位置 【需要遍历】
  8. set(hgt_name aFun) # ht 名称
  9. set(HGT_COMMAND
  10. "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_LIST_DIR}/hgt.py"
  11. ${hgt_dir_n}
  12. baseHTExport
  13. BASEHT_EXPORT
  14. ${tr_n}
  15. ${hgt_name}
  16. ${src_n}
  17. ${include_n})
  18. unset(hgt_dir_n)
  19. unset(tr_n)
  20. unset(src_n)
  21. unset(include_n)
  22. add_custom_target(hgt ALL)
  23. add_custom_command(TARGET hgt POST_BUILD
  24. COMMAND ${HGT_COMMAND}
  25. COMMENT "The hgt generate file: base"
  26. VERBATIM)
  27. execute_process(COMMAND ${HGT_COMMAND}
  28. RESULT_VARIABLE re
  29. OUTPUT_VARIABLE output
  30. ERROR_VARIABLE errput)
  31. if (re)
  32. # 运行失败
  33. message(FATAL_ERROR "hgt error[${re}]\n${errput}")
  34. endif()
  35. add_library(hgt-base SHARED)
  36. target_sources(hgt-base
  37. PRIVATE ${hgt_dir}/${hgt_name}_ht.c
  38. PUBLIC $<BUILD_INTERFACE:${hgt_dir}/${hgt_name}_ht.h> $<INSTALL_INTERFACE:${INSTALL_INCLUDEDIR}/${hgt_name}_ht.h>)
  39. target_link_libraries(hgt-base ${dlfcn_lib})
  40. add_dependencies(hgt-base hgt)
  41. include(GenerateExportHeader)
  42. generate_export_header(hgt-base EXPORT_FILE_NAME "${hgt_dir}/baseHTExport.h" BASE_NAME "baseHT")
  43. target_include_directories(hgt-base PUBLIC
  44. $<BUILD_INTERFACE:${hgt_dir}>
  45. $<INSTALL_INTERFACE:${INSTALL_INCLUDEDIR}>)
  46. set_target_properties(hgt-base PROPERTIES
  47. PUBLIC_HEADER "${hgt_dir}/${hgt_name}_ht.h"
  48. OUTPUT_NAME "aFunlangTr")
  49. install(TARGETS hgt-base
  50. EXPORT aFunlang
  51. RUNTIME DESTINATION ${INSTALL_BINDIR} COMPONENT runtime
  52. ARCHIVE DESTINATION ${INSTALL_LIBDIR} COMPONENT dev
  53. LIBRARY DESTINATION ${INSTALL_LIBDIR} COMPONENT runtime
  54. PUBLIC_HEADER DESTINATION ${INSTALL_INCLUDEDIR} COMPONENT dev
  55. PRIVATE_HEADER DESTINATION ${INSTALL_INCLUDEDIR} COMPONENT unsafe-dev)
  56. file(GLOB tr
  57. LIST_DIRECTORIES FALSE
  58. ${hgt_dir}/tr/*.c)
  59. function(build_lang)
  60. foreach(src IN LISTS tr)
  61. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${INSTALL_LANGDIR})
  62. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${INSTALL_LANGDIR})
  63. cmake_path(GET src STEM name)
  64. add_library(hgt-${name} SHARED ${src})
  65. add_dependencies(hgt-${name} hgt-base)
  66. add_custom_command(TARGET hgt-${name} POST_BUILD
  67. COMMAND ${CMAKE_COMMAND} -E echo "$<TARGET_FILE_BASE_NAME:hgt-${name}>" ">>" "LANG"
  68. WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/${INSTALL_LANGDIR}"
  69. COMMENT "Creat file ${CMAKE_BINARY_DIR}/${INSTALL_LANGDIR}/LANG")
  70. set_target_properties(hgt-${name} PROPERTIES OUTPUT_NAME "${name}")
  71. target_compile_definitions(hgt-${name} PRIVATE hgt_base_EXPORTS)
  72. target_include_directories(hgt-${name} PUBLIC ${hgt_dir})
  73. install(TARGETS hgt-${name}
  74. RUNTIME DESTINATION ${INSTALL_LANGDIR} COMPONENT runtime
  75. LIBRARY DESTINATION ${INSTALL_LANGDIR} COMPONENT runtime)
  76. endforeach()
  77. endfunction()
  78. build_lang() # 使用函数防止 CMAKE_RUNTIME_OUTPUT_DIRECTORY 影响外部
  79. unset(hgt-name)