function(run_pzip target_name source destination glob)
  file(GLOB_RECURSE files RELATIVE "${source}" "${source}/${glob}")

  set(dstfiles "")
  foreach(filename ${files})
    string(REGEX REPLACE "^/" "" filename "${filename}")

    get_filename_component(dstdir "${destination}/${filename}" DIRECTORY)

    if(TARGET host_pzip)
      set(dstfile "${filename}.pz")
      list(APPEND dstfiles "${destination}/${dstfile}")

      add_custom_command(OUTPUT "${destination}/${dstfile}"
        COMMAND ${CMAKE_COMMAND} -E make_directory "${dstdir}"
        COMMAND host_pzip -o "${destination}/${dstfile}" "${source}/${filename}"
        DEPENDS host_pzip
        COMMENT "")

    else()
      # If pzip isn't built, we just copy instead.
      list(APPEND dstfiles "${destination}/${filename}")

      add_custom_command(OUTPUT "${destination}/${filename}"
        COMMAND ${CMAKE_COMMAND} -E
          copy_if_different "${source}/${filename}" "${destination}/${filename}"
        COMMENT "")

    endif()

  endforeach(filename)

  add_custom_target(${target_name} ALL
    DEPENDS ${dstfiles}
    WORKING_DIRECTORY "${destination}")

endfunction(run_pzip)
