Merge topic 'add_compile_options-command'
a984f32
Introduce add_compile_options command.
This commit is contained in:
commit
93317839b0
|
@ -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;
|
||||||
|
}
|
|
@ -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
|
|
@ -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);
|
||||||
|
|
|
@ -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.",
|
||||||
|
|
|
@ -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&);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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()
|
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
#ifdef DO_GNU_TESTS
|
||||||
|
# ifndef TEST_OPTION
|
||||||
|
# error Expected TEST_OPTION
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue