c - Makefile 依赖项和时间戳

标签 c makefile data-distribution-service

我有一个 makefile,用于使用第三方 IDL 编译器 (rtiddsgen) 生成工件。它接收 idl 文件并输出与其相关的 C/Ada 文件。然后编译 C 文件并将其放入库 (idl_dds_types.a)

我在 IDL_TYPES 变量中列出了 IDL 文件。每个 IDL_TYPES 文件将生成(通过 rtiddsgen)以下形式的文件(例如使用alerts.idl):

alerts.c
alerts.h
alerts_idl.ads
alerts_idl.adb

所以,我想要发生的是,当alerts.idl的时间戳比alerts.c(或obj.Linux-i686/alerts.o)文件新时,就会重新生成alerts.c文件。这似乎并没有发生。有什么想法我需要做什么才能实现这一点?我已经通过“touch”-ing idl 文件然后重新运行 make 进行了测试。

这是生成文件:

DDS_OUT_DIR = $(MY_HOME)/DDS/DDS_Types/src

IDL_DIR=$(MY_HOME)/DDS/DDS_Types/IDL
IDL_TYPES=common.idl alerts.idl summary.idl
GENERATED_SOURCES =  $(IDL_TYPES:%.idl=%.c)
GENERATED_HEADERS =  $(IDL_TYPES:%.idl=%.h)

LIBNAME  = idl_dds_types

OBJS_DIR       = obj.$(CPUTYPE)

GENERATED_OBJS = $(GENERATED_SOURCES:%.c=$(OBJS_DIR)/%.o)

LIBDIR   = $(DDS_OUT_DIR)/../../lib.$(CPUTYPE)
BINDIR   = $(DDS_OUT_DIR)/../../../../bin.$(CPUTYPE)
CC       = $(C_COMPILER)
CXX      = $(CPP_COMPILER)
OS       = $(shell uname)
DDSCOMMON = $(DDS_OUT_DIR)/../../Common/src

CFLAGS   = -m32 -g -DRTI_UNIX -DRTI_32BIT
CXXFLAGS = -m32 -g
LDFLAGS  = -m32 -static-libgcc
SYSLIBS  = -ldl -lnsl -lpthread -lm -lc


DEFINES_ARCH_SPECIFIC = -DRTI_UNIX

DEFINES = $(DEFINES_ARCH_SPECIFIC) $(cxx_DEFINES_ARCH_SPECIFIC)

INCLUDES  = -I. -I$(NDDSHOME)/include -I$(NDDSHOME)/include/ndds
INCLUDES += -I$(DDSCOMMON)

LIBS = -L$(NDDSLIBDIR) -L$(LIBDIR) -lrt \
      -lnddscppz -lnddscz -lnddscorez $(SYSLIBS) $(OS_SPECIFIC_LIBS)

COMMONLIBSRC  = $(DDSCOMMON)/dds_common.cxx
COMMONLIBOBJS = $(DDSCOMMON)/obj.$(CPUTYPE)/%.o

$(shell mkdir -p $(OBJS_DIR) $(DDSCOMMON)/obj.$(CPUTYPE) $(DDS_CPP_DIR))

default:        $(GENERATED_OBJS) $(LIBDIR)/lib$(LIBNAME).a

$(OBJS_DIR)/%.o : %.idl $(DDSCOMMON)/dds_common.h
       $(C_COMPILER)  -o $(OBJS_DIR)/$(*F).o $(DEFINES) $(INCLUDES) $(CFLAGS) -c $(*F).c; \
       $(C_COMPILER)  -o $(OBJS_DIR)/$(*F)Support.o $(DEFINES) $(INCLUDES) $(CFLAGS) -c $(*F)Support.c; \
       $(C_COMPILER)  -o $(OBJS_DIR)/$(*F)Plugin.o $(DEFINES) $(INCLUDES) $(CFLAGS) -c $(*F)Plugin.c; \

$(LIBDIR)/lib$(LIBNAME).a: $(GENERATED_OBJS) $(CPP_OBJS)
       @echo "Adding these to lib: " $(OBJS_DIR)/*.o; \
       mkdir -p $(LIBDIR)
       rm -f $(LIBDIR)/lib$(LIBNAME).a
       $(AR) -cr $(LIBDIR)/lib$(LIBNAME).a $(OBJS_DIR)/*.o
       ranlib $(LIBDIR)/lib$(LIBNAME).a

%.idl:
       @echo "Generating C and Ada from $@ ..."; \
       $(NDDSHOME)/scripts/rtiddsgen ${IDL_DIR}/$@ -d $(DDS_OUT_DIR) -I ${IDL_DIR} -replace -language Ada; # -example i86Linux2.6gcc4.1.2;



clean:
       rm -rf $(LIBDIR)/lib$(LIBNAME).a; \
       rm -rf $(DDS_OUT_DIR)/*.h; \
   rm -rf $(DDS_OUT_DIR)/*.c; \
       rm -rf $(DDS_OUT_DIR)/*.gpr; \
       rm -rf $(DDS_OUT_DIR)/samples; \
       rm -rf $(DDS_OUT_DIR)/*.xml; \
       rm -rf $(DDS_OUT_DIR)/makefile_*; \
       rm -rf $(DDS_OUT_DIR)/bin; \
       rm -rf $(DDS_OUT_DIR)/summary_idl*; \
       rm -rf $(DDS_OUT_DIR)/common_idl*; \
       rm -rf $(DDS_OUT_DIR)/alerts_idl*; \
       rm -rf $(DDS_OUT_DIR)/$(OBJS_DIR);

最佳答案

%.idl: 规则这样的规则告诉 make 如何生成 .idl 文件,而不是如何从 .idl 文件生成内容。您想将其更改为 %.c: %.idl -- 如何从 .idl 文件生成 .c 文件。

这将完成您想要的大部分操作 - 唯一的问题是您是否希望能够生成 .ads/.adb 文件而不生成 .c 文件或重建库。

关于c - Makefile 依赖项和时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7878336/

相关文章:

计算数组的大小

c - 基于 X3.9-1978 标准的最佳 IEEE 754-1985 表示

c - genep是什么?

java - 代码中的多播地址未在 DDS 代码中设置

ip - 获取 RTI DDS 上 DataWriter/Publisher 的 IP 地址?

java - 如何将已发布的 DDS 内容附加到订阅者端的现有文件中?

c - 如何使用strncat()避免在运行时中止陷阱6错误?

澄清一些变量的初始值属于C中的存储类 'auto'

sed 用反斜杠替换正斜杠

c - 对 `dlsym' 的 undefined reference Learn C The Hard Way