¿Cómo cambio el proyecto de inicio de una solución de Visual Studio a través de CMake?


Estoy usando CMake para generar proyectos de Visual Studio. Todo funciona bien excepto una cosa.

El proyecto de inicio en la solución es siempre ALL_BUILD. ¿Cómo cambio el proyecto de inicio al proyecto real que quiero a través de CMake?

Author: Guy Avraham, 2011-09-05

6 answers

No se puede. El proyecto de inicio se almacena en un archivo binario, que NO es generado por CMake. Sin ese archivo binario, visual studio usará por defecto el primer proyecto en el archivo de solución y el proyecto ALL_BUILD siempre será el primero...

Actualización: esta respuesta está "desactualizada" ya que ahora es factible con CMake 3.6. Véase la respuesta de ComicSansMS.

 17
Author: André,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:16

CMake ahora soporta esto con versiones 3.6 y superiores a través de la VS_STARTUP_PROJECT propiedad del directorio:

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)

Esto establecerá bar como el proyecto de inicio para la solución foo.sln.

 72
Author: ComicSansMS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-23 14:22:20

Desde Visual 2005, la configuración se almacena en un nombre de archivo projectname.vc (x)proj.user, que es xml simple.

No conozco una forma de cambiar el proyecto de inicio, pero ciertamente puede configurar ALL_BUILD para ejecutar el ejecutable deseado en lugar de mostrar la estúpida ventana emergente :

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
)

Este módulo está disponible en el github de rpavlik. Simplemente necesita agregar esto en sus listas de CMAKELIST más altas.txt:

list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/external/rpavlik-cmake-modules-1c73e35") # or whichever path you put the module in.
include(CreateLaunchers)

Ejemplos disponibles aquí.

 15
Author: Calvin1602,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-06 09:34:05

Si no puede permitir una dependencia de perl como yo, acabo de escribir una pequeña utilidad de línea de comandos para Windows llamada slnStartupProject para resolver esto. Establece el Proyecto de inicio automáticamente así:

slnStartupProject slnFilename projectName

Lo uso personalmente para establecer el proyecto después de generar la solución con cmake que siempre establece un proyecto ficticio ALL_BUILD como el primer proyecto en la solución.

La fuente está encendida github:

Https://github.com/michaKFromParis/slnStartupProject

Las bifurcaciones y los comentarios son bienvenidos.

Espero que esto ayude!

 5
Author: michaK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-04 10:40:00

Es correcto que la elección explícita que el usuario hace al pulsar "Establecer como proyecto de inicio" en IDE se almacena en un archivo binario. Pero encontré en otro lugar que Visual Studio toma el primer Proyecto en la solución como un Proyecto de Inicio implícito cuando abre una solución por primera vez, por lo que CMake tiene una influencia en esto.

Nuestro problema ahora: ALL_BUILD es siempre el primer proyecto. Para cambiar esto, estoy ejecutando un script corto de perl después de CMake que corta la definición del proyecto deseado de el archivo y lo pega en el frente. Ruta al archivo de la solución en el primer parámetro, nombre del proyecto en el segundo:

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";

Una vez que se ha abierto la solución, el proyecto de inicio implícito se guarda en el archivo binario y, por lo tanto, se vuelve explícito, por lo que incluso sobrevive a una repetición de CMake (por ejemplo, activada por ZERO-CHECK, que no permite la post-ejecución). De la misma manera, la elección explícita del usuario anm también se conserva.

(Escrito y probado en una máquina Win7 con ActiveState Perl)

 1
Author: SvenS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-18 12:02:13

Con cmake 3.5, el proyecto de inicio (para VS 2010) se puede cambiar con

SET(CMAKE_DEFAULT_STARTUP_PROJECT myFavoriteProject)

En las listas principales de CMakeLists.txt del proyecto. De forma predeterminada, se establece en ALL_BUILD.

 0
Author: mtartar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-15 13:34:51