include_guard(GLOBAL) find_program(UNCRUSTIFY_EXE NAMES uncrustify) if(UNCRUSTIFY_EXE) if(NOT EXISTS ${PROJECT_BINARY_DIR}/uncrustify-classheader.txt) file(GENERATE OUTPUT ${PROJECT_BINARY_DIR}/uncrustify-classheader.txt CONTENT "/** * @class $(fclass) * @brief TODO * @details TODO */") endif() if(NOT EXISTS ${PROJECT_BINARY_DIR}/uncrustify-filefooter.txt) file(GENERATE OUTPUT ${PROJECT_BINARY_DIR}/uncrustify-filefooter.txt CONTENT "// EOF $(filename)") endif() if(NOT EXISTS ${PROJECT_BINARY_DIR}/uncrustify-fileheader.txt) file(GENERATE OUTPUT ${PROJECT_BINARY_DIR}/uncrustify-fileheader.txt CONTENT "/** * @file $(filename) * @brief TODO * @details TODO */") endif() if(NOT EXISTS ${PROJECT_BINARY_DIR}/uncrustify-funcheader.txt) file(GENERATE OUTPUT ${PROJECT_BINARY_DIR}/uncrustify-funcheader.txt CONTENT "/** * @fn $(fclass)::$(function) * $(javaparam) * @details TODO */") endif() endif() function(myx_uncrustify target) set(options) set(oneValueArgs CONFIG) set(multiValueArgs) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT ARG_CONFIG) set(ARG_CONFIG "${PROJECT_SOURCE_DIR}/.uncrustify.cfg") if(NOT EXISTS ${ARG_CONFIG}) set(ARG_CONFIG "${CMAKE_SOURCE_DIR}/.uncrustify.cfg") endif() endif() if(NOT EXISTS ${ARG_CONFIG}) myx_message_notify("MyxCMake: uncrustify config is not found") return() endif() if(NOT UNCRUSTIFY_EXE) myx_message_notify("MyxCMake: uncrustify executable is not found") return() endif() if(NOT TARGET myx-uncrustify) add_custom_target(myx-uncrustify) endif() if(NOT TARGET myx-uncrustify-check) add_custom_target(myx-uncrustify-check) endif() if(NOT TARGET myx-uncrustify-append-comments) add_custom_target(myx-uncrustify-append-comments) endif() get_target_property(__sources ${target} SOURCES) list(FILTER __sources EXCLUDE REGEX "qrc_.*\\.cpp$") list(FILTER __sources EXCLUDE REGEX "moc_.*\\.cpp$") list(FILTER __sources EXCLUDE REGEX "ui_.*\\.h$") list(FILTER __sources EXCLUDE REGEX ".*\\.qm$") add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/uncrustify-${target}.cfg COMMAND ${UNCRUSTIFY_EXE} --update-config-with-doc -c ${ARG_CONFIG} -o ${PROJECT_BINARY_DIR}/uncrustify-${target}.cfg) list(APPEND UNCRUSTIFY_OPTS -c ${PROJECT_BINARY_DIR}/uncrustify-${target}.cfg) # cmake-format: off add_custom_target(${target}-uncrustify-check DEPENDS ${PROJECT_BINARY_DIR}/uncrustify-${target}.cfg COMMAND ${UNCRUSTIFY_EXE} ${UNCRUSTIFY_OPTS} --check ${__sources}) list(APPEND UNCRUSTIFY_OPTS --replace --no-backup) add_custom_target(${target}-uncrustify DEPENDS ${PROJECT_BINARY_DIR}/uncrustify-${target}.cfg COMMAND ${UNCRUSTIFY_EXE} ${UNCRUSTIFY_OPTS} --mtime ${__sources}) add_custom_target(${target}-uncrustify-append-comments DEPENDS ${PROJECT_BINARY_DIR}/uncrustify-${target}.cfg COMMAND ${UNCRUSTIFY_EXE} ${UNCRUSTIFY_OPTS} --set cmt_insert_class_header=${PROJECT_BINARY_DIR}/uncrustify-classheader.txt --set cmt_insert_file_footer=${PROJECT_BINARY_DIR}/uncrustify-filefooter.txt --set cmt_insert_file_header=${PROJECT_BINARY_DIR}/uncrustify-fileheader.txt --set cmt_insert_func_header=${PROJECT_BINARY_DIR}/uncrustify-funcheader.txt --set cmt_insert_before_ctor_dtor=true --mtime ${__sources}) # cmake-format: on add_dependencies(myx-uncrustify ${target}-uncrustify) add_dependencies(myx-uncrustify-check ${target}-uncrustify-check) add_dependencies(myx-uncrustify-append-comments ${target}-uncrustify-append-comments) endfunction()