5

我有我最后一次在 90 年代后期 - 2000 年工作的源代码,并且除了 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

4 回答 4

4

gcc & clang 可以生成依赖项,请参阅Advanced Auto-Dependency Generation,这不会解决整个问题,但会帮助你。

于 2013-01-31T10:45:03.203 回答
4

您正在寻找来自 MIT 的经典 Unix 工具makedepend

于 2013-01-31T11:11:20.943 回答
1

在 linux/unix 系统上:

find . -name "*.c" -print > sources将为您提供所有来源的列表。

find . -name "*.c" -print|sed s/\.c/\.o > objects应该给你一个列表,你可以在[也许手动添加一些换行符]前面加上“OBJECTS =”。

cat sources|xargs gcc -M > myprog.depsinclude myprog.deps应该给你一个你可以在你的makefile中的头文件依赖列表。[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”并且对每个可执行文件执行上述步骤 - 您仍然可以使用顶级Makefileinclude中间的。

[1] 您可以添加到 makefile - 特别是如果您的项目产生许多不同的可执行文件。

myprog.deps: ${SOURCES}
    ${CC} -MM ${SOURCES} > myprog.deps

include myprog.deps
于 2013-01-31T11:16:47.320 回答
0

感谢您的出色回应:简洁且信息丰富。根据答案,我现在混合使用手动工作和GNU AutoMake(makedepend 的现代继任者)来尝试重新编译,到目前为止似乎非常有效。

然后将出现在 C++ 中移植到 OO 代码的乐趣和游戏......这是我很乐意避免但需要必须完成的任务。

再次感谢!

于 2013-01-31T12:52:56.853 回答