Configurando variáveis de ambiente no evento de pré-construção e usando na etapa de compilação
Pergunta
No Visual Studio 2003, estou tentando definir uma variável de ambiente no evento de pré-construção que será usada na etapa de compilação, mas o valor não parece ser propagado.Por exemplo, se o evento de pré-construção contiver isto (diretamente ou em um arquivo em lote):
set MY_LIB_VERSION=1.0.0
e AdicionalIncludeDirectories tem isto:
c:\path\to\library\my_lib_v$(MY_LIB_VERSION)\include
então eu esperaria que a compilação funcionasse se o my_lib_v1.0.0
diretório existe.Mas em vez disso, eu recebo
c:\path\to\prog\my_prog.c(22) : fatal error C1083: Cannot open include file: 'my_lib.h' Project : warning PRJ0018 : The following environment variables were not found: $(MY_LIB_VERSION)
Deduzo que a variável de ambiente definida no evento de pré-construção, portanto, não está sendo propagada para a etapa de compilação, mas posso estar faltando alguma coisa.
Como posso definir a variável de ambiente no evento de pré-construção e usá-la na etapa de compilação?
(Como alternativa, quaisquer outras maneiras sensatas de definir uma versão de biblioteca uma vez e usá-la várias vezes para AdicionalIncludeDirectories e AdicionalLibraryDirectories funcionariam da mesma forma.)
Atualizar:Acabei resolvendo nosso problema de uma maneira diferente.Estamos usando o Subversion e configuramos o svn:externals
propriedade em um subdiretório da origem do projeto chamado dependencies
, de modo que uma verificação do projeto também verificaria <svn_path>\libraries\my_lib_v1.0.0
e chamá-lo dependencies\my_lib
na cópia de trabalho.Então as configurações do projeto poderiam referir-se a dependencies\my_lib\include
e coisas assim.Atualizando para a versão 1.0.1 do my_lib
é então simplesmente uma questão de editar o svn:externals
propriedade - o código e as configurações do projeto não precisaram ser alterados.
Solução
Você pode querer investigar esta ferramenta: http://workspacewhiz.com/SolutionBuildEnvironmentReadme.html
Nós o usamos o tempo todo para gerenciar variáveis de ambiente em nosso ambiente de construção.
Outras dicas
Devo admitir que nunca tentei definir variáveis de ambiente em uma etapa de pré-construção e posso ver por que isso não funcionaria necessariamente (a execução de um arquivo em lote provavelmente acionaria um processo separado, enquanto você desejaria manipular o ambiente do processo pai).
Uma solução alternativa que estou usando, mas que só funcionará quando você puder determinar as configurações necessárias antes de iniciar o Visual Studio, é criar um arquivo em lote que defina as variáveis de ambiente necessárias e, em seguida, inicie o Visual Studio com o arquivo de solução apropriado.Reproduzi o esqueleto deste arquivo em lote abaixo:
REM
REM Set up VS environment with defaults (this is for 2008) - need to do this first
REM
call "C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat"
REM
REM Set the environment variables required by the project
REM
set BOOST_BASE=C:\Boost\include\boost-1_35
REM
REM If you need to manipulate the path, do it here
REM
REM
REM Finally, start VS with the appropriate solution file
REM
devenv MyProjectWithBoost.sln
As variáveis de ambiente definidas usando o comando SET são temporárias e duram apenas durante o tempo de vida do processo no qual são definidas.Eles expiram imediatamente quando o processo expira - e não podem ser vistos por outros processos.
Um evento de pré-compilação do Visual Studio é um processo separado.Depois que esse processo expira, essa variável de ambiente deixa de existir.
Tem certeza de que as variáveis de ambiente são o que você deseja?Você poderia fazer isso definindo um valor em um arquivo de texto mantido em um local de rede central?
EDITAR:Se você realmente deseja alterar persistentemente as variáveis de ambiente no Windows, você pode fazê-lo, mas isso envolverá a chamada de algumas APIs do Windows, em vez de apenas chamar SET.Por exemplo. http://code.activestate.com/recipes/416087/
Tente pesquisar no Google janelas de variáveis de ambiente persistindo