Как изменить проект запуска решения Visual Studio с помощью CMake?

Я использую CMake для создания проектов Visual Studio. Все работает отлично, кроме одного.

проект запуска в решении всегда ALL_BUILD. Как изменить проект запуска на реальный проект, который я хочу через CMake?

6 ответов


ты не можешь. Стартап-проект хранится в двоичном файле, который не генерируется CMake. Без этого двоичного файла visual studio по умолчанию будет первым проектом в файле решения, и проект ALL_BUILD всегда будет первым...

обновление: этот ответ "устарел", так как теперь это возможно с CMake 3.6. См.ответ от ComicSansMS.


CMake теперь поддерживает это с версиями 3.6 и выше через VS_STARTUP_PROJECT свойство папки:

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 решение.


начиная с Visual 2005 конфигурация хранится в имени файла projectname.vc (x)proj.пользователь, который является простым 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)

примеры существующих здесь.


Если вы не можете разрешить зависимость perl, как я, я просто написал небольшую утилиту командной строки для windows под названием slnStartupProject чтобы решить это. Он автоматически устанавливает проект запуска следующим образом:

slnStartupProject slnFilename projectName

Я лично использую его для установки проекта после генерации решения с помощью cmake это всегда устанавливает манекен ALL_BUILD проект как первый проект в решении.

источник - github:

https://github.com/michaKFromParis/slnStartupProject

вилки и обратные связи приветствуются.

надеюсь, что это помогает!


правильно, что явный выбор, который пользователь делает при нажатии "Set as startup project" в IDE, хранится в двоичном файле. Но я нашел где-то еще, что Visual Studio принимает первый проект в решении как неявный проект запуска при первом открытии решения, поэтому CMake влияет на это.

наша проблема сейчас: ALL_BUILD всегда является первым проектом. Чтобы изменить это, я запускаю короткий скрипт perl после CMake, который сокращает нужный проект определение из файла и вставляет его в переднюю. Путь к файлу решения в первом параметре, имя проекта во втором:

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 =  if $contents =~ s{(.*?(?=Project\("\{${GUID}\}"\)))}{}si;

# extract definition of the project specified (error if not found)
$project =  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 (например, вызванный нулевой проверкой, которая не позволяет после выполнения). Таким же образом сохраняется явный выбор пользователя anm.

(написано и протестировано на машине Win7 с Активностити На Perl)


с cmake 3.5 проект запуска (для VS 2010) можно изменить с помощью

SET(CMAKE_DEFAULT_STARTUP_PROJECT myFavoriteProject)

в основных CMakeLists.txt проекта. По умолчанию установлено значение ALL_BUILD.