Как я могу частично сериализовать с помощью GNU make

  • d для создания каталогов
  • r для удаления файлов

из tempfiles.d (5) . Другие вещи вам не нужны, попробуйте:

d /tmp      1d

   d
       Create a directory if it does not exist yet.

   D
       Create or empty a directory.
r
       Remove a file or directory if it exists. This may not be used to
       remove non-empty directories, use R for that. Lines of this type
       accept shell-style globs in place of normal path names. Does not
       follow symlinks.

   R
       Recursively remove a path and all its subdirectories (if it is a
       directory). Lines of this type accept shell-style globs in place
       of normal path names. Does not follow symlinks.
4
03.05.2018, 13:51
3 ответа

Вот мой собственный ответ, который был получен из идеи, представленной Филипе Бранденбургером, и из общих методов, используемых в системе Schily Makefile:

Система makefile гарантирует, что следующие make macrosнастроены таким образом:

WAIT=       # empty with GNU make
WAIT=.WAIT #.WAIT special target with SunPro Make

MAKEPROG= <name of the make program> # This is from: smake, gmake, sunpro

_UNIQ=.XxZzy-

Теперь make-файл, использующий приведенные выше определения макросов.:

_NORULE=    $(_UNIQ)$(MAKEPROG)
__NORULE=   $(_NORULE:$(_UNIQ)gmake=)
NORULE=     $(__NORULE:$(_UNIQ)%=%)

install: dir $(WAIT) dir/file

dir/file: source
        cp source dir/file

dir:
        mkdir -p dir

$(NORULE)dir/file: | dir

$(NORULE)расширяется до нуля с помощью gmake и до sunproс помощью SunPro Make.

В случае gmake весь make-файл расширяется до:

install: dir dir/file

dir/file: source
        cp source dir/file

dir:
        mkdir -p dir

dir/file: | dir

В случае SunPro Make весь make-файл расширяется до:

install: dir.WAIT dir/file

dir/file: source
        cp source dir/file

dir:
        mkdir -p dir

sunprodir/file: | dir

Последняя строка рассматривается как нежелательное правило, не имеющее отношения к делу.

1
27.01.2020, 20:47

В GNU make вы можете использовать порядок -только -предварительные условия , чтобы убедиться, что dirсоздан до запуска правила для создания dir/file.

Подробнее см. на этой странице .

Из примера в руководстве GNU make видно, что он действительно предназначен для добавления зависимости от создаваемого каталога перед созданием в нем файлов.

В случае вашего конкретного примера это должно делать что-то вроде этого:

dir/file: | dir
        cp source dir/file

Хотя вам не нужно изменять существующее правило, вы можете просто добавить эту зависимость где-нибудь еще в вашем Makefile...

To be more specific, the solution needs to be written in a way that allows the makefile to be processed with other make implementations.

Я не думаю, что это сработает в других реализациях make... Одно из возможных решений — создать GNUmakefile, который будетincludeфактическим Makefile, а также добавить специальные расширения GNU make.

Возможно, вы также могли бы заставить GNU make игнорировать такое правило, как .WAIT, определив его как фиктивное правило в вашем GNUmakefile.

Я надеюсь, что эти указатели будут вам полезны!

7
27.01.2020, 20:47

Нужно добавить зависимости, чтобы каталоги создавались раньше файлов в них.

Можно использовать «маркерный» файл для зависимости от каталога, таким образом, создание файла под ним не будет касаться временной метки каталога. Это также не требует каких-либо специальных функций GNU.

В вашем примере:

install: dir/file

dir/.marker:
        mkdir -p dir
        touch dir/.marker

dir/file: dir/.marker
        cp source dir/file

Вы можете использовать что-то вроде .directory, .dirили .folderдля файла маркера...

4
27.01.2020, 20:47

Теги

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