17

私はcmake自分のプロジェクトを構築するために使用しています。UNIX の場合make、プロジェクトのルート ディレクトリから入力し、 cmake(まだ存在しない場合は) 適切な Makefile を作成するために呼び出してから、プロジェクトをビルドしたいと考えています。cmake「内部」ファイル (オブジェクト ファイル、cmake内部 Makefile など) を非表示 (たとえば、.buildディレクトリに配置) にして、プロジェクト ディレクトリが乱雑にならないようにしたいと考えています。

私のプロジェクトにはいくつかのサブプロジェクトがあります (特に、ライブラリ、ユーザー実行可能ファイル、単体テスト実行可能ファイル)。makeサブプロジェクトごとに Makefileを実行しcmakeて (上記のように)、そのサブプロジェクトのみをビルドします (依存関係があるため、必要に応じて実行可能ファイルの Makefile からライブラリがビルドされます)。結果のバイナリ (.so ライブラリまたは実行可能ファイル) は、サブプロジェクトのディレクトリにある必要があります。

ちょっとハックな感じはしますが、メインプロジェクトを少しうまくやるMakefileを作りました。私の Makefile は単にのビルド ディレクトリをmake呼び出すだけなので、それを使用して特定のターゲットをビルドすることはできません。cmake

ライブラリは唯一の依存関係であるため (おそらく手動でビルドする必要はなく、私は怠け者なので)、Makefile では省略しました。

BUILD_DIR   :=  .build

.PHONY: all clean project-gui ${BUILD_DIR}/Makefile

all:    project-gui project-test

clean:
    @([ -d ${BUILD_DIR} ] && make -C ${BUILD_DIR} clean && rm -r ${BUILD_DIR}) || echo Nothing to clean

project-gui:  ${BUILD_DIR}/Makefile
    @make -C ${BUILD_DIR} project-gui
    @cp ${BUILD_DIR}/project-gui/project-gui $@

project-test:  ${BUILD_DIR}/Makefile
    @make -C ${BUILD_DIR} project-test
    @cp ${BUILD_DIR}/project-test/project-test $@

${BUILD_DIR}/Makefile:
    @[ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}
    @[ -f ${BUILD_DIR}/Makefile ] || (cd ${BUILD_DIR} && cmake ${CMAKE_OPTS} ..)

それが役立つ場合、これが私のプロジェクト構造です(これが「間違っている」場合は教えてください-私はまだ学んでいますcmake):

project/
project/CMakeLists.txt
project/common.cmake
project/Makefile -- see Makefile above for this; should be replaced with something better, building libproject, project-gui, and project-test

project/libproject/
project/libproject/CMakeLists.txt
project/libproject/libproject.so -- after build
project/libproject/Makefile -- doesn't exist yet; should build libproject only
project/libproject/source/
project/libproject/include/

project/project-gui/
project/project-gui/CMakeLists.txt
project/project-gui/Makefile -- doesn't exist yet; should build libproject then project-gui
project/project-gui/source/
project/project-gui/include/

project/project-test/
project/project-test/CMakeLists.txt
project/project-test/Makefile -- doesn't exist yet; should build libproject then project-test
project/project-test/source/
project/project-test/include/

cmakeまだ理解していない場合は、基本的に、あたかもプロジェクトが Makefile だけで構成されているかのように、プロジェクトとサブプロジェクトをそこにないかのように構築する方法を探しています。これはできますか?ソリューションは洗練されていますか、それとも面倒ですか? 代わりに何か他のことをしようとする必要がありますか?

ありがとう!

4

1 に答える 1

9

cmake が makefile を生成している場合、生成された makefile をマスター makefile に単純に含めることができます。

# makefile
all:                # Default
include $GENERATED
$GENERATED:$CMAKEFILE
   #  Generate the makefile here`

インクルード ファイルが生成され、新しいインクルード ファイルで make が再起動されます。含まれるファイルには、ターゲットなどの詳細が記載されている必要があります。

vpath ディレクティブを使用して、使用するファイルの場所を変更できるはずです。たとえば、Gnu make manualを参照してください。

vpath %.o project/.build

それ以外の場合は、必要なディレクトリをメモしてルールを書き直すという面倒な方法があります。

Ed: おそらくフラットなメイクファイルを使うべきではありません。

次のようなものを試してください:

# makefile
all: gui test
clean:
    $(MAKE) -f $(GUI-MAKE) clean
    $(MAKE) -f $(TEST-MAKE) clean

gui:$(GUI-MAKE)
    $(MAKE) -f $(GUI-MAKE) all
$(GUI-MAKE):$(GUI-CMAKE)
    # Generate

# Same for test

$(MAKE) -f $(GUI-MAKE) all コマンドがコマンド ラインで機能し、生成ターゲットで cmake を隠している場合、これは機能するはずです。他のターゲットもすべてマスター makefile にコピーし、make を並行して実行するように注意する必要があります。

オブジェクトファイルの伝播には、次のようなものが含まれる必要があります

%.o:$(GUI-MAKE)
    $(MAKE) -f $(GUI-MAKE) $@

ただし、テスト オブジェクトを作成しようとするとエラーが発生する可能性があります。

于 2009-01-02T05:29:42.457 に答える