hgt.cmake 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. find_package(Python3 REQUIRED)
  2. set(hgt_dir ${CMAKE_BINARY_DIR}/hgt)
  3. file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/hgt)
  4. to_native_path(${hgt_dir} hgt_dir_n)
  5. to_native_path(${CMAKE_CURRENT_LIST_DIR}/tr tr_n)
  6. to_native_path(${CMAKE_SOURCE_DIR}/src src_n)
  7. to_native_path(${CMAKE_SOURCE_DIR}/include include_n)
  8. set(hgt_name aFun)
  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. execute_process(COMMAND ${HGT_COMMAND}
  27. RESULT_VARIABLE re
  28. OUTPUT_VARIABLE output
  29. ERROR_VARIABLE errput)
  30. if (re)
  31. # 运行失败
  32. message(FATAL_ERROR "hgt error[${re}]\n${errput}")
  33. endif()
  34. add_library(hgt-base SHARED)
  35. target_sources(hgt-base
  36. PRIVATE ${hgt_dir}/${hgt_name}_ht.c
  37. PUBLIC $<BUILD_INTERFACE:${hgt_dir}/${hgt_name}_ht.h> $<INSTALL_INTERFACE:${INSTALL_INCLUDEDIR}/${hgt_name}_ht.h>)
  38. target_link_libraries(hgt-base ${dlfcn_lib})
  39. add_dependencies(hgt-base hgt)
  40. set(hgt-lib hgt-base)
  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. set_target_properties(hgt-${name} PROPERTIES OUTPUT_NAME "${name}")
  67. target_compile_definitions(hgt-${name} PRIVATE hgt_base_EXPORTS)
  68. target_include_directories(hgt-${name} PUBLIC ${hgt_dir})
  69. install(TARGETS hgt-${name}
  70. RUNTIME DESTINATION ${INSTALL_LANGDIR} COMPONENT runtime
  71. LIBRARY DESTINATION ${INSTALL_LANGDIR} COMPONENT runtime)
  72. endforeach()
  73. endfunction()
  74. build_lang() # 使用函数防止 CMAKE_RUNTIME_OUTPUT_DIRECTORY 影响外部
  75. add_custom_command(TARGET hgt-zh_cn
  76. COMMAND ${CMAKE_COMMAND} -E echo "$<TARGET_FILE_BASE_NAME:hgt-zh_cn>" ">>" "LANG"
  77. WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/${INSTALL_LANGDIR}"
  78. COMMENT "Creat file ${CMAKE_BINARY_DIR}/${INSTALL_LANGDIR}/LANG")
  79. unset(hgt-name)