web-dev-qa-db-ja.com

CMakeで、Visual Studio 2010が追加しようとするデバッグディレクトリとリリースディレクトリを回避するにはどうすればよいですか?

数年前からVisual Studio 2010を使用してCMakeベースのプロジェクトの1つを構築しようとしていますが、プロジェクトの出力ディレクトリで問題が発生しています。 Visual Studioは常に、バイナリを出力するときにDebug /およびRelease /サブディレクトリを追加することに非常に熱心であり、さまざまな理由から、それらを常に削除することに非常に熱心でした-今、CMakeの新しいバージョンと新しいバージョンを使用しているためVisual Studioは、CMakeの古い回避策が機能していないようで、 "新しい"方法を探しています。

以前のバージョンのCMake(2.6)と以前のバージョンのVisual Studio(2008)では、以下を使用しました。

IF(MSVC_IDE)
    # A hack to get around the "Debug" and "Release" directories Visual Studio tries to add
    SET_TARGET_PROPERTIES(${targetname} PROPERTIES PREFIX "../")
    SET_TARGET_PROPERTIES(${targetname} PROPERTIES IMPORT_PREFIX "../")
ENDIF(MSVC_IDE)

これは正常に機能しましたが、もはやトリックを実行していないようです。 CMake 2.8.6とVisual Studio 2010で動作する、似ているがより最新の回避策を誰かが知っていますか?

28
Stuart Golodetz

それはあなたが正確に何を望んでいるかに少し依存しますが、私は この質問 と同様に、利用可能な ターゲットプロパティ を確認することをお勧めします。

それはあなたが正確に何を望んでいるかに少し依存します。ターゲットごとに、手動で library_output_directory または runtime_output_directory プロパティを設定できます。

if ( MSVC )
    set_target_properties( ${targetname} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${youroutputdirectory} )
    set_target_properties( ${targetname} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_DEBUG ${youroutputdirectory} )
    set_target_properties( ${targetname} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_RELEASE ${youroutputdirectory} )
    # etc for the other available configuration types (MinSizeRel, RelWithDebInfo)
endif ( MSVC )

次のようなものを使用して、すべてのサブプロジェクトに対してこれをグローバルに行うこともできます。

# First for the generic no-config case (e.g. with mingw)
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${youroutputdirectory} )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${youroutputdirectory} )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${youroutputdirectory} )
# Second, for multi-config builds (e.g. msvc)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
    string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${youroutputdirectory} )
    set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${youroutputdirectory} )
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${youroutputdirectory} )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
56
André

CMakeの現在のバージョンでは、ジェネレータ式を LIBRARY_OUTPUT_DIRECTORY 構成固有のサフィックスを回避します。

追加したばかりです$<$<CONFIG:Debug>:>、それは常に何にも拡張されず、私のものに拡張されます。これは少し奇妙に見えますが、動作します。簡単なコメントで説明できないほど奇妙ではありません。

# Use a generator expression so that the specified folder is used directly, without any
# configuration-dependent suffix.
#
# See https://cmake.org/cmake/help/v3.8/prop_tgt/LIBRARY_OUTPUT_DIRECTORY.html
set_target_properties(library PROPERTIES
                      LIBRARY_OUTPUT_DIRECTORY my/folder/$<$<CONFIG:Debug>:>)
4
Tom Seddon

https://cmake.org/cmake/help/latest/prop_tgt/LIBRARY_OUTPUT_DIRECTORY.html は次のように説明しています:

マルチ構成ジェネレーター(VS、Xcode)は、ジェネレーター式が使用されない限り、構成ごとのサブディレクトリーを指定されたディレクトリーに追加します。

したがって、唯一の回避策はジェネレータ式を使用することです。これを行う1つのクールな方法は、パスの最後に$ <0:>を使用することです。したがって、パスが/ what/ever /の場合、/ what/ever/$ <0:>に置き換える必要があります。

ターゲットの例:Nuuaおよびパス:C:/ Nuua/bin /

set_target_properties(nuua PROPERTIES RUNTIME_OUTPUT_DIRECTORY C:/Nuua/bin/$<0:>)
1
Erik Campobadal