#c #makefile #data-distribution-service
#c #makefile создать файл #служба распространения данных
Вопрос:
У меня есть makefile, который я использую для создания артефактов с помощью стороннего компилятора IDL (rtiddsgen). Это принимает файлы idl и выдает файлы C / Ada, относящиеся к ним. Затем файлы C компилируются и помещаются в библиотеку (idl_dds_types.a).
У меня есть файлы IDL, перечисленные в переменной IDL_TYPES. Каждый файл 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 будет восстановлен. Кажется, этого не происходит. Есть какие-нибудь идеи, что мне нужно сделать, чтобы это произошло? Я протестировал, «прикоснувшись» к idl-файлу, а затем повторно запустив make.
Вот файл makefile:
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);
Ответ №1:
Правило, подобное вашему %.idl:
правилу, указывает make, как генерировать файлы .idl, а не как генерировать вещи из файлов .idl. Вы хотите изменить это на %.c: %.idl
— как генерировать файлы .c из файлов .idl.
Это сделает большую часть того, что вы хотите — единственная проблема заключается в том, что вы когда-нибудь захотите иметь возможность создавать файлы .ads / .adb БЕЗ создания файлов .c или перестройки библиотеки.