Как я могу использовать файлы из HTTP в качестве предварительных условий в GNU make?

Я сейчас на Fedora, но я предлагаю вам внимательно прочитать вики Archlinux , все это: Home и End ключи не рабочий .

Что я сделал, чтобы это исправить:

  1. Нажмите Ctrl-V Home, будет напечатана экранированная последовательность для клавиши Home. Это не \ e [4 ~ и \ e [1 ~ ], как я ожидал, глядя на / etc / inputrc . Это были [H и [F

  2. Извлечь информацию о терминале infocmp $ TERM> terminfo.src

  3. Откройте этот файл для редактирования, например vim terminfo.src , найдите khome и kend , он назначен чему-то, скажем khome = \ E [1 ~ и kend = \ E [4 ~ , который в этом случае не работает. удалите его и замените последовательностью, которую вы нашли на шаге № 1, поэтому для меня после редактирования это было: khome = \ E [H и kend = \ E [F ].

  4. Если вы хотите перестраховаться, убедитесь, что [F и [H (или любая другая последовательность, которую вы только что использовали) не назначены на что-то еще, иначе все будет испорчено!

  5. запустить tic terminfo.src , который создает каталог ~ / .terminfo .

  6. Вверху .zshrc перед любыми другими командами поместите: export TERMINFO = ~ / .terminfo

Откройте новое окно терминала, и все будет в порядке, домой и в конец должен работать сейчас.

P.S: Теоретически метод bindkey должен работать и проще, но для меня это не так.

10
20.02.2018, 22:36
2 ответа

Prueba algo como esto en tu Makefile:

.PHONY: local.dat

local.dat:
    [ -e example.gz ] || touch -d '00:00' example.gz
    curl -z example.gz -s http://example.org/example.gz -o example.gz
    [ -e $@ ] || touch -d 'yesterday 00:00' $@
    if [     "$(shell stat --printf '%Y' example.gz)" \
         -gt "$(shell stat --printf '%Y' $@)"         ] ; then \
      zcat example.gz | transmogrify >$@ ; \
    fi
    truncate -s 0 example.gz
    touch -r $@ example.gz

(nota :este es un Makefile, por lo que las sangrías son tabulaciones, no espacios. por supuesto. También es importante que no haya espacios después de \en las líneas de continuación -alternativamente, elimine la barra invertida -y conviértala en una línea larga, casi -ilegible)

Esta receta de GNU makeprimero verifica que exista un archivo llamado example.gz(porque lo usaremos con -zen curl), y lo crea con touchsi no 't. El toque lo crea con una marca de tiempo de 00 :00 (12 am del día actual ).

Luego usa la opción-z(--time-cond)de curlpara descargar solo example.gzsi se ha modificado desde la última vez que se descargó.-zpuede recibir una expresión de fecha real o un nombre de archivo. Si se le da un nombre de archivo, utilizará la hora de modificación del archivo como condición de tiempo.

Después de eso, si local.datno existe, lo crea con touch, utilizando una marca de tiempo que garantiza que es más antigua que la de example.gz. Esto es necesario porque local.dattiene que existir para que el siguiente comando use statpara obtener su marca de tiempo mtime.

Luego, si example.gztiene una marca de tiempo más reciente que local.dat, canaliza example.gza transmogrifyy redirige la salida a local.dat.

Finalmente, se encarga de la contabilidad y la limpieza:

  • se truncaexample.gz(porque solo necesita mantener una marca de tiempo, y no todo el archivo)
  • touches example.gzpara que tenga la misma marca de tiempo quelocal.dat

El objetivo.PHONY garantiza que el objetivo local.datsiempre se ejecute, incluso si el archivo con ese nombre ya existe.

Gracias a @Toby Speight por señalar en los comentarios que mi versión original no funcionaría y por qué.

Alternativamente, si desea canalizar el archivo directamente a transmogrifysin descargarlo primero al sistema de archivos:

.PHONY: local.dat

local.dat:
    [ -e example.gz ] || touch -d '00:00' example.gz
    [ -e $@ ] || touch -d 'yesterday 00:00' $@
    if [     "$(shell stat --printf '%Y' example.gz)" \
         -gt "$(shell stat --printf '%Y' $@)"         ] ; then \
      curl -z example.gz -s http://example.org/example.gz | transmogrify >$@ ; \
    fi
    touch -r $@ example.gz

NOTA:esto no se ha probado en su mayoría, por lo que puede requerir algunos cambios menores para obtener la sintaxis exactamente correcta. Lo importante aquí es el método, no una solución de culto de copiar -pegar carga -.

He estado usando variaciones de este método (, es decir,touch-enviar un archivo de marca de tiempo )con makedurante décadas. Funciona y, por lo general, me permite evitar tener que escribir mi propio código de resolución de dependencia en sh (, aunque tuve que hacer algo similar con stat --printf %Yaquí ).

Todo el mundo sabe que makees una gran herramienta para compilar software... En mi opinión, también es una herramienta muy por debajo de -para la administración del sistema y las tareas de secuencias de comandos.

15
27.01.2020, 20:01

Другой альтернативой является использование системы сборки, которая использует контрольные суммы зависимостей, чтобы определить, следует ли запускать перестроения. Я много раз использовал трюк «касания» с Gnu Make, но это намного проще, когда вы можете указать динамические зависимости и когда файлы, которые не изменяются, не вызывают перестроения. Вот пример использования GoodMake:

#! /usr/local/goodmake.py /bin/sh -se

#! *.date
    # Get the last-modified date
    curl -s -v -X HEAD http://${1%.date} 2>&1 | grep -i '^< Last-Modified:' >$1

#? local.dat
    site=http://example.org/example.gz
    $0 $site.date
    curl -s $site | gzip -d | transmogrify >$1
1
27.01.2020, 20:01

Теги

Похожие вопросы