web-dev-qa-db-ja.com

CMakeを介してVisual Studioソリューションのスタートアッププロジェクトを変更するにはどうすればよいですか?

CMakeを使用してVisual Studioプロジェクトを生成しています。 1つ以外はすべて正常に機能します。

ソリューションのスタートアッププロジェクトは常にALL_BUILD。スタートアッププロジェクトを、CMakeを介して実際のプロジェクトに変更するにはどうすればよいですか?

57
giggle

できません。スタートアッププロジェクトは、CMakeによって生成されないバイナリファイルに格納されます。そのバイナリファイルがない場合、Visual Studioはデフォルトでソリューションファイルの最初のプロジェクトになり、ALL_BUILDプロジェクトが常に最初になります...

更新:この回答はCMake 3.6で実行できるようになったため、「期限切れ」です。 ComicSansMSによる回答 を参照してください。

20
André

CMakeは VS_STARTUP_PROJECT ディレクトリプロパティを通じて、バージョン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)

これにより、barfoo.slnソリューションのスタートアッププロジェクトとして設定されます。

92
ComicSansMS

Visual 2005以降、構成はprojectname.vc(x)proj.userというファイル名で保存されます。これはプレーンなxmlです。

スタートアッププロジェクトを変更する方法についてはわかりませんが、愚かなポップアップを表示する代わりに、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)

使用可能な例 ここ

15
Calvin1602

私のようにPerlの依存関係を許可できない場合、これを解決するためにslnStartupProjectというWindows用の小さなコマンドラインユーティリティを作成しました。スタートアッププロジェクトは次のように自動的に設定されます。

slnStartupProject slnFilename projectName

私は個人的にそれを使用して、常にダミーALL_BUILDプロジェクトを最初のプロジェクトとして設定する cmake でソリューションを生成した後、プロジェクトを設定しますソリューションで。

ソースはgithubにあります:

https://github.com/michaKFromParis/slnStartupProject

フォークとフィードバックは大歓迎です。

お役に立てれば!

6
michaK

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マシンで作成およびテスト済み)

1
SvenS