我有源代码我最后一次工作在90年代后期 - 2000并且全部备份了,除了makefile(是的,谴责,坏备份几乎和没有备份一样好):所以...我是想知道是否有任何自动生成makefile的方法或快速分析依赖关系的好方法?
具体我正在寻找:
这个寻求帮助/建议的原因是代码库是300,000行代码(不包括注释)并且跨越数百个C / O文件,并且我经常尝试手工创建一个make-file它令人沮丧和困惑,因此我最后一次尝试寻求帮助并在这里提出要求。
供参考: 我过去尝试了Cmake,AutoMake,GenMake和类似工具来生成makefile,一切都无济于事,因为依赖性是可怕的。
通用makefile脚本
因为它可能对其他人有用,这里是我通常用于较少复杂的C和C ++项目的makefile,因为它节省了我每次都要担心创建一个新文件:
$(VERBOSE).SILENT:
PROGRAMNAME = prog
CC = gcc
CC += -c
CPP = g++
CPP += -c
ASM = nasm
ASM += -f elf -d ELF_TYPE
LD = g++
OBJFILES = $(patsubst %.c,%.o,$(wildcard *.c))
OBJFILES += $(patsubst %.s,%.o,$(wildcard *.s))
OBJFILES += $(patsubst %.cpp,%.o,$(wildcard *.cpp))
all: $(PROGRAMNAME)
clean:
@echo "Cleaning object files"
@echo " rm -f *.o"
rm -f *.o
@echo "Cleaning backups"
@echo " rm -f *~"
rm -f *~
@echo "Removing program file"
@echo " rm -f "$(PROGRAMNAME)
rm -f $(PROGRAMNAME)
%.o: %.s
@echo "Assembling ASMs "$@
@echo " ASM "$<
$(ASM) $<
%.o: %.c
@echo "(C)ompiling "$@
@echo " CC "$<
$(CC) $<
%.o: %.cpp
@echo "(C++)ompiling "$@
@echo " CPP "$<
$(CPP) $<
$(PROGRAMNAME): $(OBJFILES)
@echo "Get ready...."
@echo "Linking "$@
@echo " LD -o "$(PROGRAMNAME)" "$(OBJFILES)
$(LD) -o $(PROGRAMNAME) $(OBJFILES)
@echo "Cry if it worked! Scream swear and cry if it did not..."
strip: $(PROGRAMNAME)
@echo "Stripping "$(PROGRAMNAME)
echo -n "Size of "$(PROGRAMNAME)" before stripping is "
ls -sh $(PROGRAMNAME) | cut -d' ' -f1
@echo " Stripping "$(PROGRAMNAME)
strip $(PROGRAMNAME)
echo -n "Size of "$(PROGRAMNAME)" after stripping is "
ls -sh $(PROGRAMNAME) | cut -d' ' -f1
nothing:
@echo "Nothing to do; see you later - I'm going home!!!"
@echo "Hey, try some of these:"
@echo "make all - this would be the one you want"
@echo "make strip - does not work in the real world, only in computers"
@echo "make clean - will help clean your mind up"
答案 0 :(得分:4)
gcc&amp; clang可以生成依赖关系,请参阅Advanced Auto-Dependency Generation,这不会解决整个问题,但会帮助你。
答案 1 :(得分:4)
您正在寻找麻省理工学院的经典Unix工具,makedepend。
答案 2 :(得分:1)
在linux / unix系统上:
find . -name "*.c" -print > sources
会为您提供所有来源的列表。
find . -name "*.c" -print|sed s/\.c/\.o > objects
应该给你一个列表,你可以在[可能手动添加一些换行符]前面贴上“OBJECTS =”。
cat sources|xargs gcc -M > myprog.deps
应该为您提供一个可以在makefile中include myprog.deps
的标头依赖项列表。 [1]
现在你需要的只是 TARGET = myprog#无论你怎么称呼你的程序!
OBJECTS = ... # from "objects" file above.
SOURCES = ... # from "sources" file above
INCLUDES = -I subdir1 -I subdir2 ... # include directories used by this product
CFLAGS = ... ${INCLUDES} # Some suitable settings
CC = gcc
LD = ${CC}
LDFLAGS = ... # I don't know what this needs to be - usually nothing complicated.
all: ${TARGET}
clean:
rm -f ${TARGET} ${OBJECTS}
${TARGET}: ${OBJECTS}
${LD} -o $@ ${OBJECTS}
.c.o:
${CC} -o $@ $<
除非你必须构建内部工具或者你的许多源文件实际上并没有产生最终的二进制文件,否则应该完成大部分的努力工作 - 在后一种情况下,你可能需要搜索“ main“并对每个可执行文件执行上述步骤 - 您仍然可以使用顶级Makefile
并使用中间版本的include
。
[1]您可以添加到makefile中 - 特别是如果您的项目生成许多不同的可执行文件。
myprog.deps: ${SOURCES}
${CC} -MM ${SOURCES} > myprog.deps
include myprog.deps
答案 3 :(得分:0)
感谢您的回复:简洁而且非常有信息。根据答案,我现在使用手动工作和GNU AutoMake(makedepend的现代继承者)的混合来尝试重新编译,到目前为止似乎非常有效。
然后将来到C ++中移植到OO代码的乐趣和游戏......这是我很乐意避免但需要的任务。
再次感谢!