我可以为C项目重新生成一个makefile,具有正确的链接顺序和依赖关系吗?

时间:2013-01-31 10:27:23

标签: c linux unix makefile

我有源代码我最后一次工作在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"

4 个答案:

答案 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代码的乐趣和游戏......这是我很乐意避免但需要的任务。

再次感谢!