[devel] I: Makefile* для svn репозитария (was: apache2)
Aleksey Avdeev
solo на solin.spb.ru
Пт Фев 3 17:03:00 MSK 2006
Ivan Fedorov пишет:
> Sviatoslav Sviridov пишет:
>
...
>>
>> Какой subversion имеется ввиду?
>
>
> svn://malta.altlinux.ru/trunk/
Посмотрел я на него, и на
<http://wiki.sisyphus.ru/devel/SubversionForSPECS>... И решил, привести
свой репозитарий (<http://gaspar.ramax.lan/pub/svn/rpm/>) к подобному
виду. Структура уже успела устареть (рядом -- обсуждения более вкусных
вариантов), но Makefile* -- могут оказаться полезными.
Основные отличия:
1. Вместо подключения внешних репозитариев -- по make update
производится переключение <имя>/Makefile{,.common} (svn sw) на
svn-build-common/Makefile{,.common}.project соответствующего уровня. От
внешних ссылок отказался, т. к. не придумал как корректно разрулить
множественность путей к репозитарию: у меня репозитарий доступен под
разными адресами, и есть места где доступен только 1, без
альтернативный, вариант (в разных местах -- различный).
2. Имена файлов с исходниками/патчами -- выдираются из спека (rpm -bE).
3. Предусмотрена адаптация под условия конкретного пакета (через
Makefile.{pre,post})
3. make clean -- чистит всё, отсутствующее в svn.
Структура:
/trunk
/trunk/Makefile -- незначительно изменён относительно оригинала
(приложен как Makefile)
/trunk/svn-build-common -- Makefile* автоматизации (разработка)
/trunk/svn-build-common/Makefile.project -- оригинал Makefile проекта (
trunk/ProjectTemplate/Makefile). Приложен к письму.
/trunk/svn-build-common/Makefile.common.project -- оригинал
Makefile.common проекта ( trunk/ProjectTemplate/Makefile.common).
Приложен к письму.
/trunk/ProjectTemplate -- шаблон проекта (реальный проект -- его
рихованая копия)
/trunk/ProjectTemplate/Makefile -- копия Makefile.project
/trunk/ProjectTemplate/Makefile.common -- копия Makefile.common.project
/trunk/ProjectTemplate/Makefile.pre -- для подмены умолчаний (inсlude в
начале Makefile.common), может отсутствовать (по умолчанию -- список
переменных штатно допустимых к подмене). (Набор переменных рассчитан на
переименование/объединение подкаталогов, задание имени спека, и т. д..
;-)) Приложен к письму.
/trunk/ProjectTemplate/Makefile.post -- рихтовка по месту (inсlude в
конце Makefile.common), может отсутствовать (по умолчанию -- пуст).
/trunk/ProjectTemplate/incoming -- отправляемое в incoming (может
отсутствовать)
/trunk/ProjectTemplate/{S,}RPMS -- результаты сборки (могут отсутствовать)
/trunk/ProjectTemplate/{SPECS,SOURCES} -- обязательны
/branches/SubversionForSPECS -- бранчи элементов автоматизации
/branches/SubversionForSPECS/AntonFarygin -- честно украдено с
<svn://malta.altlinux.ru> (и
<http://wiki.sisyphus.ru/devel/SubversionForSPECS>) :-)
/branches/SubversionForSPECS/solo -- то что у меня вышло из вышележащего.
/tags/SubversionForSPECS
/tags/SubversionForSPECS/v0.2 -- версия без явных ошибок в Makefile.*
(apache2 -- у меня ими собрался)
--
С уважением. Алексей.
----------- следущая часть -----------
SUBDIRS = $(wildcard */)
clean_SUBDIRS = $(addprefix clean_SUBDIRS_, $(SUBDIRS))
.PHONY: all clean clean_all $(clean_SUBDIRS)
all:
clean: clean_all
clean_all: $(clean_SUBDIRS)
$(clean_SUBDIRS):
- $(MAKE) clean -C $(patsubst clean_SUBDIRS_%, %, $@)
----------- следущая часть -----------
# Standart Makefiles
SVNBINDCOMMON := svn-build-common/
MAKEFILES_NAME := Makefile Makefile.common
ST_MAKEFILES_NAME := $(addsuffix .project, $(MAKEFILES_NAME))
get_url = $(shell svn info $(1)|fgrep URL:|head -n 1|cut -f2 -d' ')
chk_name = $(filter $(1), $(notdir $(call get_url, $(1))))
URL := $(call get_url, .)
ST_URL := $(addprefix $(dir $(URL)), $(SVNBINDCOMMON))
sw_MAKEFILES_ALL := $(addprefix sw_MAKEFILE_, $(MAKEFILES_NAME))
sw_MAKEFILES := $(addprefix sw_MAKEFILE_, $(foreach makefile, $(MAKEFILES_NAME), \
$(call chk_name, $(makefile))))
.PHONY: update $(sw_MAKEFILES_ALL)
-include Makefile.common
update: $(sw_MAKEFILES)
svn update $(wildcard *)
$(sw_MAKEFILES_ALL):
svn sw $(addprefix $(ST_URL), $(addsuffix .project, \
$(patsubst sw_MAKEFILE_%, %, $@))) $(patsubst sw_MAKEFILE_%, %, $@)
----------- следущая часть -----------
-include Makefile.pre
TOPDIR := $(shell pwd)
PACKAGE := $(if $(strip $(PACKAGE)), $(firstword $(PACKAGE)), $(shell basename $(TOPDIR)))
SPECNAME := $(if $(strip $(SPECNAME)), $(firstword $(SPECNAME)), $(addsuffix .spec, ${PACKAGE}))
SPECDIR := $(if $(strip $(SPECDIR)), $(firstword $(SPECDIR)), SPECS)
SPEC := $(if $(strip $(SPEC)), $(firstword $(SPEC)), $(addprefix $(SPECDIR)/, $(SPECNAME)))
SOURCEDIR := $(if $(strip $(SOURCEDIR)), $(firstword $(SOURCEDIR)), SOURCES)
TMPDIR := $(if $(strip $(TMPDIR)), $(firstword $(TMPDIR)), TMP)
TMPEXPORTDIR := $(if $(strip $(TMPEXPORTDIR)), $(firstword $(TMPEXPORTDIR)), $(addprefix $(TMPDIR)/, export))
BUILDDIR := $(if $(strip $(BUILDDIR)), $(firstword $(BUILDDIR)), BUILD)
RPMDIR := $(if $(strip $(RPMDIR)), $(firstword $(RPMDIR)), RPM)
SRPMDIR := $(if $(strip $(SRPMDIR)), $(firstword $(SRPMDIR)), SRPM)
# rpm dirs
RPMTOPDIR := $(if $(strip $(RPMTOPDIR)), $(firstword $(RPMTOPDIR)), $(TOPDIR))
RPMTMPDIR := $(if $(strip $(RPMTMPDIR)), $(firstword $(RPMTMPDIR)), $(addprefix $(RPMTOPDIR)/, $(TMPDIR)))
RPMSOURCEDIR := $(if $(strip $(RPMSOURCEDIR)), $(firstword $(RPMSOURCEDIR)), \
$(addprefix $(RPMTOPDIR)/, $(SOURCEDIR)))
RPMBUILDDIR := $(if $(strip $(RPMBUILDDIR)), $(firstword $(RPMBUILDDIR)), $(addprefix $(RPMTOPDIR)/, $(BUILDDIR)))
RPMRPMDIR := $(if $(strip $(RPMRPMDIR)), $(firstword $(RPMRPMDIR)), $(addprefix $(RPMTOPDIR)/, $(RPMDIR)))
RPMSRPMDIR := $(if $(strip $(RPMSRPMDIR)), $(firstword $(RPMSRPMDIR)), $(addprefix $(RPMTOPDIR)/, $(SRPMDIR)))
.PHONY: all ba bs bp binary source buildreq tarball clean
# all target
all: $(SPEC) tarball
rpmbuild -ba \
--define "_topdir $(RPMTOPDIR)" --define "_tmpdir $(RPMTMPDIR)" \
--define "_sourcedir $(RPMSOURCEDIR)" --define "_builddir $(RPMBUILDDIR)" \
--define "_rpmdir $(RPMRPMDIR)" --define "_srcrpmdir $(RPMSRPMDIR)" $(SPEC)
ba: all
bs: source
bb: binary
bp: $(SPEC) tarball
rpmbuild -bp \
--define "_topdir $(RPMTOPDIR)" --define "_tmpdir $(RPMTMPDIR)" \
--define "_sourcedir $(RPMSOURCEDIR)" --define "_builddir $(RPMBUILDDIR)" \
--define "_rpmdir $(RPMRPMDIR)" --define "_srcrpmdir $(RPMSRPMDIR)" $(SPEC)
binary: $(SPEC) tarball
rpmbuild -bb \
--define "_topdir $(RPMTOPDIR)" --define "_tmpdir $(RPMTMPDIR)" \
--define "_sourcedir $(RPMSOURCEDIR)" --define "_builddir $(RPMBUILDDIR)" \
--define "_rpmdir $(RPMRPMDIR)" --define "_srcrpmdir $(RPMSRPMDIR)" $(SPEC)
source: $(SPEC) tarball
rpmbuild -bs \
--define "_topdir $(RPMTOPDIR)" --define "_tmpdir $(RPMTMPDIR)" \
--define "_sourcedir $(RPMSOURCEDIR)" --define "_builddir $(RPMBUILDDIR)" \
--define "_rpmdir $(RPMRPMDIR)" --define "_srcrpmdir $(RPMSRPMDIR)" $(SPEC)
buildreq: $(SPEC) tarball
buildreq --args=" \
--define \"_topdir $(RPMTOPDIR)\" --define \"_tmpdir $(RPMTMPDIR)\" \
--define \"_sourcedir $(RPMSOURCEDIR)\" --define \"_builddir $(RPMBUILDDIR)\" \
--define \"_rpmdir $(RPMRPMDIR)\" --define \"_srcrpmdir $(RPMSRPMDIR)\"" $(SPEC)
SUBDIRS = $(wildcard $(SOURCEDIR) $(BUILDDIR) $(RPMDIR) $(SRPMDIR) $(TMPDIR))
CLEANS = $(foreach name, $(sort $(addsuffix /*, $(SUBDIRS)) $(SUBDIRS) $(wildcard *)), \
$(if $(strip $(call get_url, $(name))), , $(name)))
clean:
rm -Rf $(CLEANS)
ifneq ($(strip $(wildcard $(SPEC))), )
SPECURLSORCES := $(shell rpm -bE $(SPEC) 2>/dev/null | \
sed -n -e '/^Source[0-9]*\:/{s/^Source[0-9]*:[[:space:]]*//;p}')
SPECSORCES := $(notdir $(SPECURLSORCES))
SPECURLPATCHS := $(shell rpm -bE $(SPEC) 2>/dev/null | \
sed -n -e '/^Patch[0-9]*\:/{s/^Patch[0-9]*:[[:space:]]*//;p}')
SPECPATCHS := $(notdir $(SPECURLPATCHS))
SOURCE := $(addprefix $(RPMSOURCEDIR)/, $(SPECSORCES) $(SPECPATCHS))
UNCOMPRESSED := $(if $(strip $(UNCOMPRESSED)), $(firstword $(UNCOMPRESSED)), UNCOMPRESSED)
ifneq ($(strip $(wildcard $(UNCOMPRESSED))), )
VERSION := $(shell rpm -q --specfile --qf "%{VERSION}\n" $(SPEC)|head -1)
TARBASENAME := $(addprefix $(PACKAGE)-, $(VERSION))
TAR := $(addprefix $(RPMSOURCEDIR)/, $(addsuffix .tar.bz2, $(TARBASENAME)))
$(TAR):
- rm -Rf $(TMPEXPORTDIR)
mkdir -p $(TMPEXPORTDIR)
svn export $(call get_url, $(UNCOMPRESSED)) $(addprefix $(TMPEXPORTDIR)/, $(TARBASENAME))
pushd $(TMPEXPORTDIR);tar cvfj $@ $(TARBASENAME);popd
endif
endif
tarball: $(SOURCE)
mkdir -p $(TMPEXPORTDIR)
$(SPEC):
$(error "No spec: $@")
-include Makefile.post
----------- следущая часть -----------
# Consts for Makefile.common
PACKAGE :=
SPECNAME :=
SPECDIR :=
SPEC :=
SOURCEDIR :=
TMPDIR :=
TMPEXPORTDIR :=
BUILDDIR :=
RPMDIR :=
SRPMDIR :=
# rpm dirs
RPMTOPDIR :=
RPMTMPDIR :=
RPMSOURCEDIR :=
RPMBUILDDIR :=
RPMRPMDIR :=
RPMSRPMDIR :=
Подробная информация о списке рассылки Devel