ENH: Generalize exe implib dir creation for VS
In VS 7,8,9 executable targets we generate a build event to create the output directory for the import library in case the executable marks symbols with dllexport (VS forgets to create this directory). This generalizes computation of the custom command line to support future use with other VS versions.
This commit is contained in:
parent
0f490cf025
commit
764ac9803d
@ -1674,33 +1674,6 @@ void cmLocalVisualStudio7Generator::WriteVCProjEndGroup(std::ostream& fout)
|
|||||||
fout << "\t\t</Filter>\n";
|
fout << "\t\t</Filter>\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmLocalVisualStudio7Generator::MaybeCreateImplibDir(cmTarget& target,
|
|
||||||
const char* config,
|
|
||||||
EventWriter& event)
|
|
||||||
{
|
|
||||||
// If an executable exports symbols then VS wants to create an
|
|
||||||
// import library but forgets to create the output directory.
|
|
||||||
if(target.GetType() != cmTarget::EXECUTABLE) { return; }
|
|
||||||
std::string outDir = target.GetDirectory(config, false);
|
|
||||||
std::string impDir = target.GetDirectory(config, true);
|
|
||||||
if(impDir == outDir) { return; }
|
|
||||||
|
|
||||||
// Add a pre-build event to create the directory.
|
|
||||||
cmCustomCommandLine command;
|
|
||||||
command.push_back(this->Makefile->GetRequiredDefinition("CMAKE_COMMAND"));
|
|
||||||
command.push_back("-E");
|
|
||||||
command.push_back("make_directory");
|
|
||||||
command.push_back(impDir);
|
|
||||||
std::vector<std::string> no_output;
|
|
||||||
std::vector<std::string> no_depends;
|
|
||||||
cmCustomCommandLines commands;
|
|
||||||
commands.push_back(command);
|
|
||||||
cmCustomCommand cc(no_output, no_depends, commands, 0, 0);
|
|
||||||
cc.SetEscapeOldStyle(false);
|
|
||||||
cc.SetEscapeAllowMakeVars(true);
|
|
||||||
event.Write(cc);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// look for custom rules on a target and collect them together
|
// look for custom rules on a target and collect them together
|
||||||
void cmLocalVisualStudio7Generator
|
void cmLocalVisualStudio7Generator
|
||||||
@ -1720,7 +1693,12 @@ void cmLocalVisualStudio7Generator
|
|||||||
this->FortranProject? "VFPreBuildEventTool":"VCPreBuildEventTool";
|
this->FortranProject? "VFPreBuildEventTool":"VCPreBuildEventTool";
|
||||||
event.Start(tool);
|
event.Start(tool);
|
||||||
event.Write(target.GetPreBuildCommands());
|
event.Write(target.GetPreBuildCommands());
|
||||||
this->MaybeCreateImplibDir(target, configName, event);
|
cmsys::auto_ptr<cmCustomCommand> pcc(
|
||||||
|
this->MaybeCreateImplibDir(target, configName));
|
||||||
|
if(pcc.get())
|
||||||
|
{
|
||||||
|
event.Write(*pcc);
|
||||||
|
}
|
||||||
event.Finish();
|
event.Finish();
|
||||||
|
|
||||||
// Add pre-link event.
|
// Add pre-link event.
|
||||||
|
@ -125,8 +125,6 @@ private:
|
|||||||
|
|
||||||
class EventWriter;
|
class EventWriter;
|
||||||
friend class EventWriter;
|
friend class EventWriter;
|
||||||
void MaybeCreateImplibDir(cmTarget& target, const char* config,
|
|
||||||
EventWriter& event);
|
|
||||||
|
|
||||||
cmVS7FlagTable const* ExtraFlagTable;
|
cmVS7FlagTable const* ExtraFlagTable;
|
||||||
std::string ModuleDefinitionFile;
|
std::string ModuleDefinitionFile;
|
||||||
|
@ -33,6 +33,36 @@ cmLocalVisualStudioGenerator::~cmLocalVisualStudioGenerator()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
cmsys::auto_ptr<cmCustomCommand>
|
||||||
|
cmLocalVisualStudioGenerator::MaybeCreateImplibDir(cmTarget& target,
|
||||||
|
const char* config)
|
||||||
|
{
|
||||||
|
cmsys::auto_ptr<cmCustomCommand> pcc;
|
||||||
|
|
||||||
|
// If an executable exports symbols then VS wants to create an
|
||||||
|
// import library but forgets to create the output directory.
|
||||||
|
if(target.GetType() != cmTarget::EXECUTABLE) { return pcc; }
|
||||||
|
std::string outDir = target.GetDirectory(config, false);
|
||||||
|
std::string impDir = target.GetDirectory(config, true);
|
||||||
|
if(impDir == outDir) { return pcc; }
|
||||||
|
|
||||||
|
// Add a pre-build event to create the directory.
|
||||||
|
cmCustomCommandLine command;
|
||||||
|
command.push_back(this->Makefile->GetRequiredDefinition("CMAKE_COMMAND"));
|
||||||
|
command.push_back("-E");
|
||||||
|
command.push_back("make_directory");
|
||||||
|
command.push_back(impDir);
|
||||||
|
std::vector<std::string> no_output;
|
||||||
|
std::vector<std::string> no_depends;
|
||||||
|
cmCustomCommandLines commands;
|
||||||
|
commands.push_back(command);
|
||||||
|
pcc.reset(new cmCustomCommand(no_output, no_depends, commands, 0, 0));
|
||||||
|
pcc->SetEscapeOldStyle(false);
|
||||||
|
pcc->SetEscapeAllowMakeVars(true);
|
||||||
|
return pcc;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool cmLocalVisualStudioGenerator::SourceFileCompiles(const cmSourceFile* sf)
|
bool cmLocalVisualStudioGenerator::SourceFileCompiles(const cmSourceFile* sf)
|
||||||
{
|
{
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
|
|
||||||
#include "cmLocalGenerator.h"
|
#include "cmLocalGenerator.h"
|
||||||
|
|
||||||
|
#include <cmsys/auto_ptr.hxx>
|
||||||
|
|
||||||
class cmSourceFile;
|
class cmSourceFile;
|
||||||
class cmSourceGroup;
|
class cmSourceGroup;
|
||||||
|
|
||||||
@ -35,6 +37,10 @@ public:
|
|||||||
virtual ~cmLocalVisualStudioGenerator();
|
virtual ~cmLocalVisualStudioGenerator();
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
/** Construct a custom command to make exe import lib dir. */
|
||||||
|
cmsys::auto_ptr<cmCustomCommand>
|
||||||
|
MaybeCreateImplibDir(cmTarget& target, const char* config);
|
||||||
|
|
||||||
/** Construct a script from the given list of command lines. */
|
/** Construct a script from the given list of command lines. */
|
||||||
std::string ConstructScript(const cmCustomCommandLines& commandLines,
|
std::string ConstructScript(const cmCustomCommandLines& commandLines,
|
||||||
const char* workingDirectory,
|
const char* workingDirectory,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user