CMake を使用して Visual Studio プロジェクトを生成しています。1つのことを除いて、すべてが正常に機能します。
ソリューションのスタートアップ プロジェクトは常にALL_BUILD
. スタートアップ プロジェクトを CMake 経由で必要な実際のプロジェクトに変更するにはどうすればよいですか?
CMake を使用して Visual Studio プロジェクトを生成しています。1つのことを除いて、すべてが正常に機能します。
ソリューションのスタートアップ プロジェクトは常にALL_BUILD
. スタートアップ プロジェクトを CMake 経由で必要な実際のプロジェクトに変更するにはどうすればよいですか?
VS_STARTUP_PROJECT
CMake は、バージョン 3.6 以降でディレクトリ プロパティを介してこれをサポートするようになりました。
cmake_minimum_required(VERSION 3.6)
project(foo)
# ...
add_executable(bar ${BAR_SOURCES})
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT bar)
これはbar
、ソリューションのスタートアップ プロジェクトとして設定されfoo.sln
ます。
できません。startup-projectは、CMakeによって生成されないバイナリファイルに保存されます。そのバイナリファイルがないと、Visual Studioはデフォルトでソリューションファイルの最初のプロジェクトになり、ALL_BUILDプロジェクトが常に最初になります...
更新: CMake 3.6で実行可能になったため、この回答は「古くなっています」。ComicSansMSによる回答を参照してください。
Visual 2005 以降、構成はファイル名 projectname.vc(x)proj.user (プレーン xml) に保存されます。
スタートアップ プロジェクトを変更する方法についてはわかりませんが、愚かな popup を表示する代わりに、目的の実行可能ファイルを実行するように ALL_BUILD を設定できます。
create_default_target_launcher(
your_desired_target_name
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/desired_path/"
# or ${CMAKE_CURRENT_BINARY_DIR}, depending on your setup
)
このモジュールはrpavlik の githubで入手できます。これを一番上の CMakeLists.txt に追加するだけです:
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/external/rpavlik-cmake-modules-1c73e35") # or whichever path you put the module in.
include(CreateLaunchers)
例はこちらから入手できます。
IDE で [スタートアップ プロジェクトとして設定] を押したときにユーザーが行った明示的な選択が、バイナリ ファイルに格納されているのは正しいことです。しかし、ソリューションを最初に開いたときに、Visual Studio がソリューション内の最初のプロジェクトを暗黙的なスタートアップ プロジェクトとして取得することを別の場所で見つけたので、CMake はこれに影響を与えます。
今の問題: ALL_BUILD は常に最初のプロジェクトです。これを変更するために、CMake の後に短い perl スクリプトを実行しています。このスクリプトは、必要なプロジェクト定義をファイルから切り取り、前面に貼り付けます。最初のパラメーターのソリューション ファイルへのパス、2 番目のパラメーターのプロジェクト名:
use strict;
use File::Spec;
# variables
my $slnPath = File::Spec->rel2abs($ARGV[0]);
my $projectName = $ARGV[1];
my $contents;
my $header;
my $project;
my $GUID = "[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}";
my $fh;
# read file content (error if not found)
print "Setting \"$projectName\" as Startup Project in \"$slnPath\"...\n";
die "Error: path \"$slnPath\" not found!\n" if not -f $slnPath;
open($fh, "<", $slnPath) or die "Error: cannot read $slnPath: $!";
$contents = do { local $/; <$fh> };
close($fh) or warn "close failed: $!";
# extract part before Projects definition section (the first mention of "Project([GUID])")
$header = $1 if $contents =~ s{(.*?(?=Project\("\{${GUID}\}"\)))}{}si;
# extract definition of the project specified (error if not found)
$project = $1 if $contents =~ s{(Project\("\{${GUID}\}"\) = \"${projectName}\".*?EndProject\s)}{}si;
die "Error: Project not found!\n" if not defined $project or not length $project;
# write header, project definition and remaining content back into the file
`attrib -R "$slnPath"`;
open($fh, ">", $slnPath) or die "Error: cannot write to $slnPath: $!";
print $fh $header, $project, $contents;
close($fh) or warn "close failed: $!";
print "Successfully done.\n";
ソリューションが開かれると、暗黙的なスタートアップ プロジェクトがバイナリ ファイルに保存され、明示的になるため、これは CMake の再実行 (たとえば、実行後を許可しない ZERO-CHECK によってトリガーされる) にも耐えられます。同様に、明示的なユーザーの選択も保持されます。
(ActiveState Perl を搭載した Win7 マシンで作成およびテスト済み)