2012-06-07 9 views
8

リンカースクリプトがmakefile /シェル変数にアクセスし、その変数に基づいて決定することは可能ですか?リンカースクリプトのメイク変数またはシェル変数

たとえば、別のリンカースクリプトを使用せずに下のRAM領域の開始点を変更したいとします。これを行うにはmake変数を使用できますか?

MEMORY 
{ 
ifeq ($(SOME_VAR),0) 
RAM (wx) : ORIGIN = 0x100000, LENGTH = 128K 
else 
RAM (wx) : ORIGIN = 0x200000, LENGTH = 128K 
endif 
} 

答えて

0

あなたが使用しているリンカーにもよりますが、それは疑いがあります。リンカがmakeからエクスポートされた変数を読み込むことは可能かもしれませんが、これはすべて、特定のリンカの機能に依存すると言いました。リンカファイルがあまりにも複雑にならない限り、makefileを使ってリンカファイルを実際に生成することもできます。 makefileにヘッダファイルを生成させることに関してgoogleの例がたくさんありますが、リンカファイルを生成するために同じパスに従うことができます。

+0

私はGCCから(LDを使用していますオルセット)。私はスクリプトを生成することを考えましたが、周りのインフラストラクチャをあまりにも多く変更しないことを望んでいました。とにかく、別のリンカースクリプトを用意して、リンク段階でmake変数に基づいてどちらかを選ぶことにしました。スクリプトを生成するより簡単な解決策でした。あなたの答えをありがとう。 – jkayca

0

いくつかのリンカースクリプトのうちの1つが十分でないメイクファイルを決定するソリューションがあれば、make内でスクリプトを生成することは実行可能な選択肢かもしれません。

この解決策は、環境変数にエクスポートされ、$$で参照されるGNU makeの逐語変数に依存します。

define LDSCRIPT_DEF 
/* Include the original libopencm3 linker script */ 
INCLUDE $(OPENCM3_DIR)/lib/stm32/f4/stm32f405x6.ld 

/* Do custom stuff */ 
endef 
export LDSCRIPT_DEF 

$(LDSCRIPT): 
    @echo "$$LDSCRIPT_DEF" > $(LDSCRIPT) 

説明:私はそうのような別のリンカスクリプトでリンカスクリプトを含めるために使用するパス変数を定義するためにこれを使用しています これは、メイクファイルの一部であり、メイクファイルは$を(使用している場合にのみ機能しますLDSCRIPT)をすべての関連規則の前提条件として使用します。

2

ldは環境変数をインポートしないため、直接使用することはできません。これを行うための最善の方法は、エクスポートする環境変数を使用して独自のリンカスクリプトを作成し、オリジナルのリンカスクリプトを持つことであるようにそれを含める:

メイク:

foo: 
    echo SOMEVAR=$(SOMEVAR) > environment_linker_script 
    ld ... 

enviroment_linker_script:

SOMEVAR=xxx 

master_linker_script:

include environment_linker_script 

ifeq ($(SOME_VAR),0) ...