如何在 Linux 上利用 Makefile 构建 .deb 软件包?
2024-03-20 10:01:06
使用 Makefile 在 Linux 上构建 .deb 软件包:分步指南
对于那些希望在 Ubuntu 和其他基于 Debian 的 Linux 发行版上分发项目的 Linux 用户来说,创建 .deb 软件包至关重要。通过利用 Makefile 的强大功能,您可以简化构建过程并自动化 .deb 软件包的创建。
目标规则:构建 .deb 软件包
在 Makefile 中,我们需要添加一个目标规则,指定构建 .deb 软件包所需的步骤。该规则将依赖于现有的构建规则,并执行 dh_make
和 debuild
命令来创建源包和最终的 .deb 文件。
自定义变量:控制构建过程
为了定制构建过程,我们可以定义变量来控制体系结构、版本号等参数。通过设置这些变量,我们可以针对特定平台和环境定制 .deb 软件包。
调整构建规则:生成二进制文件
构建规则需要调整以确保生成所需的二进制文件。这涉及添加命令以编译源代码并生成最终可执行文件,这些可执行文件将包含在 .deb 软件包中。
其他目标:自动化任务
除了构建目标之外,还可以添加其他目标来执行其他任务,例如清理构建、运行测试或安装软件包。这提供了构建和管理项目的高效且全面的方法。
示例 Makefile:一个完整的示例
以下是一个示例 Makefile,展示了上述步骤的实现:
OSARCH := "linux/amd64 linux/386 windows/amd64 windows/386 darwin/amd64 darwin/386"
ENV = /usr/bin/env
VERSION=$(shell git describe --dirty --tags --always)
.SHELLFLAGS = -c # Run commands in a -c flag
.SILENT: ; # no need for @
.ONESHELL: ; # recipes execute in same shell
.NOTPARALLEL: ; # wait for this target to finish
.EXPORT_ALL_VARIABLES: ; # send all vars to shell
.PHONY: all # All targets are accessible for user
.DEFAULT: help # Running Make will run the help target
help: ## Show Help
@grep -E '^[a-zA-Z_-]+:.*?## .*OSARCH := "linux/amd64 linux/386 windows/amd64 windows/386 darwin/amd64 darwin/386"
ENV = /usr/bin/env
VERSION=$(shell git describe --dirty --tags --always)
.SHELLFLAGS = -c # Run commands in a -c flag
.SILENT: ; # no need for @
.ONESHELL: ; # recipes execute in same shell
.NOTPARALLEL: ; # wait for this target to finish
.EXPORT_ALL_VARIABLES: ; # send all vars to shell
.PHONY: all # All targets are accessible for user
.DEFAULT: help # Running Make will run the help target
help: ## Show Help
@grep -E '^[a-zA-Z_-]+:.*?## .*$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $1, $2}'
dep: ## Get build dependencies
go get -v -u github.com/golang/dep/cmd/dep
ensure: ## update dependencies
dep ensure
build: ## Build the app
for gomodule in $(go list ./... | grep -vE 'x1|x2|x3|x4|x5|myself|rfc**** ') ; do
go build -gcflags "-N -l" -ldflags "-X main.version=$(VERSION) -s -w" -o bin/$(basename $gomodule).s $gomodule
upx --force -qq -o bin/$(basename $gomodule) bin/$(basename $gomodule).s > /dev/null
done
deb: build
dh_make --createorig --type=debian
debuild --debarch=$(OSARCH)
test: ## Launch tests
go test -v ./...
clean: ## Launch clean
go clean ./...
rm -rf bin
install: ## Launch install
go install -ldflags "-X main.version=$(VERSION)" $(go list ./... | grep -v test)
test-cover: ## Launch tests coverage and send it to coverall
$(ENV) ./scripts/test-coverage.sh
#x27; $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $1, $2}'
dep: ## Get build dependencies
go get -v -u github.com/golang/dep/cmd/dep
ensure: ## update dependencies
dep ensure
build: ## Build the app
for gomodule in $(go list ./... | grep -vE 'x1|x2|x3|x4|x5|myself|rfc**** ') ; do
go build -gcflags "-N -l" -ldflags "-X main.version=$(VERSION) -s -w" -o bin/$(basename $gomodule).s $gomodule
upx --force -qq -o bin/$(basename $gomodule) bin/$(basename $gomodule).s > /dev/null
done
deb: build
dh_make --createorig --type=debian
debuild --debarch=$(OSARCH)
test: ## Launch tests
go test -v ./...
clean: ## Launch clean
go clean ./...
rm -rf bin
install: ## Launch install
go install -ldflags "-X main.version=$(VERSION)" $(go list ./... | grep -v test)
test-cover: ## Launch tests coverage and send it to coverall
$(ENV) ./scripts/test-coverage.sh
结论
使用 Makefile 在 Linux 上构建 .deb 软件包是一项相对简单的任务,它可以通过自动化构建过程和简化分发来显着节省时间和精力。通过遵循本文中概述的步骤,您可以创建自己的 Makefile 以生成适用于各种体系结构的 .deb 软件包。
常见问题解答
-
为什么使用 Makefile 而不是其他方法来创建 .deb 软件包?
Makefile 提供了一种结构化且可定制的方式来管理构建过程,使其非常适合自动化复杂的任务,例如构建 .deb 软件包。 -
我可以为我的项目自定义 Makefile 吗?
是的,Makefile 是高度可定制的。您可以根据项目的具体要求调整构建规则、添加其他目标并修改变量以满足您的需求。 -
如何针对特定体系结构构建 .deb 软件包?
通过在 Makefile 中设置OSARCH
变量,您可以指定要构建的体系结构。该变量将控制debuild
命令使用的体系结构。 -
如何自动化测试过程?
可以在 Makefile 中添加一个test
目标来运行测试。这将使您能够轻松地执行测试并验证项目在构建 .deb 软件包之前是否按预期工作。 -
如何确保 .deb 软件包与特定版本的依赖项兼容?
通过在 Makefile 中使用dep ensure
命令,您可以更新项目依赖项并确保它们与要构建的 .deb 软件包的版本兼容。