LINUX.ORG.RU

Генерация Makefile


0

0

Как бы сгенерировать Makefile для директории в которой лежит порядка 40 сишных файлов, из этих файлов должны сгенериться объектные файлы которые реализуют API для DB


(find -iname '*.c' | xargs echo -e 'SRCS = ' && echo -e 'OBJS = $(SRCS:.c=.o)\n\nall: $(OBJS)') > Makefile

no1sm ★★
()

Кури вот это. Эта штука компиит все *.cc файлы в текущем каталоге,
 исходники лексического (*.l) и синтаксического анализаторов (*.y) 
учитывает депенденсы и расскидывает промежуточные файлы по нужным 
папкам (.obj  .dep  .gen ) 


# Имя результирующего файла

ZLANG_NAME = ../lang2


# Директория, где лежат исходники сгенерированные flex-ом и bison-ом 

SCANDIR= ./.gen/

# Директория зависимостей 

DEPSDIR= ./.deps/


# Директория, где лежат *.o 

OBJDIR= ./.obj/

# Опции сборки

CXX = g++ 
CXXFLAGS = -I./.gen/
LDFLAGS=  
LIBS = -lfl

# Исходники лексического и синтаксического генераторов

LEX_SOURCES := $(wildcard *.l)                                                      
BISON_SOURCES := $(wildcard *.y)                                                      

# производные файлы flex и bison

LEX_CPP_SOURCES := $(addprefix $(SCANDIR),$(LEX_SOURCES:.l=.lex.h))
BISON_CPP_SOURCES := $(addprefix $(SCANDIR),$(BISON_SOURCES:.y=.yacc.cc))

# объектные файлы 

BISON_CPP_OBJ := $(addprefix $(OBJDIR),$(BISON_SOURCES:.y=.yacc.o))

# исходники .cc

CPP_SOURCES := $(wildcard *.cc)
CPP_DEPENDS := $(addprefix $(DEPSDIR),$(CPP_SOURCES:.cc=.d))
CPP_OBJ := $(addprefix $(OBJDIR),$(CPP_SOURCES:.cc=.o))

# генерируем лексический, синтаксический анализаторы, компилируем все что получилось

all: generate_lexer generate_parser compile_bison_cpp compile_common_cpp link_all

generate_lexer : $(LEX_CPP_SOURCES) 

$(LEX_CPP_SOURCES) : $(LEX_SOURCES)

generate_parser : $(BISON_CPP_SOURCES) $(BISON_SOURCES) $(LEX_SOURCES)

$(BISON_CPP_SOURCES) : $(BISON_SOURCES) $(LEX_SOURCES)

compile_common_cpp :  $(CPP_OBJ)

compile_bison_cpp : $(BISON_CPP_OBJ)

link_all : $(CPP_OBJ) $(BISON_CPP_OBJ)
	$(CXX) $(LDFLAGS) $(wildcard $(OBJDIR)*.o) -o $(ZLANG_NAME) $(LIBS)

clean:
	rm -f $(SCANDIR)*.lex.h $(SCANDIR)*.yacc.cc $(OBJDIR)*.o $(DEPSDIR)*.d *~ $(ZLANG_NAME)

include $(CPP_DEPENDS)

$(SCANDIR)%.lex.h : %.l
	flex -o$@ $< 		

$(SCANDIR)%.yacc.cc : %.y
	bison -o $@ $< 

$(OBJDIR)%.yacc.o : $(SCANDIR)%.yacc.cc
	$(CXX) $(CXXFLAGS) -c -o $@ $< 

$(DEPSDIR)%.d : %.cc
	echo $(OBJDIR)`$(CXX) $(CXXFLAGS) -MM $<` >$@ 

$(OBJDIR)%.o : %.cc
	$(CXX) $(CXXFLAGS) -c -o $@ $< 

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.