当前位置:网站首页>记录一个刚写的Makefile

记录一个刚写的Makefile

2022-08-11 05:32:00 千册

Makefile



.PHONY:all
export MY_VAR="who are you"
all:
    @echo "hello world"
a1=abc
b1=$(a1)def
a1=gh
test1:
    @echo ${b1}

a2:=abc
b2:=$(a2)def
a2:=gh
test2:
    @echo ${b2}


VPATH=./ protocol
path:
    @echo `pwd`
    @echo ${VPATH}
objs:=main.o calc.o server.o client.o pipe.o
objs+=stack.o
include protocol/child.mk
app:${objs}
    gcc -o app $^ -pthread -lm
    echo ${MY_VAR}

%.o:%.c
    gcc -o [email protected] $< -c -DMY_VAR=\"$(MY_VAR)\"

.PHONY:test3
test3:main.c a.c
    echo *.c
    echo ?.c
    echo [12].c
    echo [email protected]
    echo $<
    echo $^
#   echo {1 2 main}.c
.PHONY: clean
clean:
    rm -f *.o app

=和:=的执行区别

[email protected]:~/learn/makefile/01$ make test1
ghdef
[email protected]:~/learn/makefile/01$ make test2
abcdef

然后是其中包含的文件的内容

main.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>

extern int add(int a,int b);
extern int server_init();
extern int client_init();
extern int stack_init();
extern int pipe_init();
extern int protocol_init();
int main(int argc,char *argv[])
{
    double my_d = -5;
    server_init();
    client_init();
    stack_init();
    pipe_init();
    protocol_init();
#ifdef MY_VAR
    //在这里获取Makefile传递过来的宏
    printf("MY_VAR = %s\n",MY_VAR);
#else
    printf("no MY_VAR\n");
#endif
    printf("hello c\n");
    //验证:这里尝试获取MY_VAR,执行结果为空,说明获取不到
    printf("%s \n",getenv("MY_VAR"));
    printf("5 + 10 =%d c\n",add(5,10));
    printf("my_double = %g fabs(my_double) = %g\n",
            my_d,fabs(my_d));
    return 0;
}

calc.c

#include <stdio.h>

int add(int a,int b)
{
    return a + b;
}

server.c

#include <stdio.h>

int server_init(void)
{
    printf("server_init\n");
    return 0;
}

client.c

#include <stdio.h>

int client_init(void)
{
    printf("client_init\n");
    return 0;
}

stack.c

#include <stdio.h>

int stack_init(void)
{
    printf("stack_init\n");
    return 0;
}

pipe.c

#include <stdio.h>

int pipe_init(void)
{
    printf("pipe_init\n");
    return 0;
}

protocol子目录中的文件

[email protected]:~/learn/makefile/01/protocol$ ls
child.mk  protocol.c

protocol.c

#include <stdio.h>

int protocol_init(void)
{
    printf("protocol_init\n");
    return 0;
}

child.mk:这是子目录中的Makefile

objs += protocol.o

执行结果

先make app

[email protected]:~/learn/makefile/01$ make app
gcc -o main.o main.c -c -DMY_VAR=\""who are you"\"
gcc -o calc.o calc.c -c -DMY_VAR=\""who are you"\"
gcc -o server.o server.c -c -DMY_VAR=\""who are you"\"
gcc -o client.o client.c -c -DMY_VAR=\""who are you"\"
gcc -o pipe.o pipe.c -c -DMY_VAR=\""who are you"\"
gcc -o stack.o stack.c -c -DMY_VAR=\""who are you"\"
gcc -o protocol.o protocol/protocol.c -c -DMY_VAR=\""who are you"\"
gcc -o app main.o calc.o server.o client.o pipe.o stack.o protocol.o -pthread -lm
echo "who are you"
who are you

然后执行app

[email protected]:~/learn/makefile/01$ ./app
server_init
client_init
stack_init
pipe_init
protocol_init
MY_VAR = who are you //这行说明获取到宏了
hello c
(null) //这行验证了Makefile中的环境变量和运行时环境变量是不同的,运行时环境变量是和终端相关的,不能搞混
5 + 10 =15 c
my_double = -5 fabs(my_double) = 5

测试自动变量

        本节点用于测试一些自动变量[email protected]  $<  $^,先看下测试的结果

先准备几个测试文件

[email protected]:~/learn/makefile/01$ touch 1.c 2.c 3.c a.c 11.c

执行测试

[email protected]:~/learn/makefile/01$ make test3
echo *.c
1.c 11.c 2.c 3.c a.c calc.c client.c main.c pipe.c server.c stack.c
echo ?.c
1.c 2.c 3.c a.c
echo [12].c
1.c 2.c
echo test3 //[email protected] 目标名
test3
echo main.c //$< 依赖的第一个文件名
main.c
echo main.c a.c //@^ 依赖的文件的集合
main.c a.c

总结

这个代码,验证了如下几个问题

1.如何include子目录

2.如何获取宏定义

3.Makefile中定义的全局变量不能等同于运行时的环境变量,app运行时的环境变量,取决于它运行的所在终端活着设备的环境变量,由基本定义就可以知道了。这个地方不能搞混。

为什么要写这么多呢,当然不是为了筹字数,只是说明,这样写,就是为了写测试代码的,正式项目,还是算了吧

原网站

版权声明
本文为[千册]所创,转载请带上原文链接,感谢
https://blog.csdn.net/yueni_zhao/article/details/126121573