if(PACKAGE_ZIP_RUN) file(STRINGS "${PACKAGE_INCLUDE_FILE}" package_includes) file(STRINGS "${PACKAGE_EXCLUDE_FILE}" package_excludes) set(package_files) foreach(include_pattern IN LISTS package_includes) string(REPLACE "\\" "/" include_pattern "${include_pattern}") string(REGEX REPLACE "^/+" "" include_pattern "${include_pattern}") if(include_pattern STREQUAL "") continue() endif() if(include_pattern MATCHES "/$") string(REGEX REPLACE "/+$" "" include_pattern "${include_pattern}") file(GLOB_RECURSE matched_files LIST_DIRECTORIES false RELATIVE "${PACKAGE_ROOT}" "${PACKAGE_ROOT}/${include_pattern}/*") else() file(GLOB_RECURSE matched_files LIST_DIRECTORIES false RELATIVE "${PACKAGE_ROOT}" "${PACKAGE_ROOT}/${include_pattern}") endif() list(APPEND package_files ${matched_files}) endforeach() list(REMOVE_DUPLICATES package_files) set(excluded_files) foreach(exclude_pattern IN LISTS package_excludes) string(REPLACE "\\" "/" exclude_pattern "${exclude_pattern}") string(REGEX REPLACE "^/+" "" exclude_pattern "${exclude_pattern}") if(exclude_pattern STREQUAL "") continue() endif() if(exclude_pattern MATCHES "/$") string(REGEX REPLACE "/+$" "" exclude_pattern "${exclude_pattern}") file(GLOB_RECURSE matched_files LIST_DIRECTORIES false RELATIVE "${PACKAGE_ROOT}" "${PACKAGE_ROOT}/${exclude_pattern}/*") else() file(GLOB_RECURSE matched_files LIST_DIRECTORIES false RELATIVE "${PACKAGE_ROOT}" "${PACKAGE_ROOT}/${exclude_pattern}") endif() list(APPEND excluded_files ${matched_files}) endforeach() if(excluded_files) list(REMOVE_DUPLICATES excluded_files) list(REMOVE_ITEM package_files ${excluded_files}) endif() foreach(internal_file IN ITEMS "${PACKAGE_OUTPUT_FILE}" "${PACKAGE_FILE_LIST}" "${PACKAGE_INCLUDE_FILE}" "${PACKAGE_EXCLUDE_FILE}") file(RELATIVE_PATH internal_relative "${PACKAGE_ROOT}" "${internal_file}") string(REPLACE "\\" "/" internal_relative "${internal_relative}") if(NOT internal_relative MATCHES "^\\.\\./") list(REMOVE_ITEM package_files "${internal_relative}") endif() endforeach() list(SORT package_files) string(REPLACE ";" "\n" package_file_list_content "${package_files}") file(WRITE "${PACKAGE_FILE_LIST}" "${package_file_list_content}\n") get_filename_component(package_output_dir "${PACKAGE_OUTPUT_FILE}" DIRECTORY) file(MAKE_DIRECTORY "${package_output_dir}") file(REMOVE "${PACKAGE_OUTPUT_FILE}") execute_process(COMMAND "${CMAKE_COMMAND}" -E tar cf "${PACKAGE_OUTPUT_FILE}" --format=zip "--files-from=${PACKAGE_FILE_LIST}" WORKING_DIRECTORY "${PACKAGE_ROOT}" RESULT_VARIABLE package_result) if(NOT package_result EQUAL 0) message(FATAL_ERROR "Failed to create ${PACKAGE_OUTPUT_FILE}") endif() return() endif() function(add_project_zip_target target_name output_file root_directory include_list_name exclude_list_name) if(IS_ABSOLUTE "${root_directory}") get_filename_component(package_root "${root_directory}" ABSOLUTE) else() get_filename_component(package_root "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${root_directory}" ABSOLUTE) endif() if(IS_ABSOLUTE "${output_file}") get_filename_component(package_output_file "${output_file}" ABSOLUTE) else() get_filename_component(package_output_file "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${output_file}" ABSOLUTE) endif() set(package_file_list "${CMAKE_CURRENT_BINARY_DIR}/${target_name}.files") set(package_include_file "${CMAKE_CURRENT_BINARY_DIR}/${target_name}.includes") set(package_exclude_file "${CMAKE_CURRENT_BINARY_DIR}/${target_name}.excludes") string(REPLACE ";" "\n" package_include_content "${${include_list_name}}") string(REPLACE ";" "\n" package_exclude_content "${${exclude_list_name}}") file(WRITE "${package_include_file}" "${package_include_content}\n") file(WRITE "${package_exclude_file}" "${package_exclude_content}\n") add_custom_target(${target_name} COMMAND "${CMAKE_COMMAND}" -DPACKAGE_ZIP_RUN=ON "-DPACKAGE_ROOT=${package_root}" "-DPACKAGE_OUTPUT_FILE=${package_output_file}" "-DPACKAGE_FILE_LIST=${package_file_list}" "-DPACKAGE_INCLUDE_FILE=${package_include_file}" "-DPACKAGE_EXCLUDE_FILE=${package_exclude_file}" -P "${CMAKE_CURRENT_FUNCTION_LIST_FILE}" BYPRODUCTS "${package_output_file}" COMMENT "Creating ${package_output_file}" VERBATIM ) endfunction()