diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 5020969e8..72ffca01d 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -135,6 +135,10 @@ const char* cmSystemTools::GetExecutableExtension() bool cmSystemTools::MakeDirectory(const char* path) { + if(cmSystemTools::FileExists(path)) + { + return true; + } std::string dir = path; cmSystemTools::ConvertToUnixSlashes(dir); @@ -144,29 +148,36 @@ bool cmSystemTools::MakeDirectory(const char* path) { pos = 0; } + std::string topdir; while((pos = dir.find('/', pos)) != std::string::npos) { - std::string topdir = dir.substr(0, pos); + topdir = dir.substr(0, pos); Mkdir(topdir.c_str()); pos++; } - if(Mkdir(path) != 0) + if(topdir[dir.size()] == '/') + { + topdir = dir.substr(0, dir.size()); + } + else + { + topdir = dir; + } + if(Mkdir(topdir.c_str()) != 0) { // There is a bug in the Borland Run time library which makes MKDIR // return EACCES when it should return EEXISTS - #ifdef __BORLANDC__ - if( (errno != EEXIST) && (errno != EACCES) ) - { - return false; - } - #else // if it is some other error besides directory exists // then return false - if(errno != EEXIST) + if( (errno != EEXIST) +#ifdef __BORLANDC__ + && (errno != EACCES) +#endif + ) { + cmSystemTools::Error("Faild to create directory:", path); return false; } - #endif } return true; } diff --git a/Source/cmUnixMakefileGenerator.cxx b/Source/cmUnixMakefileGenerator.cxx index d93b803da..eb985e1a6 100644 --- a/Source/cmUnixMakefileGenerator.cxx +++ b/Source/cmUnixMakefileGenerator.cxx @@ -59,25 +59,41 @@ void cmUnixMakefileGenerator::GenerateMakefile() if (m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH")) { m_LibraryOutputPath = m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH"); - if(m_LibraryOutputPath.size() && - m_LibraryOutputPath[m_LibraryOutputPath.size() -1] != '/') + if(m_LibraryOutputPath.size()) { - m_LibraryOutputPath += "/"; + if(m_LibraryOutputPath[m_LibraryOutputPath.size() -1] != '/') + { + m_LibraryOutputPath += "/"; + } + if(!cmSystemTools::MakeDirectory(m_LibraryOutputPath.c_str())) + { + cmSystemTools::Error("Error failed create " + "LIBRARY_OUTPUT_PATH directory:", + m_LibraryOutputPath.c_str()); + } + m_Makefile->AddLinkDirectory(m_LibraryOutputPath.c_str()); } - cmSystemTools::MakeDirectory(m_LibraryOutputPath.c_str()); - m_Makefile->AddLinkDirectory(m_LibraryOutputPath.c_str()); } if (m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH")) { - m_ExecutableOutputPath = m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH"); - if(m_ExecutableOutputPath.size() && - m_ExecutableOutputPath[m_ExecutableOutputPath.size() -1] != '/') + m_ExecutableOutputPath = + m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH"); + if(m_ExecutableOutputPath.size()) { - m_ExecutableOutputPath += "/"; + if(m_ExecutableOutputPath[m_ExecutableOutputPath.size() -1] != '/') + { + m_ExecutableOutputPath += "/"; + } + if(!cmSystemTools::MakeDirectory(m_ExecutableOutputPath.c_str())) + { + cmSystemTools::Error("Error failed to create " + "EXECUTABLE_OUTPUT_PATH directory:", + m_ExecutableOutputPath.c_str()); + } + m_Makefile->AddLinkDirectory(m_ExecutableOutputPath.c_str()); } - cmSystemTools::MakeDirectory(m_ExecutableOutputPath.c_str()); - m_Makefile->AddLinkDirectory(m_ExecutableOutputPath.c_str()); } + if(m_CacheOnly) {