返回

如何在 Linux 上利用 Makefile 构建 .deb 软件包?

Linux

使用 Makefile 在 Linux 上构建 .deb 软件包:分步指南

对于那些希望在 Ubuntu 和其他基于 Debian 的 Linux 发行版上分发项目的 Linux 用户来说,创建 .deb 软件包至关重要。通过利用 Makefile 的强大功能,您可以简化构建过程并自动化 .deb 软件包的创建。

目标规则:构建 .deb 软件包

在 Makefile 中,我们需要添加一个目标规则,指定构建 .deb 软件包所需的步骤。该规则将依赖于现有的构建规则,并执行 dh_makedebuild 命令来创建源包和最终的 .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 软件包。

常见问题解答

  1. 为什么使用 Makefile 而不是其他方法来创建 .deb 软件包?
    Makefile 提供了一种结构化且可定制的方式来管理构建过程,使其非常适合自动化复杂的任务,例如构建 .deb 软件包。

  2. 我可以为我的项目自定义 Makefile 吗?
    是的,Makefile 是高度可定制的。您可以根据项目的具体要求调整构建规则、添加其他目标并修改变量以满足您的需求。

  3. 如何针对特定体系结构构建 .deb 软件包?
    通过在 Makefile 中设置 OSARCH 变量,您可以指定要构建的体系结构。该变量将控制 debuild 命令使用的体系结构。

  4. 如何自动化测试过程?
    可以在 Makefile 中添加一个 test 目标来运行测试。这将使您能够轻松地执行测试并验证项目在构建 .deb 软件包之前是否按预期工作。

  5. 如何确保 .deb 软件包与特定版本的依赖项兼容?
    通过在 Makefile 中使用 dep ensure 命令,您可以更新项目依赖项并确保它们与要构建的 .deb 软件包的版本兼容。