Merge topic 'add_compile_options-command'

a984f32 Introduce add_compile_options command.
This commit is contained in:
Brad King 2013-06-05 09:39:05 -04:00 committed by CMake Topic Stage
commit 93317839b0
8 changed files with 202 additions and 1 deletions

View File

@ -0,0 +1,28 @@
/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2013 Stephen Kelly <steveire@gmail.com>
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
#include "cmAddCompileOptionsCommand.h"
bool cmAddCompileOptionsCommand
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
{
if(args.size() < 1 )
{
return true;
}
for(std::vector<std::string>::const_iterator i = args.begin();
i != args.end(); ++i)
{
this->Makefile->AddCompileOption(i->c_str());
}
return true;
}

View File

@ -0,0 +1,72 @@
/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2013 Stephen Kelly <steveire@gmail.com>
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
#ifndef cmAddCompileOptionsCommand_h
#define cmAddCompileOptionsCommand_h
#include "cmCommand.h"
#include "cmDocumentGeneratorExpressions.h"
class cmAddCompileOptionsCommand : public cmCommand
{
public:
/**
* This is a virtual constructor for the command.
*/
virtual cmCommand* Clone()
{
return new cmAddCompileOptionsCommand;
}
/**
* This is called when the command is first encountered in
* the CMakeLists.txt file.
*/
virtual bool InitialPass(std::vector<std::string> const& args,
cmExecutionStatus &status);
/**
* The name of the command as specified in CMakeList.txt.
*/
virtual const char* GetName() const {return "add_compile_options";}
/**
* Succinct documentation.
*/
virtual const char* GetTerseDocumentation() const
{
return "Adds options to the compilation of source files.";
}
/**
* More documentation.
*/
virtual const char* GetFullDocumentation() const
{
return
" add_compile_options(<option> ...)\n"
"Adds options to the compiler command line for sources in the "
"current directory and below. This command can be used to add any "
"options, but alternative commands exist to add preprocessor "
"definitions or include directories. "
"See documentation of the directory and target COMPILE_OPTIONS "
"properties for details. "
"Arguments to add_compile_options may use \"generator "
"expressions\" with the syntax \"$<...>\". "
CM_DOCUMENT_COMMAND_GENERATOR_EXPRESSIONS
CM_DOCUMENT_LANGUAGE_GENERATOR_EXPRESSIONS
;
}
cmTypeMacro(cmAddCompileOptionsCommand, cmCommand);
};
#endif

View File

