Files
weewx/makefile
Tom Keffer 6cd5dc91f6 Refactor, using 'src' instead of 'bin' to hold the source code.
wee_resources becomes weewx_data, and is put in version control.
The build documentation, as well as the 'user' subdirectory, are now
in it.

This allows weewxd to be run directly from the git repository for
two reasons: 1) the documentation does not have to be built first.
2) because the source code is now under 'src', while the 'user'
subdirectory is in weewx_data, weewxd does not accidentally pick
up the repository's version of the 'user' subdirectory.
2023-10-17 05:14:34 -07:00

488 lines
17 KiB
Makefile

# -*- makefile -*-
# this makefile controls the build and packaging of weewx
# Copyright 2013-2023 Matthew Wall
# if you do not want to sign the packages, set SIGN to 0
SIGN=1
# WWW server
WEEWX_COM:=weewx.com
# location of the html documentation
WEEWX_HTMLDIR=/var/www/html
# location of weewx downloads
WEEWX_DOWNLOADS=$(WEEWX_HTMLDIR)/downloads
# location for staging weewx package uploads
WEEWX_STAGING=$(WEEWX_HTMLDIR)/downloads/development_versions
# Location of doc sources
DOC_SRC=docs_src
# Location of built docs
DOC_BUILT=src/weewx_data/docs
# Location of the skins
SKINLOC=src/weewx_data/skins
# extract version to be used in package controls and labels
VERSION:=$(shell sed -ne 's/^version = "\(.*\)"/\1/p;' pyproject.toml)
# just the major.minor part of the version
MMVERSION:=$(shell echo "$(VERSION)" | sed -e 's%.[0-9a-z]*$$%%')
CWD=$(shell pwd)
BLDDIR=build
DSTDIR=dist
SRCPKG=weewx-$(VERSION).tgz
WHEELSRC=weewx-$(VERSION).tar.gz
WHEEL=weewx-$(VERSION)-py3-none-any.whl
PYTHON?=python3
TMPDIR?=/var/tmp
all: help
help: info
@echo "options include:"
@echo " info display values of variables we care about"
@echo " version get version from pyproject.toml and insert elsewhere"
@echo ""
@echo " deb-changelog prepend stub changelog entry for deb"
@echo " redhat-changelog prepend stub changelog entry for redhat"
@echo " suse-changelog prepend stub changelog entry for suse"
@echo ""
@echo " pypi-packages create wheel and source tarball suitable for pypi"
@echo "debian-package create the debian package"
@echo "redhat-package create the redhat package"
@echo " suse-package create the suse package"
@echo ""
@echo " check-deb check the deb package"
@echo " check-rpm check the rpm package"
@echo " check-docs run weblint on the docs"
@echo ""
@echo " upload-src upload the src package to $(WEEWX_COM)"
@echo " upload-pypi upload wheel and src package to pypi.org"
@echo " upload-debian upload the debian deb package"
@echo " upload-redhat upload the redhat rpm packages"
@echo " upload-suse upload the suse rpm packages"
@echo ""
@echo " build-docs build the docs using mkdocs"
@echo " upload-docs upload docs to $(WEEWX_COM)"
@echo ""
@echo " release promote staged files on the download server"
@echo ""
@echo " test run all unit tests"
@echo " SUITE=path/to/foo.py to run only foo tests"
@echo " test-clean remove test databases"
@echo ""
@echo " apt repository management"
@echo " pull-apt-repo"
@echo " update-apt-repo"
@echo " push-apt-repo"
@echo ""
@echo " yum repository management"
@echo " pull-yum-repo"
@echo " update-yum-repo"
@echo " push-yum-repo"
@echo ""
@echo " suse repository management"
@echo " pull-suse-repo"
@echo " update-suse-repo"
@echo " push-suse-repo"
@echo ""
info:
@echo " VERSION: $(VERSION)"
@echo " MMVERSION: $(MMVERSION)"
@echo " PYTHON: $(PYTHON)"
@echo " CWD: $(CWD)"
@echo " USER: $(USER)"
@echo " WEEWX_COM: $(WEEWX_COM)"
@echo " WEEWX_STAGING: $(WEEWX_STAGING)"
@echo " DOC_SRC: $(DOC_SRC)"
@echo " DOC_BUILT: $(DOC_BUILT)"
@echo " SKINLOC: $(SKINLOC)"
@echo ""
clean:
find src -name "*.pyc" -exec rm {} \;
find src -name "__pycache__" -prune -exec rm -rf {} \;
rm -rf $(BLDDIR) $(DSTDIR)
realclean: clean
rm -rf $(DOC_BUILT)
###############################################################################
# update the version in all relevant places
VCONFIGS=src/weewx_data/weewx.conf src/weecfg/tests/expected/weewx43_user_expected.conf
VSKINS=Ftp/skin.conf Mobile/skin.conf Rsync/skin.conf Seasons/skin.conf Smartphone/skin.conf Standard/skin.conf
version:
sed -e "s/^site_name.*/site_name: \'WeeWX $(MMVERSION)\'/" mkdocs.yml > mkdocs.yml.tmp; mv mkdocs.yml.tmp mkdocs.yml
for f in $(VCONFIGS); do \
sed -e 's/version = [0-9].*/version = $(VERSION)/' $$f > $$f.tmp; \
mv $$f.tmp $$f; \
done
for f in $(VSKINS); do \
sed -e 's/^SKIN_VERSION = [0-9].*/SKIN_VERSION = $(VERSION)/' $(SKINLOC)/$$f > $(SKINLOC)/$$f.tmp; \
mv $(SKINLOC)/$$f.tmp $(SKINLOC)/$$f; \
done
sed -e 's/__version__ *=.*/__version__ = "$(VERSION)"/' src/weewx/__init__.py > weeinit.py.tmp
mv weeinit.py.tmp src/weewx/__init__.py
###############################################################################
## testing targets
# if no suite is specified, find all test suites in the source tree
SUITE?=`find src -name "test_*.py"`
test: src/weewx_data/
@rm -f $(BLDDIR)/test-results
@mkdir -p $(BLDDIR)
@echo "Python interpreter in use:" >> $(BLDDIR)/test-results 2>&1;
@$(PYTHON) -c "import sys;print(sys.executable+'\n')" >> $(BLDDIR)/test-results 2>&1;
@for f in $(SUITE); do \
echo running $$f; \
echo $$f >> $(BLDDIR)/test-results; \
PYTHONPATH="src:src/weewx_data/examples:src/weewx/tests" $(PYTHON) $$f >> $(BLDDIR)/test-results 2>&1; \
echo >> $(BLDDIR)/test-results; \
done
@grep "ERROR:\|FAIL:" $(BLDDIR)/test-results || echo "no failures"
@grep "skipped=" $(BLDDIR)/test-results || echo "no tests were skipped"
@echo "see $(BLDDIR)/test-results for output from the tests"
@grep -q "ERROR:\|FAIL:" $(BLDDIR)/test-results && exit 1 || true
test-setup:
src/weedb/tests/setup_mysql.sh
test-setup-ci:
MYSQL_NO_OPTS=1 src/weedb/tests/setup_mysql.sh
TESTDIR=/var/tmp/weewx_test
MYSQLCLEAN="drop database test_weewx;\n\
drop database test_alt_weewx;\n\
drop database test_sim;\n\
drop database test_weewx1;\n\
drop database test_weewx2;\n\
drop database test_scratch;\n"
test-clean:
rm -rf $(TESTDIR)
echo $(MYSQLCLEAN) | mysql --user=weewx --password=weewx --force >/dev/null 2>&1
###############################################################################
## documentation targets
# Build the documentation:
build-docs: $(DOC_BUILT)
$(DOC_BUILT): $(shell find $(DOC_SRC) -type f)
@rm -r $(DOC_BUILT)
@mkdir -p $(DOC_BUILT)
@echo "Building documents"
$(PYTHON) -m mkdocs --quiet build --site-dir=$(DOC_BUILT)
check-docs:
weblint $(DOC_BUILT)/*.htm
# upload docs to the web site
upload-docs: $(DOC_BUILT)
rsync -Orv --delete --exclude *~ --exclude "#*" $(DOC_BUILT)/ $(USER)@$(WEEWX_COM):$(WEEWX_HTMLDIR)/docs/$(MMVERSION)
###############################################################################
## source targets
src-tarball: $(DSTDIR)/$(SRCPKG)
$(DSTDIR)/$(SRCPKG):
mkdir -p $(BLDDIR)/weewx-$(VERSION)
rsync -ar ./ $(BLDDIR)/weewx-$(VERSION) --exclude-from .gitignore --exclude .git --exclude .editorconfig --exclude .idea --exclude .github --exclude .gitignore
mkdir -p $(DSTDIR)
tar cfz $(DSTDIR)/$(SRCPKG) -C $(BLDDIR) weewx-$(VERSION)
# upload the source tarball to the web site
upload-src:
scp $(DSTDIR)/$(SRCPKG) $(USER)@$(WEEWX_COM):$(WEEWX_STAGING)
###############################################################################
## pypi targets
pypi-packages $(DSTDIR)/$(WHEELSRC) $(DSTDIR)/$(WHEEL): pyproject.toml
poetry build
# Upload wheel and src package to pypi.org
upload-pypi: $(DSTDIR)/$(WHEELSRC) $(DSTDIR)/$(WHEEL)
poetry publish
###############################################################################
## debian targets
DEBREVISION=1
DEBVER=$(VERSION)-$(DEBREVISION)
# add a skeleton entry to deb changelog
deb-changelog:
if [ "`grep $(DEBVER) pkg/debian/changelog`" = "" ]; then \
pkg/mkchangelog.pl --action stub --format debian --release-version $(DEBVER) > pkg/debian/changelog.new; \
cat pkg/debian/changelog >> pkg/debian/changelog.new; \
mv pkg/debian/changelog.new pkg/debian/changelog; \
fi
# use dpkg-buildpackage to create the debian package
# -us -uc - skip gpg signature on .dsc and .changes
# the latest version in the debian changelog must match the packaging version
DEBARCH=all
DEBBLDDIR=$(BLDDIR)/weewx-$(VERSION)
DEBPKG=weewx_$(DEBVER)_$(DEBARCH).deb
ifneq ("$(SIGN)","1")
DPKG_OPT=-us -uc
endif
debian-package: build-docs deb-package-prep
cp pkg/debian/control $(DEBBLDDIR)/debian/control
rm -f $(DEBBLDDIR)/debian/files
rm -rf $(DEBBLDDIR)/debian/weewx*
(cd $(DEBBLDDIR); dpkg-buildpackage $(DPKG_OPT))
mkdir -p $(DSTDIR)
mv $(BLDDIR)/$(DEBPKG) $(DSTDIR)/python3-$(DEBPKG)
deb-package-prep: $(DSTDIR)/$(SRCPKG)
mkdir -p $(DEBBLDDIR)
cp -p $(DSTDIR)/$(SRCPKG) $(BLDDIR)/weewx_$(VERSION).orig.tar.gz
rm -rf $(DEBBLDDIR)/debian
mkdir -m 0755 $(DEBBLDDIR)/debian
mkdir -m 0755 $(DEBBLDDIR)/debian/source
cp pkg/debian/changelog $(DEBBLDDIR)/debian
cp pkg/debian/compat $(DEBBLDDIR)/debian
cp pkg/debian/conffiles $(DEBBLDDIR)/debian
cp pkg/debian/config $(DEBBLDDIR)/debian
cp pkg/debian/copyright $(DEBBLDDIR)/debian
cp pkg/debian/postinst $(DEBBLDDIR)/debian
cp pkg/debian/postrm $(DEBBLDDIR)/debian
cp pkg/debian/preinst $(DEBBLDDIR)/debian
cp pkg/debian/prerm $(DEBBLDDIR)/debian
cp pkg/debian/rules $(DEBBLDDIR)/debian
cp pkg/debian/source/format $(DEBBLDDIR)/debian/source
cp pkg/debian/templates $(DEBBLDDIR)/debian
# run lintian on the deb package
check-deb:
lintian -Ivi $(DSTDIR)/$(DEBPKG)
upload-debian:
scp $(DSTDIR)/python3-$(DEBPKG) $(USER)@$(WEEWX_COM):$(WEEWX_STAGING)
###############################################################################
## rpm targets
# specify the operating system release target (e.g., 7 for centos7)
OSREL=
# specify the operating system label (e.g., el, suse)
RPMOS=$(shell if [ -f /etc/SuSE-release -o -f /etc/SUSE-brand ]; then echo suse; elif [ -f /etc/redhat-release ]; then echo el; else echo os; fi)
RPMREVISION=1
RPMVER=$(VERSION)-$(RPMREVISION)
# add a skeleton entry to rpm changelog
rpm-changelog:
if [ "`grep $(RPMVER) pkg/changelog.$(RPMOS)`" = "" ]; then \
pkg/mkchangelog.pl --action stub --format redhat --release-version $(RPMVER) > pkg/changelog.$(RPMOS).new; \
cat pkg/changelog.$(RPMOS) >> pkg/changelog.$(RPMOS).new; \
mv pkg/changelog.$(RPMOS).new pkg/changelog.$(RPMOS); \
fi
# use rpmbuild to create the rpm package
# specify the architecture (always noarch)
RPMARCH=noarch
RPMBLDDIR=$(BLDDIR)/weewx-$(RPMVER).$(RPMOS)$(OSREL).$(RPMARCH)
RPMPKG=weewx-$(RPMVER).$(RPMOS)$(OSREL).$(RPMARCH).rpm
rpm-package: build-docs $(DSTDIR)/$(SRCPKG)
rm -rf $(RPMBLDDIR)
mkdir -p -m 0755 $(RPMBLDDIR)
mkdir -p -m 0755 $(RPMBLDDIR)/BUILD
mkdir -p -m 0755 $(RPMBLDDIR)/BUILDROOT
mkdir -p -m 0755 $(RPMBLDDIR)/RPMS
mkdir -p -m 0755 $(RPMBLDDIR)/SOURCES
mkdir -p -m 0755 $(RPMBLDDIR)/SPECS
mkdir -p -m 0755 $(RPMBLDDIR)/SRPMS
sed -e 's%Version:.*%Version: $(VERSION)%' \
-e 's%RPMREVISION%$(RPMREVISION)%' \
-e 's%OSREL%$(OSREL)%' \
pkg/weewx.spec.in > $(RPMBLDDIR)/SPECS/weewx.spec
cat pkg/changelog.$(RPMOS) >> $(RPMBLDDIR)/SPECS/weewx.spec
cp $(DSTDIR)/$(SRCPKG) $(RPMBLDDIR)/SOURCES/weewx-$(VERSION).tar.gz
rpmbuild -ba --clean --define '_topdir $(CWD)/$(RPMBLDDIR)' --target noarch $(CWD)/$(RPMBLDDIR)/SPECS/weewx.spec
mkdir -p $(DSTDIR)
mv $(RPMBLDDIR)/RPMS/$(RPMARCH)/$(RPMPKG) $(DSTDIR)
# mv $(RPMBLDDIR)/SRPMS/weewx-$(RPMVER).$(RPMOS)$(OSREL).src.rpm $(DSTDIR)
ifeq ("$(SIGN)","1")
rpm --addsign $(DSTDIR)/$(RPMPKG)
# rpm --addsign $(DSTDIR)/weewx-$(RPMVER).$(RPMOS)$(OSREL).src.rpm
endif
redhat-changelog:
make rpm-changelog RPMOS=el
redhat-package:
make rpm-package RPMOS=el OSREL=8
suse-changelog:
make rpm-changelog RPMOS=suse
suse-packages: rpm-package-suse12 rpm-package-suse15
rpm-package-suse12:
make rpm-package RPMOS=suse OSREL=12
rpm-package-suse15:
make rpm-package RPMOS=suse OSREL=15
# run rpmlint on the rpm package
check-rpm:
rpmlint $(DSTDIR)/$(RPMPKG)
upload-rpm:
scp $(DSTDIR)/$(RPMPKG) $(USER)@$(WEEWX_COM):$(WEEWX_STAGING)
upload-redhat:
make upload-rpm RPMOS=el OSREL=7
make upload-rpm RPMOS=el OSREL=8
upload-suse:
make upload-rpm RPMOS=suse OSREL=12
make upload-rpm RPMOS=suse OSREL=15
# shortcut to upload all packages from a single machine
DEB2_PKG=python-weewx_$(DEBVER)_$(DEBARCH).deb
DEB3_PKG=python3-weewx_$(DEBVER)_$(DEBARCH).deb
RHEL7_PKG=weewx-$(RPMVER).el7.$(RPMARCH).rpm
RHEL8_PKG=weewx-$(RPMVER).el8.$(RPMARCH).rpm
SUSE12_PKG=weewx-$(RPMVER).suse12.$(RPMARCH).rpm
SUSE15_PKG=weewx-$(RPMVER).suse15.$(RPMARCH).rpm
upload-pkgs:
scp $(DSTDIR)/$(SRCPKG) $(DSTDIR)/$(DEB2_PKG) $(DSTDIR)/$(DEB3_PKG) $(DSTDIR)/$(RHEL7_PKG) $(DSTDIR)/$(RHEL8_PKG) $(DSTDIR)/$(SUSE12_PKG) $(DSTDIR)/$(SUSE15_PKG) $(USER)@$(WEEWX_COM):$(WEEWX_STAGING)
# move files from the upload directory to the release directory and set up the
# symlinks to them from the download root directory
DEVDIR=$(WEEWX_DOWNLOADS)/development_versions
RELDIR=$(WEEWX_DOWNLOADS)/released_versions
ARTIFACTS=$(DEB2_PKG) $(DEB3_PKG) $(RHEL7_PKG) $(RHEL8_PKG) $(SUSE12_PKG) $(SUSE15_PKG) $(SRCPKG)
release:
ssh $(USER)@$(WEEWX_COM) "for f in $(ARTIFACTS); do if [ -f $(DEVDIR)/\$$f ]; then mv $(DEVDIR)/\$$f $(RELDIR); fi; done"
ssh $(USER)@$(WEEWX_COM) "rm -f $(WEEWX_DOWNLOADS)/weewx*"
ssh $(USER)@$(WEEWX_COM) "if [ -f $(RELDIR)/$(SRCPKG) ]; then ln -s released_versions/$(SRCPKG) $(WEEWX_DOWNLOADS); fi"
ssh $(USER)@$(WEEWX_COM) "chmod 664 $(WEEWX_DOWNLOADS)/released_versions/weewx?$(VERSION)*"
###############################################################################
## repository management targets
# this is only used when creating a new apt repository from scratch
# the .html and .list files are not part of an official apt repository. they
# are included to make the repository self-documenting.
apt-repo:
aptly repo create -distribution=squeeze -component=main -architectures=all python2-weewx
aptly repo create -distribution=buster -component=main -architectures=all python3-weewx
mkdir -p ~/.aptly/public
cp -p pkg/index-apt.html ~/.aptly/public/index.html
cp -p pkg/weewx-python2.list ~/.aptly/public
cp -p pkg/weewx-python3.list ~/.aptly/public
# this is for backward-compatibility when there was not python2/3 distinction
cp -p pkg/weewx-python2.list ~/.aptly/public/weewx.list
# these are for backward-compatibility for users that do not have python2 or
# python3 in the paths in their .list file - default to python2
ln -s python2/dists ~/.aptly/public
ln -s python2/pool ~/.aptly/public
# make local copy of the published apt repository
pull-apt-repo:
mkdir -p ~/.aptly
rsync -Oarvz $(USER)@$(WEEWX_COM):$(WEEWX_HTMLDIR)/aptly/ ~/.aptly
# add the latest version to the local apt repo using aptly
update-apt-repo:
aptly repo add python3-weewx $(DSTDIR)/python3-$(DEBPKG)
aptly snapshot create python3-weewx-$(DEBVER) from repo python3-weewx
aptly publish drop buster python3
aptly publish -architectures=all snapshot python3-weewx-$(DEBVER) python3
# aptly publish switch buster python3 python3-weewx-$(DEBVER)
# publish apt repo changes to the public weewx apt repo
push-apt-repo:
find ~/.aptly -type f -exec chmod 664 {} \;
find ~/.aptly -type d -exec chmod 2775 {} \;
rsync -Ortlvz ~/.aptly/ $(USER)@$(WEEWX_COM):$(WEEWX_HTMLDIR)/aptly-test
# copy the testing repository onto the production repository
release-apt-repo:
ssh $(USER)@$(WEEWX_COM) "rsync -Ologrvz /var/www/html/aptly-test/ /var/www/html/aptly"
YUM_REPO=~/.yum/weewx
yum-repo:
mkdir -p $(YUM_REPO)/{el7,el8}/RPMS
cp -p pkg/index-yum.html ~/.yum/index.html
cp -p pkg/weewx-el7.repo ~/.yum
cp -p pkg/weewx-el8.repo ~/.yum
pull-yum-repo:
mkdir -p $(YUM_REPO)
rsync -Oarvz $(USER)@$(WEEWX_COM):$(WEEWX_HTMLDIR)/yum/ ~/.yum
update-yum-repo:
cp -p $(DSTDIR)/weewx-$(RPMVER).el7.$(RPMARCH).rpm $(YUM_REPO)/el7/RPMS
createrepo $(YUM_REPO)/el7
cp -p $(DSTDIR)/weewx-$(RPMVER).el8.$(RPMARCH).rpm $(YUM_REPO)/el8/RPMS
createrepo $(YUM_REPO)/el8
push-yum-repo:
find ~/.yum -type f -exec chmod 664 {} \;
find ~/.yum -type d -exec chmod 2775 {} \;
rsync -Ortlvz ~/.yum/ $(USER)@$(WEEWX_COM):$(WEEWX_HTMLDIR)/yum-test
# copy the testing repository onto the production repository
release-yum-repo:
ssh $(USER)@$(WEEWX_COM) "rsync -Ologrvz /var/www/html/yum-test/ /var/www/html/yum"
SUSE_REPO=~/.suse/weewx
suse-repo:
mkdir -p $(SUSE_REPO)/{suse12,suse15}/RPMS
cp -p pkg/index-suse.html ~/.suse/index.html
cp -p pkg/weewx-suse12.repo ~/.suse
cp -p pkg/weewx-suse15.repo ~/.suse
pull-suse-repo:
mkdir -p $(SUSE_REPO)
rsync -Oarvz $(USER)@$(WEEWX_COM):$(WEEWX_HTMLDIR)/suse/ ~/.suse
update-suse-repo:
cp -p $(DSTDIR)/weewx-$(RPMVER).suse12.$(RPMARCH).rpm $(SUSE_REPO)/suse12/RPMS
createrepo $(SUSE_REPO)/suse12
cp -p $(DSTDIR)/weewx-$(RPMVER).suse15.$(RPMARCH).rpm $(SUSE_REPO)/suse15/RPMS
createrepo $(SUSE_REPO)/suse15
push-suse-repo:
find ~/.suse -type f -exec chmod 664 {} \;
find ~/.suse -type d -exec chmod 2775 {} \;
rsync -Ortlvz ~/.suse/ $(USER)@$(WEEWX_COM):$(WEEWX_HTMLDIR)/suse-test
# copy the testing repository onto the production repository
release-suse-repo:
ssh $(USER)@$(WEEWX_COM) "rsync -Ologrvz /var/www/html/suse-test/ /var/www/html/suse"
# shortcuts to upload everything. assumes that the assets have been staged
# to the local 'dist' directory.
upload-all: upload-docs upload-pkgs
# shortcut to release everything. assumes that all of the assets have been
# staged to the development area on the distribution server.
release-all: release release-apt-repo release-yum-repo release-suse-repo
# run perlcritic to ensure clean perl code. put these in ~/.perlcriticrc:
# [-CodeLayout::RequireTidyCode]
# [-Modules::ProhibitExcessMainComplexity]
# [-Modules::RequireVersionVar]
critic:
perlcritic -1 --verbose 8 pkg/mkchangelog.pl
code-summary:
cloc --force-lang="HTML",tmpl --force-lang="INI",conf --force-lang="INI",inc src docs_src examples skins util