2011-08-02 8 views
4

makefile-buildをcmakeに変換しようとしています。make-buildに基づいてwindows-build envを注意しなければならない現状を避けるためです。 msdevとLinuxはmake/gccに基づいています)。makeからcmakeに移動する方法:ビルドターゲットをワイルドカードで使用する方法

このプロジェクトでは、命名規則に基づいてライブラリにコンパイルされたソースコードファイルが入ったディレクトリが見つかりました。 (例えばc1223.c => c1223.dll(または.slという))

現在のメイクファイルは、ワイルドカード、例えばを使用して、いくつかのディレクティブで構成されています

LIB_NO = $(basename $(subst s,,[email protected])) 

OBJ = $(OBJ_PATH)/s$(LIB_NO).o $(OBJ_PATH)/c$(LIB_NO).o\ 
      $(OBJ_PATH)/b$(LIB_NO).o 

$(OBJ_PATH)/%.o : %.c 
    -$(CC) $(CFLAGS) -I$(PWD) -c $< -o [email protected] 
    -(chmod a+w [email protected];true) 

私はしばらくの間、検索ではなく、できましたうまくいくと思われるものを見つけてください。それは、cmakeがワイルドカードベースのビルドを生成することも可能ですか?

すべてのコメント、ヒントや提案が:)

歓声 マルクス

答えて

3

あなたはかなり原始的グロブを使用することができます(私が見ることができる何の正規表現の構文はありません)非常に歓迎されています。

file(GLOB TESTSRCS "test/src/*.cpp") 

# Compile the test sources. 
add_executable(Tests ${TESTSRCS}) 

target_link_libraries(Tests ${LIB} gtest gtest_main) 

実際のメイクファイルには、ワイルドカード検索が含まれていないようです。新しいファイルを追加する場合は、cmakeを再実行する必要があります。

私が知りませんが、生成するライブラリーファイルがたくさんある場合は、1つのマクロでライブラリー作成をまとめて処理する方法です。ライブラリごとに1つだけのCファイルがあります場合は、このような何かを行うことができるかもしれない

:誰がよりよい解決策を持っている場合

file(GLOB libfiles "path/to/libs/c*.c") 

foreach(libfile ${libfiles}) 
    GET_FILENAME_COMPONENT(libname ${libfile} NAME) # remove the '.c' part (untested, hopefully this will work) 
    add_library(${libname} ${libfile}) 
endforeach(libfile) 

が、私もそれを学びたいです。

+0

私は最初に解決する必要がある他の問題に遭遇したので、返信いただきありがとうございます。私はこれに戻ってきます:) – Markus

0

CMakeは、ワイルドカードベースのルールを持つメイクファイルを生成しません。それはそれが知っているファイルのための特定のルールを生成します。

この例では、ライブラリを構成する.oファイルを明示的にリストしています。 CMakeでは、あなたのライブラリに寄与するソースファイルを明示的にリストし、残りの部分をCMakeが処理するようにします。

何らかの理由でワイルドカードベースのルールを持つメイクファイルが必要ですか?

単純にソースファイルのリストを作成し、リスト内の各要素に対して、ソースファイルとソースファイル名から構築されたライブラリ名で「add_library」呼び出しを実行できませんでしたか?

+0

あなたの返事に感謝します。私は他の問題に遭遇しました最初に解決する必要がある、私はこれに戻るでしょう:) – Markus

関連する問題