请稍侯

Makefile来管理项目

17 December 2022
更多

概述

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,也可以执行操作系统的命令

常用功能

1. makefile之命令包&多行变量

命令包的简单使用—自定义函数

all:                    
    @$(cmd)

define cmd
    echo "test define 1"
    echo "test define 2"
    echo "test define 3"
endef

2. 关于shell:如何在Makefile目标中使用Bash语法?

从GNU Make文档中,

5.3.1 Choosing the Shell
------------------------

The program used as the shell is taken from the variable `SHELL'.  If
this variable is not set in your makefile, the program `/bin/sh' is
used as the shell.

因此,将SHELL := /bin/bash放在makefile的顶部,您应该会很好。 顺便说一句:您也可以针对一个目标执行此操作,至少对于GNU Make而言。每个目标可以有自己的变量分配,如下所示:

all: a b

a:
    @echo"a is $$0"

b: SHELL:=/bin/bash   # HERE: this is setting the shell for b only
b:
    @echo"b is $$0"

make例子

SHELL := D:\Programs\Git\bin\bash.exe

BINARY="build/iot_service"
VERSION=1.0.0
export GOARCH=amd64
export GOOS=linux

clear:
	@$(RM) ${BINARY}

build:
	@go build -o ${BINARY} ./

push-test:build
	@$(push_test)
.PHONY: build push-test

define push_test
	ssh root@192.168.1.2 "service  go-iot_service stop;/usr/bin/rm -rf /opt/lc/iot_svr/iot_service"
    scp -r build/* root@192.168.1.2:/opt/lc/iot_svr/
    ssh root@192.168.1.2 "chmod +x /opt/lc/iot_svr/iot_service;service  go-iot_service start;sleep 3;service  go-iot_service status"
endef