5

次のような Makefile があります。

.SECONDARY:

NVCC = nvcc
NVCCFLAGS = --gpu-architecture compute_20

CXX = g++
CXXFLAGS = -O3 -std=c++0x -Wall

CXXLINT = python cpplint.py
CXXLINTFLAGS = --filter=-build/include,-readability/streams,-runtime/sizeof,-whitespace/parens

PROTOC = protoc
PROTOCFLAGS = --cpp_out=.

BINS = my_binary
LIBS = -lcublas -lcusparse
PROTOS = $(wildcard *.proto)
SOURCES = $(wildcard *.cu)
HEADERS = $(wildcard *.cuh)
PBS = $(PROTOS:%.proto=%.pb)
DEPS = $(SOURCES:%.cu=%.d)
TESTS = my_test

all: lint protos
all: deps
all: bins
protos: ${PBS}
deps: ${DEPS}
bins: ${BINS}

clean:
    rm -rf *.o *.d *.pb.cc *.pb.h ${BINS} ${TESTS}

lint:
    ${CXXLINT} ${CXXLINTFLAGS} ${SOURCES}
    ${CXXLINT} ${CXXLINTFLAGS} ${HEADERS}

tests: lint protos
tests: deps
tests: ${TESTS}
tests: tests-run
tests-run: ${TESTS}
    for f in $^; do eval "/usr/bin/time -f \"$$f runtime: %E\" ./$$f"; done

%: %.o
    ${NVCC} ${NVCCFLAGS} -o $@ $^ ${LIBS}

%.d: %.cu
#   ${CXXLINT} ${CXXLINTFLAGS} $*.cu
    ${NVCC} -M -o $*.d $*.cu

%.o: %.cu
    ${NVCC} ${NVCCFLAGS} -c -o $@ $*.cu
    rm $*.d

%.pb: %.proto
    ${PROTOC} ${PROTOCFLAGS} $*.proto
    ${CXX} ${CXXFLAGS} -c -o $*.pb.o $*.pb.cc

ifneq ($(MAKECMDGOALS),clean)
-include ${DEPS}
endif

この問題は、proto ターゲットがビルドされるまで DEPS を生成できないために発生します。プロトコル バッファを構築すると新しいヘッダー ファイルがツリーに追加されるため、これが DEPS の前に最初に行われないと、生成された *.pb.h が見つからないため、nvcc -M (依存関係の作成) は失敗します。 . これを修正する方法はありますか?

4

2 に答える 2

7

もう 1 つの解決策は、依存関係ファイルをプロトコル バッファー生成の結果に依存させることです。次のスニペットには、それを行うためのすべての手順が含まれています。1 つずつ説明するのは難しいため、下部にいくつかの項目の説明があります。

CXX_FLAGS      := $(shell pkg-config --cflags protobuf) -xc++
LD_FLAGS       := $(shell pkg-config --libs protobuf)

PROTOS         := $(wildcard *.proto)
PROTO_OBJS     := $(PROTOS:.proto=.pb.o)

BINS     := my_binary

SRCS     := $(wildcard *.cu)
OBJS     := $(SRCS:.cu=.o)
DEPS     := $(SRCS:.cu=.d)

PBSRCS   := $(wildcard *.proto)
PBOBJS   := $(PROTOS:.proto=.pb.o)
PBGENS   := $(PROTOS:.proto=.pb.cc) $(PROTOS:.proto=.pb.h)

all: $(BINS)

clean:
        rm -f $(BINS) $(OBJS) $(DEPS) $(PBOBJS) $(PBGENS)

$(BINS): $(OBJS)
$(OBJS): $(DEPS)
$(DEPS): $(PBOBJS)

.PRECIOUS: $(PBGENS)

%.d: %.cu
        $(CXX) -M $(CXX_FLAGS) $< > $@

%.pb.cc: %.proto
        protoc --cpp_out=. $<

%.pb.o : %.pb.cc
        $(CXX) $(CXX_FLAGS) -c -o $@ $<

%.o: %.cu
        $(CXX) $(CXX_FLAGS) -c -o $@ $<

$(BINS): %: %.o
        $(CXX) $(LD_FLAGS) -o $@ $(PROTO_OBJS) $^

ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif

このpkg-configコマンドは必須ではありませんが、protobuf ファイルに関連するコンパイルおよびリンク フラグを自動的に取得する場合に便利です。もちろん、この変数に独自のフラグを追加する必要があります。

はおそらく役に立たないかもしれませんが、ファイルを操作して C++ として解釈-xc++できるようにするためにここで使用されています。.cuとは異なるコンパイラの場合でもnvcc

この行$(DEPS): $(PBOBJS)は、依存関係を作成する前に protobuf ファイルを作成してコンパイルする必要があることを示しています。これを実現するにはいくつかの方法があるため、これは方法の例にすぎません。

この.PRECIOUSmakeは、生成された protobuf ファイルを保持するように指示します。この例のスニペットでは、これらのファイルは中間と見なされ、この行がないと削除されます。

前の回答とこれにはあまり共通点がないため、これを別の回答として投稿しました。

于 2012-07-15T23:52:03.857 に答える
1

依存関係を構築するとき、ヘッダー ファイルが見つからない場合でも続行することを選択できます。cppまたはを使用gccすると、 options を使用して実現できます-MM -MG。私は NVCC の経験がありませんが、マニュアルでこれらのフラグをサポートしているとは思いませんでした。それが当てはまる場合はcpp、依存関係の生成のみに切り替えてみてください。cppマニュアルページから:

-MG は、不足しているヘッダー ファイルが生成されたファイルであると想定し、エラーを発生させずにそれらを依存関係リストに追加します。

ちなみに、あなたのパターンルール%.pb: %.protoは私には正しくないようです。現在のアプローチに依存して%.pb.hおり、現在のアプローチでは、ファイルの作成方法がわからないため、依存関係を解決する方法がわかりません。%.pb.cc%.protomake%.pb.h.pb.h

于 2012-07-10T12:54:10.723 に答える