@ -11,6 +11,7 @@
============================================================================*/ ============================================================================*/
#include "cmCommands.h" #include "cmCommands.h"
#if defined(CMAKE_BUILD_WITH_CMAKE) #if defined(CMAKE_BUILD_WITH_CMAKE)
#include "cmAddCompileOptionsCommand.cxx"
#include "cmAuxSourceDirectoryCommand.cxx" #include "cmAuxSourceDirectoryCommand.cxx"
#include "cmBuildNameCommand.cxx" #include "cmBuildNameCommand.cxx"
#include "cmElseIfCommand.cxx" #include "cmElseIfCommand.cxx"
@ -52,6 +53,7 @@ void GetPredefinedCommands(std::list<cmCommand*>&
) )
{ {
#if defined(CMAKE_BUILD_WITH_CMAKE) #if defined(CMAKE_BUILD_WITH_CMAKE)
commands.push_back(new cmAddCompileOptionsCommand);
commands.push_back(new cmAuxSourceDirectoryCommand); commands.push_back(new cmAuxSourceDirectoryCommand);
commands.push_back(new cmBuildNameCommand); commands.push_back(new cmBuildNameCommand);
commands.push_back(new cmElseIfCommand); commands.push_back(new cmElseIfCommand);

View File

@ -21,6 +21,7 @@
#include "cmCacheManager.h" #include "cmCacheManager.h"
#include "cmFunctionBlocker.h" #include "cmFunctionBlocker.h"
#include "cmListFileCache.h" #include "cmListFileCache.h"
#include "cmDocumentGeneratorExpressions.h"
#include "cmCommandArgumentParserHelper.h" #include "cmCommandArgumentParserHelper.h"
#include "cmDocumentCompileDefinitions.h" #include "cmDocumentCompileDefinitions.h"
#include "cmGeneratorExpression.h" #include "cmGeneratorExpression.h"
@ -1270,6 +1271,11 @@ void cmMakefile::RemoveDefineFlag(const char* flag,
} }
} }
void cmMakefile::AddCompileOption(const char* option)
{
this->AppendProperty("COMPILE_OPTIONS", option);
}
bool cmMakefile::ParseDefineFlag(std::string const& def, bool remove) bool cmMakefile::ParseDefineFlag(std::string const& def, bool remove)
{ {
// Create a regular expression to match valid definitions. // Create a regular expression to match valid definitions.
@ -1493,6 +1499,12 @@ void cmMakefile::InitializeFromParent()
parentIncludes.begin(), parentIncludes.begin(),
parentIncludes.end()); parentIncludes.end());
const std::vector<cmValueWithOrigin> parentOptions =
parent->GetCompileOptionsEntries();
this->CompileOptionsEntries.insert(this->CompileOptionsEntries.end(),
parentOptions.begin(),
parentOptions.end());
this->SystemIncludeDirectories = parent->SystemIncludeDirectories; this->SystemIncludeDirectories = parent->SystemIncludeDirectories;
// define flags // define flags
@ -3468,6 +3480,18 @@ void cmMakefile::SetProperty(const char* prop, const char* value)
cmValueWithOrigin(value, lfbt)); cmValueWithOrigin(value, lfbt));
return; return;
} }
if (propname == "COMPILE_OPTIONS")
{
this->CompileOptionsEntries.clear();
if (!value)
{
return;
}
cmListFileBacktrace lfbt;
this->GetBacktrace(lfbt);
this->CompileOptionsEntries.push_back(cmValueWithOrigin(value, lfbt));
return;
}
if ( propname == "INCLUDE_REGULAR_EXPRESSION" ) if ( propname == "INCLUDE_REGULAR_EXPRESSION" )
{ {
@ -3507,6 +3531,14 @@ void cmMakefile::AppendProperty(const char* prop, const char* value,
cmValueWithOrigin(value, lfbt)); cmValueWithOrigin(value, lfbt));
return; return;
} }
if (propname == "COMPILE_OPTIONS")
{
cmListFileBacktrace lfbt;
this->GetBacktrace(lfbt);
this->CompileOptionsEntries.push_back(
cmValueWithOrigin(value, lfbt));
return;
}
if ( propname == "LINK_DIRECTORIES" ) if ( propname == "LINK_DIRECTORIES" )
{ {
std::vector<std::string> varArgsExpanded; std::vector<std::string> varArgsExpanded;
@ -3632,6 +3664,20 @@ const char *cmMakefile::GetProperty(const char* prop,
} }
return output.c_str(); return output.c_str();
} }
else if (!strcmp("COMPILE_OPTIONS",prop))
{
std::string sep;
for (std::vector<cmValueWithOrigin>::const_iterator
it = this->CompileOptionsEntries.begin(),
end = this->CompileOptionsEntries.end();
it != end; ++it)
{
output += sep;
output += it->Value;
sep = ";";
}
return output.c_str();
}
bool chain = false; bool chain = false;
const char *retVal = const char *retVal =
@ -4002,6 +4048,20 @@ void cmMakefile::DefineProperties(cmake *cm)
"the include paths for the compiler. " "the include paths for the compiler. "
"See also the include_directories command."); "See also the include_directories command.");
cm->DefineProperty
("COMPILE_OPTIONS", cmProperty::DIRECTORY,
"List of options to pass to the compiler.",
"This property specifies the list of directories given "
"so far for this property. "
"This property exists on directories and targets. "
"\n"
"The target property values are used by the generators to set "
"the options for the compiler.\n"
"Contents of COMPILE_OPTIONS may use \"generator expressions\" with "
"the syntax \"$<...>\". "
CM_DOCUMENT_COMMAND_GENERATOR_EXPRESSIONS
CM_DOCUMENT_LANGUAGE_GENERATOR_EXPRESSIONS);
cm->DefineProperty cm->DefineProperty
("LINK_DIRECTORIES", cmProperty::DIRECTORY, ("LINK_DIRECTORIES", cmProperty::DIRECTORY,
"List of linker search directories.", "List of linker search directories.",

View File

@ -206,6 +206,7 @@ public:
*/ */
void AddDefineFlag(const char* definition); void AddDefineFlag(const char* definition);
void RemoveDefineFlag(const char* definition); void RemoveDefineFlag(const char* definition);
void AddCompileOption(const char* option);
/** Create a new imported target with the name and type given. */ /** Create a new imported target with the name and type given. */
cmTarget* AddImportedTarget(const char* name, cmTarget::TargetType type, cmTarget* AddImportedTarget(const char* name, cmTarget::TargetType type,
@ -866,6 +867,10 @@ public:
{ {
return this->IncludeDirectoriesEntries; return this->IncludeDirectoriesEntries;
} }
std::vector<cmValueWithOrigin> GetCompileOptionsEntries() const
{
return this->CompileOptionsEntries;
}
bool IsGeneratingBuildSystem(){ return this->GeneratingBuildSystem; } bool IsGeneratingBuildSystem(){ return this->GeneratingBuildSystem; }
void SetGeneratingBuildSystem(){ this->GeneratingBuildSystem = true; } void SetGeneratingBuildSystem(){ this->GeneratingBuildSystem = true; }
@ -919,6 +924,7 @@ protected:
std::string DefineFlags; std::string DefineFlags;
std::vector<cmValueWithOrigin> IncludeDirectoriesEntries; std::vector<cmValueWithOrigin> IncludeDirectoriesEntries;
std::vector<cmValueWithOrigin> CompileOptionsEntries;
// Track the value of the computed DEFINITIONS property. // Track the value of the computed DEFINITIONS property.
void AddDefineFlag(const char*, std::string&); void AddDefineFlag(const char*, std::string&);

View File

@ -297,7 +297,7 @@ void cmTarget::DefineProperties(cmake *cm)
"List of options to pass to the compiler.", "List of options to pass to the compiler.",
"This property specifies the list of options specified " "This property specifies the list of options specified "
"so far for this property. " "so far for this property. "
"This property exists on targets only. " "This property exists on directories and targets. "
"\n" "\n"
"The target property values are used by the generators to set " "The target property values are used by the generators to set "
"the options for the compiler.\n" "the options for the compiler.\n"
@ -1640,6 +1640,14 @@ void cmTarget::SetMakefile(cmMakefile* mf)
{ {
this->InsertInclude(*it); this->InsertInclude(*it);
} }
const std::vector<cmValueWithOrigin> parentOptions =
this->Makefile->GetCompileOptionsEntries();
for (std::vector<cmValueWithOrigin>::const_iterator it
= parentOptions.begin(); it != parentOptions.end(); ++it)
{
this->InsertCompileOption(*it);
}
this->SetPropertyDefault("C_VISIBILITY_PRESET", 0); this->SetPropertyDefault("C_VISIBILITY_PRESET", 0);
this->SetPropertyDefault("CXX_VISIBILITY_PRESET", 0); this->SetPropertyDefault("CXX_VISIBILITY_PRESET", 0);

View File

@ -0,0 +1,14 @@
cmake_minimum_required(VERSION 2.8)
project(add_compile_options)
add_compile_options(-DTEST_OPTION)
add_executable(add_compile_options main.cpp)
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
target_compile_definitions(add_compile_options
PRIVATE
"DO_GNU_TESTS"
)
endif()

View File

@ -0,0 +1,11 @@
#ifdef DO_GNU_TESTS
# ifndef TEST_OPTION
# error Expected TEST_OPTION
# endif
#endif
int main(void)
{
return 0;
}