Как документировать make-файл? - PullRequest
7 голосов
/ 17 января 2012

Есть ли способ написать «стандартные» комментарии в Makefile, чтобы потом передать их в программу, подобную Doxygen, чтобы выводить хорошую документацию (например, HTML или man)?Я хотел бы получить четкий обзор моих основных целей где-нибудь, но ничего особенного.

Ответы [ 4 ]

6 голосов
/ 17 января 2012

Одним приятным прикосновением является предоставление фиктивной help цели, которая печатает сводку целей и параметров. Из ядра Linux Makefile:

help:
        @echo  'Cleaning targets:'
        @echo  '  clean           - Remove most generated files but keep the config and'
        @echo  '                    enough build support to build external modules'
        @echo  '  mrproper        - Remove all generated files + config + various backup files'
        @echo  '  distclean       - mrproper + remove editor backup and patch files'
        @echo  ''
        @echo  'Configuration targets:'
        @$(MAKE) -f $(srctree)/scripts/kconfig/Makefile help
        @echo  ''

Может быть, нужно немного поработать над документацией, но я считаю, что она хорошо отделяет то, что предназначено для "пользователей", от того, что предназначено для людей, поддерживающих само Makefile (встроенные комментарии).

2 голосов
/ 04 ноября 2017

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

# This is a regular comment, that will not be displayed

## ----------------------------------------------------------------------
## This is a help comment. The purpose of this Makefile is to demonstrate
## a simple help mechanism that uses comments defined alongside the rules
## they describe without the need of additional help files or echoing of
## descriptions. Help comments are displayed in the order defined within
## the Makefile.
## ----------------------------------------------------------------------

help:     ## Show this help.
    @sed -ne '/@sed/!s/## //p' $(MAKEFILE_LIST)

build:    ## Build something.

install:  ## Install something.

deploy:   ## Deploy something.

format:   ## Help comments are display with their leading whitespace. For
          ## example, all comments in this snippet are aligned with spaces.

Запуск make или make help приводит к следующему:

----------------------------------------------------------------------
This is a help comment. The purpose of this Makefile is to demonstrate
a simple help mechanism that uses comments defined alongside the rules
they describe without the need of additional help files or echoing of
descriptions. Help comments are displayed in the order defined within
the Makefile.
----------------------------------------------------------------------
help:     Show this help.
build:    Build something.
install:  Install something.
deploy:   Deploy something.
format:   Help comments are display with their leading whitespace. For
          example, all comments in this snippet are aligned with spaces.
2 голосов
/ 12 июня 2015

Я создал собственное решение, используя короткий Perl-скрипт, который форматирует справку как другие инструменты GNU:

SCRIPT_VERSION=v1.0
SCRIPT_AUTHOR=John Doe

all:                ##@Build Build all the project 

clean:              ##@Cleaning Remove all intermediate objects

mrproper: clean     ##@Cleaning Remove all output and interemediate objects

HELP_FUN = \
    %help; while(<>){push@{$$help{$$2//'options'}},[$$1,$$3] \
    if/^([\w-_]+)\s*:.*\#\#(?:@(\w+))?\s(.*)$$/}; \
    print"$$_:\n", map"  $$_->[0]".(" "x(20-length($$_->[0])))."$$_->[1]\n",\
    @{$$help{$$_}},"\n" for keys %help; \

help: ##@Miscellaneous Show this help
    @echo -e "Usage: make [target] ...\n"
    @perl -e '$(HELP_FUN)' $(MAKEFILE_LIST)
    @echo -e "Written by $(SCRIPT_AUTHOR), version $(SCRIPT_VERSION)"
    @echo -e "Please report any bug or error to the author." 

Что дает это:

$ make help
Usage: make [target] ...

Miscellaneous:
  help                Show this help

Build:
  all                 Build all the project

Cleaning:
  clean               Remove all intermediate objects
  mrproper            Remove all output and interemediate objects

Written by John Doe, version v1.0
Please report any bug or error to the author.
1 голос
/ 31 марта 2015

Самодокументированные файлы Makefile (Джон Грэм-Камминг, 2005) позволяет написать справку вместе с каждым правилом. Это легкое и изящное решение, которое работает по крайней мере с GNU Make.

Вот моя слегка измененная версия (def-help-section помогает организовать длинные списки правил).

...