5

私は90年代後半から2000年にかけて最後に取り組んだソースコードを持っており、makefileを除いてすべてバックアップしています(はい、悪いバックアップはバックアップがないのと同じくらい良いです):だから...そこにあるかどうか疑問に思っていますメイクファイルを生成する自動化された方法や、依存関係をすばやく分析する良い方法はありますか?

具体的には、私は探しています:

  • 依存関係を分析し、リンクの順序を修正できるツール。
  • そのような問題が存在しない場合は、過去に同様の問題を抱えていた人から、この問題に最善のアプローチをする方法についてアドバイスをいただければ幸いです。
  • 上記の 2 つのオプションのいずれかが失敗した場合、最善のアプローチは、リンク用の依存関係の順序を自動的に生成できる分析/メイクファイル作成ツールを作成することだと思います (私はこのアプローチを延期しました。別のプロジェクトで)。

このヘルプ/アドバイスの探求の理由は、コードベースが 300,000 行のコード (コメントを除く) であり、数百の C/O ファイルにまたがっているためです。そして困惑するので、助けを求めてここに尋ねる最後の試み.

参考までに:依存関係がひどいため、過去にCmake、 AutoMake 、GenMake、および同様のツールを試してメイクファイルを生成しましたが、すべて役に立ちませんでした


一般的なメイクファイル スクリプト

他の人に役立つかもしれないので、毎回新しいプロジェクトを作成する心配を省くことができるので、複雑でない C および C++ プロジェクトに通常使用するメイクファイルを次に示します。

$(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.depsメイクファイルで使用できるヘッダーの依存関係のリストを提供する必要が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 $@ $<

内部ツールを構築する必要があるか、多くのソースファイルが実際に 1 つの最終的なバイナリを生成しない場合を除き、これでほとんどのハードワークが完了するはずです。後者の場合、おそらく「メイン」を検索して、実行可能ファイルごとに上記の手順を実行します。トップレベルMakefileを使用includeし、中間のものを使用することもできます。

[1] makefile に追加できます。特に、プロジェクトが多数の異なる実行可能ファイルを生成する場合。

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

include myprog.deps
于 2013-01-31T11:16:47.320 に答える
0

素晴らしい回答をありがとう: 簡潔で非常に情報量が多い. 回答に基づいて、手作業とGNU AutoMake(makedependの最新の後継)を組み合わせて再コンパイルを試みていますが、これまでのところ非常に効果的です。

それから、C++ でオブジェクト指向コードに移植するという楽しみとゲームがやってくるでしょう... それは私が喜んで避けたい作業ですが、必要な作業です。

再度、感謝します!

于 2013-01-31T12:52:56.853 に答える