2004-04-24 00:20:36 +04:00
/*=========================================================================
Program : CMake - Cross - Platform Makefile Generator
Module : $ RCSfile $
Language : C + +
Date : $ Date $
Version : $ Revision $
Copyright ( c ) 2002 Kitware , Inc . , Insight Consortium . All rights reserved .
See Copyright . txt or http : //www.cmake.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY ; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE . See the above copyright notices for more information .
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
# include "cmGetDirectoryPropertyCommand.h"
# include "cmake.h"
// cmGetDirectoryPropertyCommand
bool cmGetDirectoryPropertyCommand : : InitialPass (
std : : vector < std : : string > const & args )
{
if ( args . size ( ) < 2 )
{
this - > SetError ( " called with incorrect number of arguments " ) ;
return false ;
}
std : : vector < std : : string > : : size_type cc ;
2005-09-13 18:39:42 +04:00
std : : vector < std : : string > : : const_iterator i = args . begin ( ) ;
std : : string variable = * i ;
+ + i ;
2004-04-24 00:20:36 +04:00
std : : string output = " " ;
2005-09-13 18:39:42 +04:00
// get the directory argument if there is one
2006-03-15 19:02:08 +03:00
cmMakefile * dir = this - > Makefile ;
2005-09-13 18:39:42 +04:00
if ( * i = = " DIRECTORY " )
{
+ + i ;
if ( i = = args . end ( ) )
{
this - > SetError
( " DIRECTORY argument provided without subsequent arguments " ) ;
return false ;
}
std : : string sd = * i ;
// make sure the start dir is a full path
if ( ! cmSystemTools : : FileIsFullPath ( sd . c_str ( ) ) )
{
2006-03-15 19:02:08 +03:00
sd = this - > Makefile - > GetStartDirectory ( ) ;
2005-09-13 18:39:42 +04:00
sd + = " / " ;
sd + = * i ;
}
// lookup the makefile from the directory name
cmLocalGenerator * lg =
2006-03-15 19:02:08 +03:00
this - > Makefile - > GetLocalGenerator ( ) - > GetGlobalGenerator ( ) - >
2005-09-13 18:39:42 +04:00
FindLocalGenerator ( sd . c_str ( ) ) ;
if ( ! lg )
{
this - > SetError
( " DIRECTORY argument provided but requested directory not found. This could be because the directory argument was invalid or, it is valid but has not been processed yet. " ) ;
return false ;
}
dir = lg - > GetMakefile ( ) ;
+ + i ;
}
2004-04-24 00:20:36 +04:00
2005-09-13 18:39:42 +04:00
// OK, now we have the directory to process, we just get the requested
// information out of it
if ( * i = = " VARIABLES " | | * i = = " CACHE_VARIABLES " )
2004-04-24 00:20:36 +04:00
{
int cacheonly = 0 ;
2005-09-13 18:39:42 +04:00
if ( * i = = " CACHE_VARIABLES " )
2004-04-24 00:20:36 +04:00
{
cacheonly = 1 ;
}
2005-09-13 18:39:42 +04:00
std : : vector < std : : string > vars = dir - > GetDefinitions ( cacheonly ) ;
2004-04-24 00:20:36 +04:00
for ( cc = 0 ; cc < vars . size ( ) ; cc + + )
{
if ( cc > 0 )
{
output + = " ; " ;
}
output + = vars [ cc ] ;
}
}
2005-09-13 18:39:42 +04:00
else if ( * i = = " MACROS " )
2004-04-24 00:20:36 +04:00
{
2005-09-13 18:39:42 +04:00
dir - > GetListOfMacros ( output ) ;
2004-04-24 00:20:36 +04:00
}
2005-09-13 18:39:42 +04:00
else if ( * i = = " DEFINITIONS " )
2005-07-01 18:23:16 +04:00
{
2005-09-13 18:39:42 +04:00
output = dir - > GetDefineFlags ( ) ;
2005-07-01 18:23:16 +04:00
}
2005-09-13 18:39:42 +04:00
else if ( * i = = " INCLUDE_DIRECTORIES " )
2004-04-24 00:20:36 +04:00
{
std : : vector < std : : string > : : iterator it ;
int first = 1 ;
cmOStringStream str ;
2005-09-13 18:39:42 +04:00
for ( it = dir - > GetIncludeDirectories ( ) . begin ( ) ;
it ! = dir - > GetIncludeDirectories ( ) . end ( ) ;
2004-04-24 00:20:36 +04:00
+ + it )
{
if ( ! first )
{
str < < " ; " ;
}
str < < it - > c_str ( ) ;
first = 0 ;
}
output = str . str ( ) ;
}
2005-09-13 18:39:42 +04:00
else if ( * i = = " INCLUDE_REGULAR_EXPRESSION " )
2004-04-24 00:20:36 +04:00
{
2005-09-13 18:39:42 +04:00
output = dir - > GetIncludeRegularExpression ( ) ;
2004-04-24 00:20:36 +04:00
}
2005-09-13 18:39:42 +04:00
else if ( * i = = " LINK_DIRECTORIES " )
2004-04-24 00:20:36 +04:00
{
std : : vector < std : : string > : : iterator it ;
int first = 1 ;
cmOStringStream str ;
2005-09-13 18:39:42 +04:00
for ( it = dir - > GetLinkDirectories ( ) . begin ( ) ;
it ! = dir - > GetLinkDirectories ( ) . end ( ) ;
2004-04-24 00:20:36 +04:00
+ + it )
{
if ( ! first )
{
str < < " ; " ;
}
str < < it - > c_str ( ) ;
first = 0 ;
}
output = str . str ( ) ;
}
2005-09-13 18:39:42 +04:00
else if ( * i = = " DEFINITION " )
{
+ + i ;
if ( i = = args . end ( ) )
{
this - > SetError
( " A request for a variable definition was made without providing the name of the variable to get. " ) ;
return false ;
}
output = dir - > GetSafeDefinition ( i - > c_str ( ) ) ;
}
2004-04-24 00:20:36 +04:00
else
{
2005-09-13 18:39:42 +04:00
const char * prop = dir - > GetProperty ( i - > c_str ( ) ) ;
2004-05-21 00:56:34 +04:00
if ( prop )
{
2006-03-15 19:02:08 +03:00
this - > Makefile - > AddDefinition ( variable . c_str ( ) , prop ) ;
2004-05-21 00:56:34 +04:00
return true ;
}
2006-03-15 19:02:08 +03:00
this - > Makefile - > AddDefinition ( variable . c_str ( ) , " " ) ;
2005-04-05 00:43:44 +04:00
return true ;
2004-04-24 00:20:36 +04:00
}
2006-03-15 19:02:08 +03:00
this - > Makefile - > AddDefinition ( variable . c_str ( ) , output . c_str ( ) ) ;
2004-04-24 00:20:36 +04:00
return true ;
}