2017-12-14 15 views
0

私は自分のディレクトリに複数のFPGAビルドを管理するMakefileを持っています。私は各FPGAの一意の名前を持つ変数CS_FPGA_FETCHを持っています。 (私のプロジェクトの多くのサブフォルダはこの名前に基づいています)。リストから作られたMakefileターゲットの基本変数を取得

私は、FPGAごとにターゲットを追加するというきちんとした方法を考えています。私が思いついたのはaddprefixで、プレフィックスを削除しています。

# Every FPGA 
CS_FPGAS_FETCH := cs00 cs01 cs02 cs03 cs10 cs11 cs12 cs13 cs20 cs21 cs22 cs23 cs30 cs31 cs32 cs33 

# this is a list of variables that has the words copy_official_ prefixed 
# to all of the cs00, cs01 
COPY_OFFICIAL_CS_TARGETS=$(addprefix copy_official_,$(CS_FPGAS_FETCH)) 

# because we use add prefix, we HAVE to strip it off 
# this replases $(@) for guys with a prefix, so we can access the base variable inside the loop below 
COPY_TARGET_FPGA_NAME=$(@:copy_official_%=%) 

# this evaluates out to targets named: 
# copy_official_cs00, copy_official_cs01 etc 
$(COPY_OFFICIAL_CS_TARGETS): 
    @echo In $(@) target. Here i copy file $(COPY_TARGET_FPGA_NAME) 
    cp build/$(COPY_TARGET_FPGA_NAME)/file.bit install/$(COPY_TARGET_FPGA_NAME) 

この方法は私には逆のようです。私は使用したいプレフィックスごとにCOPY_TARGET_FPGA_NAMEを作成する必要があります。これは非常に混乱しているようです。私は、プレフィックスの異なるこれらのターゲットを多く追加する必要があります。

答えて

2

あなたの接頭辞がレシピに表示されないため、私はすべての詳細を理解しています。だから、私はそれらのいくつかを持っている点を見ていないので、私は宛先ビットストリームがではなく、install/<fpga>であると仮定します。

また、ターゲットと前提条件が実際のファイルである場合には、やや面白い方法を使用します。たとえば、ビットストリームをコピーするには、install/<prefix><fpga>をターゲットとして使用し、build/<fpga>/file.bitを前提条件とするのがより自然です。

installorder-only prerequisiteとして追加し、ルールを作成します。戻るあなたの主な質問へ

:あなたは、GNUを使用する場合は、リストを反復処理し、各反復中の構築物を作るインスタンス化するforeach-eval-callを使用することができます

# Every FPGA 
CS_FPGAS_FETCH := cs00 cs01 cs02 cs03 cs10 cs11 cs12 cs13 cs20 cs21 cs22 cs23 cs30 cs31 cs32 cs33 

# Every prefix 
PREFIXES = copy_official_ 

.PHONY: all 

# $(1): prefix 
# $(2): FPGA name 
define MY_rule 
all: install/$(1)$(2) 

install/$(1)$(2): build/$(2)/file.bit | install 
    @echo In [email protected] target. Here i copy file $(2) 
    cp build/$(2)/file.bit [email protected] 
endef 
$(foreach p,$(PREFIXES),$(foreach f,$(CS_FPGAS_FETCH),$(eval $(call MY_rule,$(p),$(f))))) 

install: 
    mkdir [email protected] 

あなたのニーズに適応が、MY_rule変数が展開されていることを覚えておいてください2回:evalで1回、通常の処理でmakeで1回。したがって、一部の変数は最初の展開(つまり[email protected])から保護する必要があります。

+0

あなたの助けを借りて接頭辞は 'copy_official_'です! – portforwardpodcast

関連する問題