GNU make: скрипты сборки и управления проектом

dirModule: модуль проекта

## create defaut Makefile
    def init_mk(self):
        self.diroot['mk'] = self.mk = Makefile()
        self['mk'] = self.mk
        self.diroot // self.mk
        # vars
        self.mk['vars'] = self.mk.vars = Section('vars')
        self.mk.top // self.mk.vars
        self.mk['module'] = self.mk.module = Section('module', comment='')
        self.mk.module // f'{"MODULE":<8} = $(notdir $(CURDIR))'
        self.mk.vars // self.mk.module
        self.mk.vars // f'{"OS":<7} ?= $(shell uname -s)'
        # version
        self.mk['version'] = self.mk.version = Section('version')
        self.mk.top // self.mk.version
        self.mk.version // f'{"NOW":<8} = $(shell date +%d%m%y)'
        self.mk.version // f'{"REL":<8} = $(shell git rev-parse --short=4 HEAD)'
        # dirs
        self.mk['dirs'] = self.mk.dirs = Section('dirs')
        self.mk.top // self.mk.dirs
        self.mk.dirs // f'{"CWD":<8} = $(CURDIR)'
        self.mk.dirs // f'{"TMP":<8} = $(CWD)/tmp'
        self.mk.dirs // f'{"SOURCE":<8} = $(TMP)/src'
        # tools
        self.mk['tools'] = self.mk.tools = Section('tools')
        self.mk.top // self.mk.tools
        self.mk.tools // f'{"WGET":<8} = wget -c --no-check-certificate'
        self.mk.tools // f'{"CORES":<8} = $(shell grep proc /proc/cpuinfo|wc -l)'
        self.mk.tools // f'{"XMAKE":<8} = $(XPATH) $(MAKE) -j$(CORES)'
        # src
        self.mk.src = self['src'] = Section('src')
        self.mk.mid // self.mk.src
        # obj
        self.mk.obj = self['obj'] = Section('obj')
        self.mk.mid // self.mk.obj
        # all
        self.mk.all = self['all'] = Section('all')
        self.mk.mid // self.mk.all
        # install/update
        self.mk['install'] = self.mk.install = Section('install')
        self.mk.bot // self.mk.install
        self.mk.install //\\
            '.PHONY: install' //\\
            (S('install:') //
             '$(MAKE) $(OS)_install')
        self.mk['update'] = self.mk.update = Section('update')
        self.mk.bot // self.mk.update
        self.mk.update // '.PHONY: update'
        self.mk.update // 'update:\\n\\t$(MAKE) $(OS)_update'
        self.mk['linux'] = self.mk.linux = Section('linux/install')
        self.mk.bot // self.mk.linux
        self.mk.linux // '.PHONY: Linux_install Linux_update'
        self.mk.linux // 'Linux_install Linux_update:'
        self.mk.linux // '\\tsudo apt update'
        self.mk.linux // '\\tsudo apt install -u `cat apt.txt`'
        # merge master/shadow
        self.mk['merge'] = self.mk.merge = Section('merge')
        self.mk.bot // self.mk.merge
        self.mk.merge // 'MERGE  = Makefile apt.txt .gitignore'
        self.mk.merge // 'MERGE += README.md'
        # master
        self.mk.bot // 'master:'
        self.mk.bot // '\\tgit checkout $@'
        self.mk.bot // '\\tgit pull -v'
        self.mk.bot // '\\tgit checkout shadow -- $(MERGE)'
        # shadow
        self.mk.bot // 'shadow:'
        self.mk.bot // '\\tgit checkout $@'
        self.mk.bot // '\\tgit pull -v'
        # release
        self.mk.bot // 'release:'
        self.mk.bot // '\\tgit tag $(NOW)-$(REL)'
        self.mk.bot // '\\tgit push -v && git push -v --tags'
        self.mk.bot // '\\t$(MAKE) shadow'
        #
        self.mk.sync()

переменные проекта

# \\ <section:vars>
# модуль по имени текущего каталога
MODULE   = $(notdir $(CURDIR))
# тип операционной системы
OS      ?= $(shell uname -s)
# / <section:vars>

# метка версии и git hash для именования текущего релиза ПО
# \\ <section:version>
NOW      = $(shell date +%d%m%y)
REL      = $(shell git rev-parse --short=4 HEAD)
# / <section:version>

каталоги проекта

# каталоги
# \\ <section:dirs>
# текущий
CWD      = $(CURDIR)
# бинарные файлы проекта
# (кросс-компиляторы, программы как результат компиляции модуля)
BIN      = $(CWD)/bin
# временный для проекта (сборка ПО из исходного кода, временнные файлы)
TMP      = $(CWD)/tmp
# каталог для распаковки исходного кода программ при сборке из исходников
SOURCE   = $(TMP)/src
# / <section:dirs>

типовые утилиты и переменные для их запуска

# переменные для вызова типовых утилит
# \\ <section:tools>
WGET     = wget -c --no-check-certificate
# число ядер процессора используется для параллельной сборки ПО
CORES    = $(shell grep proc /proc/cpuinfo|wc -l)
# XPATH -- путь к бинарным файлам проекта
# (кросс-компиляторы, программы как результат компиляции модуля)
XPATH    = PATH=$(BIN):$(PATH)
# запуск GNU make в параллельном режиме
XMAKE    = $(XPATH) $(MAKE) -j$(CORES)
# / <section:tools>

набор переменной со всеми файлами с исходным кодом

# \\ <section:src>
SRC += metaL.py
SRC += $(MODULE).py
# / <section:src>

секция для make all

# \\ <section:all>
.PHONY: all
all: $(MODULE) ar gu ments
	./$^
# / <section:all>

$(MODULE): $(MODULE).c $(MODULE).h
	$(CC) $(CFLAGS) -o $@ $<

установка ПО необходимого для сборки/запуска проекта

# \\ <section:install>
.PHONY: install
install:
	$(MAKE) $(OS)_install
	$(MAKE) $(PIP)
	$(PIP) install    -r requirements.txt
	$(MAKE) js
	$(MAKE) migrate
	$(MAKE) createsuperuser
# / <section:install>
# \\ <section:update>
.PHONY: update
update:
	$(MAKE) $(OS)_update
	$(PIP) install -U    pip
	$(PIP) install -U -r requirements.txt
# / <section:update>

установка пакетов для Debian Linux (основная рабочая система)

# \\ <section:install>
.PHONY: install
install:
	$(MAKE) $(OS)_install
	$(MAKE) $(PIP)
	$(PIP) install    -r requirements.txt
	$(MAKE) js
	$(MAKE) migrate
	$(MAKE) createsuperuser
# / <section:install>
# \\ <section:update>
.PHONY: update
update:
	$(MAKE) $(OS)_update
	$(PIP) install -U    pip
	$(PIP) install -U -r requirements.txt
# / <section:update>

MERGE-секция Makefile