Commit f4b3bdc6 authored by Brad King's avatar Brad King

BUG: Create an exe's implib output dir for VS

If an executable marks symbols with __declspec(dllexport) then VS
creates an import library for it.  However, it forgets to create the
directory that will contain the import library if it is different from
the location of the executable.  We work around this VS bug by creating
a pre-build event on the executable target to make the directory.
parent d30923d6
......@@ -1674,6 +1674,33 @@ void cmLocalVisualStudio7Generator::WriteVCProjEndGroup(std::ostream& fout)
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
void cmLocalVisualStudio7Generator
......@@ -1693,6 +1720,7 @@ void cmLocalVisualStudio7Generator
this->FortranProject? "VFPreBuildEventTool":"VCPreBuildEventTool";
event.Start(tool);
event.Write(target.GetPreBuildCommands());
this->MaybeCreateImplibDir(target, configName, event);
event.Finish();
// Add pre-link event.
......
......@@ -125,6 +125,8 @@ private:
class EventWriter;
friend class EventWriter;
void MaybeCreateImplibDir(cmTarget& target, const char* config,
EventWriter& event);
cmVS7FlagTable const* ExtraFlagTable;
std::string ModuleDefinitionFile;
......
......@@ -34,6 +34,8 @@ ADD_EXECUTABLE(example_exe src/example_exe.cxx)
SET_TARGET_PROPERTIES(example_exe PROPERTIES
ENABLE_EXPORTS 1
OUTPUT_NAME example
# Test placing exe import library in unique directory.
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/exe
)
TARGET_LINK_LIBRARIES(example_exe kwsys)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment