GNU make在鸿蒙PC上的使用方法
本文档介绍了为OpenHarmony平台适配的GNU make工具ohos-make的安装与使用方法。由于鸿蒙PC的安全限制,必须将工具打包为HNP(HarmonyOS Native Package)格式才能使用。文档详细说明了从下载预编译包到创建HNP配置文件的完整打包流程,包括目录结构准备、配置文件编写和打包脚本示例。此外,还对比了鸿蒙PC与其他平台(开发板、容器)在使用方式上的差异,并强调了
ohos-make 是为 OpenHarmony 平台编译的 GNU make 构建工具。本文档详细介绍如何在鸿蒙PC上安装和使用官方适配完成的 make 工具,包括 HNP 包的打包、安装和使用方法。
📋 目录
一、项目概述
1.1 make 工具简介
make 是一个自动化构建工具,通过读取 Makefile 文件来执行编译、链接、安装等任务。它是 Unix/Linux 系统中最常用的构建工具之一。
核心特性:
- 🔧 自动化构建:根据依赖关系自动执行构建任务
- 📝 简单配置:通过
Makefile文件描述构建规则 - ⚡ 增量构建:只重新编译修改过的文件
- 🎯 并行构建:支持多任务并行执行
- 🔄 跨平台:支持多种操作系统
主要应用场景:
- C/C++ 项目的编译和链接
- 自动化构建流程
- 依赖管理和任务编排
- 与 autoconf、CMake 等工具配合使用
- 软件安装和部署

1.2 项目信息
| 项目信息 | 详情 |
|---|---|
| 项目名称 | ohos-make |
| 版本 | 4.4.1(GNU make 官方版本) |
| 许可证 | GPL-3.0 |
| 目标平台 | 鸿蒙PC (aarch64-linux-ohos) |
| 源码仓库 | https://git.savannah.gnu.org/git/make.git |
| 适配仓库 | https://github.com/Harmonybrew/ohos-make |
| 预构建包 | https://github.com/Harmonybrew/ohos-make/releases |
| 编译方式 | 交叉编译(Cross Compilation) |
1.3 make 构建流程
make 的典型构建流程包括:
- 读取 Makefile:解析构建规则和依赖关系
- 分析依赖:确定需要重新构建的目标
- 执行命令:按照规则执行编译、链接等命令
- 更新目标:生成最终的可执行文件或库
Makefile → make → 分析依赖 → 执行命令 → 生成目标
1.4 为什么需要 ohos-make?
在鸿蒙PC上进行开发时,我们经常需要:
- ✅ 构建 C/C++ 项目:编译和管理 C/C++ 项目
- ✅ 自动化任务:执行重复性的构建和部署任务
- ✅ 依赖管理:处理项目间的依赖关系
- ✅ 与其他工具配合:作为 autoconf、CMake 等工具的后端
二、为什么需要 HNP 包
2.1 系统安全限制
重要说明: 在鸿蒙PC上,由于系统安全规格限制等原因,暂不支持通过"解压 + 配 PATH"的方式直接使用 tar.gz 包。
这意味着:
- ❌ 不能直接解压 tar.gz 包到任意目录
- ❌ 不能通过设置 PATH 环境变量来使用
- ✅ 必须打包成 HNP(HarmonyOS Native Package)格式才能正常使用
2.2 HNP 包的优势
HNP 包是鸿蒙PC的官方包管理格式,具有以下优势:
- ✅ 系统集成:与鸿蒙PC的包管理系统集成
- ✅ 安全可靠:通过官方工具安装,符合系统安全规范
- ✅ 易于管理:支持安装、卸载、更新等操作
- ✅ 路径规范:统一安装在
/data/service/hnp/目录下
2.3 其他平台的使用方式
在鸿蒙开发板上:
- 可以使用 hdc 推送 tar.gz 包
- 支持"解压 + 配 PATH"的方式
在鸿蒙容器中:
- 可以直接下载 tar.gz 包
- 支持"解压 + 配 PATH"的方式
三、HNP 包打包方法
3.1 准备工作
3.1.1 下载预构建包
首先,从 release 页面 下载官方适配完成的预构建包:
# 下载 make 预构建包
wget https://github.com/Harmonybrew/ohos-make/releases/download/4.4.1/make-4.4.1-ohos-arm64.tar.gz
3.1.2 解压并查看结构
# 解压 tar.gz 包
tar -zxf make-4.4.1-ohos-arm64.tar.gz
# 查看目录结构
tree make-4.4.1-ohos-arm64/
目录结构示例:
make-4.4.1-ohos-arm64/
├── bin/
│ └── make # make 可执行文件
└── COPYING # 许可证文件
3.2 创建 HNP 包配置
3.2.1 创建 hnp.json
在解压后的目录中创建 hnp.json 配置文件:
{
"type": "hnp-config",
"name": "make",
"version": "4.4.1",
"install": {
"links": [
{
"source": "bin/make",
"target": "make"
}
]
}
}
配置说明:
type: 固定为"hnp-config"name: 包名称(make)version: 版本号(4.4.1)install.links: 安装时的符号链接配置source: 源文件路径(相对于安装目录)target: 链接目标名称(命令名称)
3.2.2 准备安装目录结构
按照 HNP 包的路径规则,准备安装目录:
# HNP 包的路径规则:${HNP_PUBLIC_PATH}/<包名>.org/<包名>_<版本号>
# 例如:/data/service/hnp/make.org/make_4.4.1
export HNP_PUBLIC_PATH=/data/service/hnp
export MAKE_INSTALL_PATH=${HNP_PUBLIC_PATH}/make.org/make_4.4.1
# 创建安装目录
mkdir -p ${MAKE_INSTALL_PATH}
3.3 打包脚本
3.3.1 方法一:手动打包
创建打包脚本 pack_hnp.sh:
#!/bin/bash
set -e
# 配置变量
MAKE_VERSION="4.4.1"
TAR_FILE="make-${MAKE_VERSION}-ohos-arm64.tar.gz"
EXTRACT_DIR="make-${MAKE_VERSION}-ohos-arm64"
HNP_PUBLIC_PATH="/data/service/hnp"
MAKE_INSTALL_PATH="${HNP_PUBLIC_PATH}/make.org/make_${MAKE_VERSION}"
OUTPUT_DIR="output"
WORKDIR=$(pwd)
# 创建输出目录
mkdir -p ${OUTPUT_DIR}
# 解压 tar.gz 包
if [ ! -d "${EXTRACT_DIR}" ]; then
echo "解压 ${TAR_FILE}..."
tar -zxf ${TAR_FILE}
fi
# 创建安装目录
echo "创建安装目录..."
mkdir -p ${MAKE_INSTALL_PATH}/bin
# 复制文件
echo "复制文件..."
cp -r ${EXTRACT_DIR}/bin/* ${MAKE_INSTALL_PATH}/bin/
if [ -f "${EXTRACT_DIR}/COPYING" ]; then
cp ${EXTRACT_DIR}/COPYING ${MAKE_INSTALL_PATH}/
fi
# 创建 hnp.json
echo "创建 hnp.json..."
cat > ${MAKE_INSTALL_PATH}/hnp.json << 'EOF'
{
"type": "hnp-config",
"name": "make",
"version": "4.4.1",
"install": {
"links": [
{
"source": "bin/make",
"target": "make"
}
]
}
}
EOF
# 设置执行权限
chmod +x ${MAKE_INSTALL_PATH}/bin/make
# 使用 hnpcli 打包(如果可用)
if command -v hnpcli &> /dev/null; then
echo "使用 hnpcli 打包..."
hnpcli pack -i ${MAKE_INSTALL_PATH} -o ${OUTPUT_DIR}/
echo "HNP 包已生成: ${OUTPUT_DIR}/make.hnp"
else
echo "警告: 未找到 hnpcli 工具,跳过 HNP 包生成"
echo "请手动使用 hnpcli 打包:"
echo " hnpcli pack -i ${MAKE_INSTALL_PATH} -o ${OUTPUT_DIR}/"
fi
# 生成 tar.gz 包(备用)
echo "生成 tar.gz 包..."
cd ${HNP_PUBLIC_PATH}/make.org
tar -zcf ${WORKDIR}/${OUTPUT_DIR}/ohos_make_${MAKE_VERSION}.tar.gz make_${MAKE_VERSION}/
cd - > /dev/null
echo "打包完成!"
echo "输出文件:"
echo " - ${OUTPUT_DIR}/make.hnp (如果 hnpcli 可用)"
echo " - ${OUTPUT_DIR}/ohos_make_${MAKE_VERSION}.tar.gz"
3.4 验证打包结果
打包完成后,验证生成的文件:
# 检查 HNP 包
ls -lh output/make.hnp
# 检查 tar.gz 包
ls -lh output/ohos_make_4.4.1.tar.gz
# 验证安装目录结构
tree ${MAKE_INSTALL_PATH}/
预期的安装目录结构:
/data/service/hnp/make.org/make_4.4.1/
├── bin/
│ └── make # make 可执行文件
├── COPYING # 许可证文件
└── hnp.json # HNP 配置文件
四、安装与使用
4.1 安装 HNP 包
手动安装(使用 tar.gz)
# 在鸿蒙PC上执行
# 1. 解压 tar.gz 包
tar -xzf ohos_make_4.4.1.tar.gz
# 2. 复制到安装目录
sudo cp -r make_4.4.1/* /data/service/hnp/make.org/make_4.4.1/
# 3. 设置执行权限
sudo chmod +x /data/service/hnp/make.org/make_4.4.1/bin/*
# 4. 创建符号链接(根据 hnp.json 配置)
# hnp 系统会自动处理 links 配置,但也可以手动创建
sudo ln -sf /data/service/hnp/make.org/make_4.4.1/bin/make /usr/local/bin/make
4.2 验证安装
# 检查 make 是否可用
make --version
# 应该显示 GNU make 的版本信息
# GNU Make 4.4.1
4.3 使用 make
安装完成后,就可以使用 make 来构建项目了:
# 基本使用
make
# 指定 Makefile
make -f Makefile
# 指定目标
make target
# 并行构建
make -j4
五、使用示例
5.1 基本 Makefile
创建一个简单的 Makefile:
Makefile:
CC = gcc
CFLAGS = -Wall -g
hello: hello.o
$(CC) $(CFLAGS) -o hello hello.o
hello.o: hello.c
$(CC) $(CFLAGS) -c hello.c
clean:
rm -f hello hello.o
.PHONY: clean
hello.c:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
构建步骤:
make
./hello
5.2 多文件项目
Makefile:
CC = gcc
CFLAGS = -Wall -g
TARGET = myapp
SOURCES = main.c utils.c
OBJECTS = $(SOURCES:.c=.o)
$(TARGET): $(OBJECTS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJECTS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(TARGET) $(OBJECTS)
.PHONY: clean
5.3 使用变量和函数
Makefile:
# 变量定义
SRC_DIR = src
OBJ_DIR = obj
BIN_DIR = bin
SOURCES = $(wildcard $(SRC_DIR)/*.c)
OBJECTS = $(SOURCES:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
TARGET = $(BIN_DIR)/myapp
# 编译规则
$(TARGET): $(OBJECTS)
@mkdir -p $(BIN_DIR)
$(CC) $(CFLAGS) -o $@ $^
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
@mkdir -p $(OBJ_DIR)
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -rf $(OBJ_DIR) $(BIN_DIR)
.PHONY: clean
5.4 并行构建
# 使用 4 个并行任务
make -j4
# 使用所有可用 CPU 核心
make -j$(nproc)
5.5 条件编译
Makefile:
DEBUG ?= 0
ifeq ($(DEBUG), 1)
CFLAGS += -DDEBUG -g
else
CFLAGS += -O2 -DNDEBUG
endif
myapp: main.c
$(CC) $(CFLAGS) -o myapp main.c
使用:
# 调试版本
make DEBUG=1
# 发布版本
make DEBUG=0
5.6 与 autoconf 配合使用
# 使用 autoconf 生成的 Makefile
./configure
make
make install
六、常见问题
6.1 权限问题
问题: 安装后无法执行 make 命令?
解决方案:
# 检查文件权限
ls -l /data/service/hnp/make.org/make_4.4.1/bin/make
# 设置执行权限
chmod +x /data/service/hnp/make.org/make_4.4.1/bin/make
# 检查符号链接
ls -l /usr/local/bin/make
6.2 Makefile 语法错误
问题: make 报语法错误?
解决方案:
- 确保 Makefile 使用 Tab 而不是空格来缩进
- 检查变量和目标的语法
- 使用
make -d查看详细的调试信息
6.3 依赖问题
问题: make 找不到依赖文件?
解决方案:
# 查看依赖关系
make -n
# 强制重新构建
make -B
# 查看详细的构建过程
make -d
6.4 构建相关问题
问题: 如何从源码构建 make?
回答:
参考项目 README 中的构建说明,需要在 Linux x64 服务器上运行 build.sh 脚本进行交叉编译:
# 在 Ubuntu 24.04 x64 上
sudo apt update && sudo apt install -y build-essential unzip
./build.sh
构建过程会:
- 下载 OpenHarmony SDK
- 设置交叉编译环境
- 下载并编译 GNU make 源码
- 生成预构建包
6.5 版本问题
问题: 系统已有 make,如何确保使用 GNU make?
解决方案:
# 检查当前使用的 make
which make
make --version
# 如果系统 make 版本较旧,确保 GNU make 在 PATH 前面
export PATH=/data/service/hnp/make.org/make_4.4.1/bin:$PATH
Q4: 如何卸载 make?
A: 手动卸载:
# 删除安装目录
sudo rm -rf /data/service/hnp/make.org/make_4.4.1
# 删除符号链接
sudo rm -f /usr/local/bin/make
七、总结与最佳实践
7.1 使用建议
- 优先使用 HNP 包:在鸿蒙PC上,优先使用 HNP 包安装,符合系统安全规范。
- 合理使用并行构建:使用
-j选项可以显著提升构建速度,但要注意内存使用。 - 保持 Makefile 简洁:使用变量和函数来简化 Makefile,提高可维护性。
- 版本管理:在项目中记录使用的 make 版本,确保团队环境一致。
7.2 性能优化
- 并行构建:使用
make -j$(nproc)充分利用多核 CPU。 - 增量构建:make 会自动检测文件修改,只重新编译必要的文件。
- 避免不必要的重建:正确设置依赖关系,避免不必要的重新编译。
- 使用
.PHONY:对于不生成文件的伪目标,使用.PHONY声明。
7.3 最佳实践
- 项目结构:遵循标准的项目结构,将源文件、目标文件和可执行文件分开。
- 变量使用:使用变量来定义编译器、编译选项等,便于修改和维护。
- 依赖管理:正确设置文件间的依赖关系,确保构建的正确性。
- 文档化:在 Makefile 中添加注释,说明各个目标和变量的用途。
更多推荐



所有评论(0)