GNU make: скрипты сборки и управления проектом
apt.txt
## 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>
# \\ <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>
Makefile