Makefile 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #定义 伪目标
  2. .PHONY: all lib script close clean cleanall
  3. #设置生成的可执行程序名
  4. TARGET = xinyun_mqtt_alarm.svr
  5. ######################### 以下内容一般无需修改 #########################
  6. #设置默认编译器
  7. CC = gcc
  8. INCLUDE_PATH = -Iinclude -Icore -Ipaho.mqtt.c/src -I.
  9. #编译参数
  10. #-Wall: 启用大多数警告信息 -W: 启用额外的警告 -O2: 启用优化级别2 -g: 生成调试信息 -Wpointer-arith: 启用指针算术警告 -Wstrict-prototypes: 启用严格的函数原型声明
  11. CFLAGS = -Wall -W -O2 -g -Wpointer-arith -Wstrict-prototypes $(INCLUDE_PATH)
  12. #这个 -Wl,-E 不能少 要不然脚本里require *.so 会报错
  13. #-Wl,-E 传递-E选项给链接器,这可以用于各种目的,包括从生成的共享对象中导出所有符号。
  14. #-lrt:链接到实时库 -lpthread:链接到线程库 -lm:链接到数学库 -lz:链接到压缩库 -ldl:链接到动态连接库
  15. # -L/usr/lib64/mysql:指定 MySQL 客户端库所在的目录。
  16. # -lmysqlclient:链接到 MySQL 客户端库。
  17. #-Lsolib:指定其他共享库所在的目录。
  18. #-Wl,-rpath=solib:设置运行时库搜索路径,包括指定的目录(在这里是 solib)。这确保程序在运行时在该目录中查找共享库。
  19. MYLIBS = -Wl,-E -lrt -lpthread -lm -lz -ldl -L/usr/lib64/mysql -lmysqlclient -Lsolib -Wl,-rpath=solib
  20. SO_LIB=solib
  21. PWD_PATH =$(shell pwd)
  22. #通用lib库
  23. COMMON_LIB = libcommon.a
  24. COMMON_LIB_PATH = lib/
  25. #核心库lib库
  26. CORE_LIB = libcore.so
  27. CORE_LIB_PATH = core/
  28. #MQTT 相关库的源代码路径
  29. MQTT_LIB = libpaho-mqtt3a.so
  30. MQTT_LIB_SRC = paho.mqtt.c
  31. MQTT_LIB_PATH = paho.mqtt.c/src/
  32. #设置生成可执行文件的存放路径
  33. RUN_PATH = bin/
  34. #自定义命令名
  35. CP = cp -rf
  36. RM = rm -rf
  37. #默认的make目标
  38. all: lib $(TARGET) $(MQTT_LIB) $(CORE_LIB)
  39. #进入 lib 目录并执行 make 命令
  40. #如果存在main.c则需要重新编译
  41. lib:
  42. cd lib && $(MAKE)
  43. ifneq (,$(wildcard ./src/main.c))
  44. @#如果存在main.c则需要清除及重新编译
  45. cd src && $(MAKE)
  46. endif
  47. #目标 生成主程序 并附带copy一些脚本
  48. #./src/main.o、$(MQTT_LIB)、$(CORE_LIB) 是依赖项。表示在执行该目标之前需要完成这些依赖项的构建
  49. #$(wildcard $(CORE_LIB_PATH)/*.c) $(wildcard $(CORE_LIB_PATH)/*.h) 是通配符,表示匹配所有.c 和.h 文件
  50. $(TARGET): ./src/main.o $(MQTT_LIB) $(CORE_LIB) $(wildcard $(CORE_LIB_PATH)/*.c) $(wildcard $(CORE_LIB_PATH)/*.h)
  51. @# 后面的lib库在调整先后位置后可能导致编译出错哦
  52. $(CP) $(CORE_LIB_PATH)$(CORE_LIB) $(SO_LIB)
  53. $(CP) $(MQTT_LIB_PATH)$(MQTT_LIB) $(SO_LIB)
  54. @# 使用 gcc 编译器将目标文件、通用库、库路径和其他选项链接为最终的可执行程序
  55. $(CC) $(CFLAGS) ./src/main.o $(COMMON_LIB_PATH)$(COMMON_LIB) $(MYLIBS) $(SO_LIB)/$(CORE_LIB) $(SO_LIB)/$(MQTT_LIB) -o $(TARGET)
  56. @# 将生成的可执行程序复制到运行目录
  57. $(CP) $(TARGET) $(RUN_PATH)
  58. @# 删除临时目录下的 lib 目录,并将 lib 目录复制到运行目录
  59. $(RM) $(RUN_PATH)/$(SO_LIB) && $(CP) $(SO_LIB) $(RUN_PATH)
  60. @# 删除当前目录下生成的可执行程序
  61. $(RM) $(TARGET)
  62. @echo -e "\\033[32m $(TARGET) is OK and Move to DIR: $(RUN_PATH) \\033[0m"
  63. # MQTT_LIB 的生成方法
  64. # 获取指定路径下所有的 .c 文件和 .h 文件
  65. # 进入 $(MQTT_LIB_SRC) 目录,然后执行 make 命令
  66. $(MQTT_LIB): $(wildcard $(MQTT_LIB_SRC)/src/*.c) $(wildcard $(MQTT_LIB_SRC)/src/*.h)
  67. cd $(MQTT_LIB_SRC) && $(MAKE)
  68. # CORE_LIB 的生成方法
  69. # 获取指定路径下所有的 .c 文件和 .h 文件
  70. # 进入 $(CORE_LIB_PATH) 目录,然后执行 make 命令。
  71. $(CORE_LIB): $(wildcard $(CORE_LIB_PATH)/*.c) $(wildcard $(CORE_LIB_PATH)/*.h)
  72. cd $(CORE_LIB_PATH) && $(MAKE)
  73. #普通清理
  74. clean:
  75. cd lib && $(MAKE) clean
  76. -$(RM) $(SO_LIB)/*.so
  77. -$(RM) $(TARGET)
  78. ifneq (,$(wildcard ./src/main.c))
  79. @#如果存在main.c则需要清除及重新编译
  80. cd src && $(MAKE) clean
  81. endif
  82. cd $(CORE_LIB_PATH) && $(MAKE) clean
  83. cd $(MQTT_LIB_SRC) && $(MAKE) clean
  84. #深度清理
  85. cleanall: clean
  86. cd lib && $(MAKE) cleanall
  87. cd $(MQTT_PATH) && $(MAKE) clean
  88. $(RM) $(TARGET)
  89. ifneq (,$(wildcard src/main.c))
  90. @#如果src 目录下有文件 main.c 才能进去啊
  91. cd src && $(MAKE) clean
  92. endif
  93. @#如果是 bighead 的目录 则还多做点事情
  94. ifeq "$(HOME)" "/home/bighead"
  95. find . -name cscope\.* -exec rm -f {} \;
  96. find . -name tags -exec rm -f {} \;
  97. endif