diff options
Diffstat (limited to 'Source/cmFileCommand.cxx')
-rw-r--r-- | Source/cmFileCommand.cxx | 2974 |
1 files changed, 1169 insertions, 1805 deletions
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 6b6b913..5363a99 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -74,232 +74,169 @@ static mode_t mode_setgid = S_ISGID; static std::string fix_file_url_windows(const std::string& url) { std::string ret = url; - if(strncmp(url.c_str(), "file://", 7) == 0) - { + if (strncmp(url.c_str(), "file://", 7) == 0) { std::wstring wurl = cmsys::Encoding::ToWide(url); - if(!wurl.empty()) - { - int mblen = WideCharToMultiByte(CP_ACP, 0, wurl.c_str(), -1, - NULL, 0, NULL, NULL); - if(mblen > 0) - { + if (!wurl.empty()) { + int mblen = + WideCharToMultiByte(CP_ACP, 0, wurl.c_str(), -1, NULL, 0, NULL, NULL); + if (mblen > 0) { std::vector<char> chars(mblen); - mblen = WideCharToMultiByte(CP_ACP, 0, wurl.c_str(), -1, - &chars[0], mblen, NULL, NULL); - if(mblen > 0) - { + mblen = WideCharToMultiByte(CP_ACP, 0, wurl.c_str(), -1, &chars[0], + mblen, NULL, NULL); + if (mblen > 0) { ret = &chars[0]; - } } } } + } return ret; } #endif // cmLibraryCommand -bool cmFileCommand -::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &) +bool cmFileCommand::InitialPass(std::vector<std::string> const& args, + cmExecutionStatus&) { - if(args.size() < 2 ) - { + if (args.size() < 2) { this->SetError("must be called with at least two arguments."); return false; - } + } std::string subCommand = args[0]; - if ( subCommand == "WRITE" ) - { + if (subCommand == "WRITE") { return this->HandleWriteCommand(args, false); - } - else if ( subCommand == "APPEND" ) - { + } else if (subCommand == "APPEND") { return this->HandleWriteCommand(args, true); - } - else if ( subCommand == "DOWNLOAD" ) - { + } else if (subCommand == "DOWNLOAD") { return this->HandleDownloadCommand(args); - } - else if ( subCommand == "UPLOAD" ) - { + } else if (subCommand == "UPLOAD") { return this->HandleUploadCommand(args); - } - else if ( subCommand == "READ" ) - { + } else if (subCommand == "READ") { return this->HandleReadCommand(args); - } - else if ( subCommand == "MD5" || - subCommand == "SHA1" || - subCommand == "SHA224" || - subCommand == "SHA256" || - subCommand == "SHA384" || - subCommand == "SHA512" ) - { + } else if (subCommand == "MD5" || subCommand == "SHA1" || + subCommand == "SHA224" || subCommand == "SHA256" || + subCommand == "SHA384" || subCommand == "SHA512") { return this->HandleHashCommand(args); - } - else if ( subCommand == "STRINGS" ) - { + } else if (subCommand == "STRINGS") { return this->HandleStringsCommand(args); - } - else if ( subCommand == "GLOB" ) - { + } else if (subCommand == "GLOB") { return this->HandleGlobCommand(args, false); - } - else if ( subCommand == "GLOB_RECURSE" ) - { + } else if (subCommand == "GLOB_RECURSE") { return this->HandleGlobCommand(args, true); - } - else if ( subCommand == "MAKE_DIRECTORY" ) - { + } else if (subCommand == "MAKE_DIRECTORY") { return this->HandleMakeDirectoryCommand(args); - } - else if ( subCommand == "RENAME" ) - { + } else if (subCommand == "RENAME") { return this->HandleRename(args); - } - else if ( subCommand == "REMOVE" ) - { + } else if (subCommand == "REMOVE") { return this->HandleRemove(args, false); - } - else if ( subCommand == "REMOVE_RECURSE" ) - { + } else if (subCommand == "REMOVE_RECURSE") { return this->HandleRemove(args, true); - } - else if ( subCommand == "COPY" ) - { + } else if (subCommand == "COPY") { return this->HandleCopyCommand(args); - } - else if ( subCommand == "INSTALL" ) - { + } else if (subCommand == "INSTALL") { return this->HandleInstallCommand(args); - } - else if ( subCommand == "DIFFERENT" ) - { + } else if (subCommand == "DIFFERENT") { return this->HandleDifferentCommand(args); - } - else if ( subCommand == "RPATH_CHANGE" || subCommand == "CHRPATH" ) - { + } else if (subCommand == "RPATH_CHANGE" || subCommand == "CHRPATH") { return this->HandleRPathChangeCommand(args); - } - else if ( subCommand == "RPATH_CHECK" ) - { + } else if (subCommand == "RPATH_CHECK") { return this->HandleRPathCheckCommand(args); - } - else if ( subCommand == "RPATH_REMOVE" ) - { + } else if (subCommand == "RPATH_REMOVE") { return this->HandleRPathRemoveCommand(args); - } - else if ( subCommand == "RELATIVE_PATH" ) - { + } else if (subCommand == "RELATIVE_PATH") { return this->HandleRelativePathCommand(args); - } - else if ( subCommand == "TO_CMAKE_PATH" ) - { + } else if (subCommand == "TO_CMAKE_PATH") { return this->HandleCMakePathCommand(args, false); - } - else if ( subCommand == "TO_NATIVE_PATH" ) - { + } else if (subCommand == "TO_NATIVE_PATH") { return this->HandleCMakePathCommand(args, true); - } - else if ( subCommand == "TIMESTAMP" ) - { + } else if (subCommand == "TIMESTAMP") { return this->HandleTimestampCommand(args); - } - else if ( subCommand == "GENERATE" ) - { + } else if (subCommand == "GENERATE") { return this->HandleGenerateCommand(args); - } - else if ( subCommand == "LOCK" ) - { + } else if (subCommand == "LOCK") { return this->HandleLockCommand(args); - } + } - std::string e = "does not recognize sub-command "+subCommand; + std::string e = "does not recognize sub-command " + subCommand; this->SetError(e); return false; } bool cmFileCommand::HandleWriteCommand(std::vector<std::string> const& args, - bool append) + bool append) { std::vector<std::string>::const_iterator i = args.begin(); i++; // Get rid of subcommand std::string fileName = *i; - if ( !cmsys::SystemTools::FileIsFullPath(i->c_str()) ) - { + if (!cmsys::SystemTools::FileIsFullPath(i->c_str())) { fileName = this->Makefile->GetCurrentSourceDirectory(); fileName += "/" + *i; - } + } i++; - if ( !this->Makefile->CanIWriteThisFile(fileName.c_str()) ) - { - std::string e - = "attempted to write a file: " + fileName + - " into a source directory."; + if (!this->Makefile->CanIWriteThisFile(fileName.c_str())) { + std::string e = + "attempted to write a file: " + fileName + " into a source directory."; this->SetError(e); cmSystemTools::SetFatalErrorOccured(); return false; - } + } std::string dir = cmSystemTools::GetFilenamePath(fileName); cmSystemTools::MakeDirectory(dir.c_str()); mode_t mode = 0; // Set permissions to writable - if ( cmSystemTools::GetPermissions(fileName.c_str(), mode) ) - { + if (cmSystemTools::GetPermissions(fileName.c_str(), mode)) { cmSystemTools::SetPermissions(fileName.c_str(), -#if defined( _MSC_VER ) || defined( __MINGW32__ ) - mode | S_IWRITE +#if defined(_MSC_VER) || defined(__MINGW32__) + mode | S_IWRITE #else - mode | S_IWUSR | S_IWGRP + mode | S_IWUSR | S_IWGRP #endif - ); - } + ); + } // If GetPermissions fails, pretend like it is ok. File open will fail if // the file is not writable - cmsys::ofstream file(fileName.c_str(), append?std::ios::app: std::ios::out); - if ( !file ) - { + cmsys::ofstream file(fileName.c_str(), + append ? std::ios::app : std::ios::out); + if (!file) { std::string error = "failed to open for writing ("; error += cmSystemTools::GetLastSystemError(); error += "):\n "; error += fileName; this->SetError(error); return false; - } + } std::string message = cmJoin(cmMakeRange(i, args.end()), std::string()); file << message; file.close(); - if(mode) - { + if (mode) { cmSystemTools::SetPermissions(fileName.c_str(), mode); - } + } return true; } bool cmFileCommand::HandleReadCommand(std::vector<std::string> const& args) { - if ( args.size() < 3 ) - { + if (args.size() < 3) { this->SetError("READ must be called with at least two additional " "arguments"); return false; - } + } cmCommandArgumentsHelper argHelper; cmCommandArgumentGroup group; - cmCAString readArg (&argHelper, "READ"); - cmCAString fileNameArg (&argHelper, 0); - cmCAString resultArg (&argHelper, 0); + cmCAString readArg(&argHelper, "READ"); + cmCAString fileNameArg(&argHelper, 0); + cmCAString resultArg(&argHelper, 0); - cmCAString offsetArg (&argHelper, "OFFSET", &group); - cmCAString limitArg (&argHelper, "LIMIT", &group); - cmCAEnabler hexOutputArg (&argHelper, "HEX", &group); + cmCAString offsetArg(&argHelper, "OFFSET", &group); + cmCAString limitArg(&argHelper, "LIMIT", &group); + cmCAEnabler hexOutputArg(&argHelper, "HEX", &group); readArg.Follows(0); fileNameArg.Follows(&readArg); resultArg.Follows(&fileNameArg); @@ -307,92 +244,78 @@ bool cmFileCommand::HandleReadCommand(std::vector<std::string> const& args) argHelper.Parse(&args, 0); std::string fileName = fileNameArg.GetString(); - if ( !cmsys::SystemTools::FileIsFullPath(fileName.c_str()) ) - { + if (!cmsys::SystemTools::FileIsFullPath(fileName.c_str())) { fileName = this->Makefile->GetCurrentSourceDirectory(); fileName += "/" + fileNameArg.GetString(); - } + } std::string variable = resultArg.GetString(); - // Open the specified file. +// Open the specified file. #if defined(_WIN32) || defined(__CYGWIN__) - cmsys::ifstream file(fileName.c_str(), std::ios::in | - (hexOutputArg.IsEnabled() ? std::ios::binary : std::ios::in)); + cmsys::ifstream file( + fileName.c_str(), std::ios::in | + (hexOutputArg.IsEnabled() ? std::ios::binary : std::ios::in)); #else cmsys::ifstream file(fileName.c_str(), std::ios::in); #endif - if ( !file ) - { + if (!file) { std::string error = "failed to open for reading ("; error += cmSystemTools::GetLastSystemError(); error += "):\n "; error += fileName; this->SetError(error); return false; - } + } // is there a limit? long sizeLimit = -1; - if (!limitArg.GetString().empty()) - { + if (!limitArg.GetString().empty()) { sizeLimit = atoi(limitArg.GetCString()); - } + } // is there an offset? long offset = 0; - if (!offsetArg.GetString().empty()) - { + if (!offsetArg.GetString().empty()) { offset = atoi(offsetArg.GetCString()); - } + } file.seekg(offset, std::ios::beg); // explicit ios::beg for IBM VisualAge 6 std::string output; - if (hexOutputArg.IsEnabled()) - { + if (hexOutputArg.IsEnabled()) { // Convert part of the file into hex code char c; - while((sizeLimit != 0) && (file.get(c))) - { + while ((sizeLimit != 0) && (file.get(c))) { char hex[4]; - sprintf(hex, "%.2x", c&0xff); + sprintf(hex, "%.2x", c & 0xff); output += hex; - if (sizeLimit > 0) - { + if (sizeLimit > 0) { sizeLimit--; - } } } - else - { + } else { std::string line; bool has_newline = false; - while (sizeLimit != 0 && - cmSystemTools::GetLineFromStream(file, line, &has_newline, - sizeLimit) ) - { - if (sizeLimit > 0) - { + while (sizeLimit != 0 && cmSystemTools::GetLineFromStream( + file, line, &has_newline, sizeLimit)) { + if (sizeLimit > 0) { sizeLimit = sizeLimit - static_cast<long>(line.size()); - if (has_newline) - { + if (has_newline) { sizeLimit--; - } - if (sizeLimit < 0) - { + } + if (sizeLimit < 0) { sizeLimit = 0; - } } + } output += line; - if ( has_newline ) - { + if (has_newline) { output += "\n"; - } } } + } this->Makefile->AddDefinition(variable, output.c_str()); return true; } @@ -400,28 +323,25 @@ bool cmFileCommand::HandleReadCommand(std::vector<std::string> const& args) bool cmFileCommand::HandleHashCommand(std::vector<std::string> const& args) { #if defined(CMAKE_BUILD_WITH_CMAKE) - if(args.size() != 3) - { + if (args.size() != 3) { std::ostringstream e; e << args[0] << " requires a file name and output variable"; this->SetError(e.str()); return false; - } + } cmsys::auto_ptr<cmCryptoHash> hash(cmCryptoHash::New(args[0].c_str())); - if(hash.get()) - { + if (hash.get()) { std::string out = hash->HashFile(args[1]); - if(!out.empty()) - { + if (!out.empty()) { this->Makefile->AddDefinition(args[2], out.c_str()); return true; - } + } std::ostringstream e; - e << args[0] << " failed to read file \"" << args[1] << "\": " - << cmSystemTools::GetLastSystemError(); + e << args[0] << " failed to read file \"" << args[1] + << "\": " << cmSystemTools::GetLastSystemError(); this->SetError(e.str()); - } + } return false; #else std::ostringstream e; @@ -433,33 +353,34 @@ bool cmFileCommand::HandleHashCommand(std::vector<std::string> const& args) bool cmFileCommand::HandleStringsCommand(std::vector<std::string> const& args) { - if(args.size() < 3) - { + if (args.size() < 3) { this->SetError("STRINGS requires a file name and output variable"); return false; - } + } // Get the file to read. std::string fileName = args[1]; - if(!cmsys::SystemTools::FileIsFullPath(fileName.c_str())) - { + if (!cmsys::SystemTools::FileIsFullPath(fileName.c_str())) { fileName = this->Makefile->GetCurrentSourceDirectory(); fileName += "/" + args[1]; - } + } // Get the variable in which to store the results. std::string outVar = args[2]; // Parse the options. - enum { arg_none, - arg_limit_input, - arg_limit_output, - arg_limit_count, - arg_length_minimum, - arg_length_maximum, - arg__maximum, - arg_regex, - arg_encoding }; + enum + { + arg_none, + arg_limit_input, + arg_limit_output, + arg_limit_count, + arg_length_minimum, + arg_length_maximum, + arg__maximum, + arg_regex, + arg_encoding + }; unsigned int minlen = 0; unsigned int maxlen = 0; int limit_input = -1; @@ -469,396 +390,302 @@ bool cmFileCommand::HandleStringsCommand(std::vector<std::string> const& args) bool have_regex = false; bool newline_consume = false; bool hex_conversion_enabled = true; - enum { encoding_none = cmsys::FStream::BOM_None, - encoding_utf8 = cmsys::FStream::BOM_UTF8, - encoding_utf16le = cmsys::FStream::BOM_UTF16LE, - encoding_utf16be = cmsys::FStream::BOM_UTF16BE, - encoding_utf32le = cmsys::FStream::BOM_UTF32LE, - encoding_utf32be = cmsys::FStream::BOM_UTF32BE}; + enum + { + encoding_none = cmsys::FStream::BOM_None, + encoding_utf8 = cmsys::FStream::BOM_UTF8, + encoding_utf16le = cmsys::FStream::BOM_UTF16LE, + encoding_utf16be = cmsys::FStream::BOM_UTF16BE, + encoding_utf32le = cmsys::FStream::BOM_UTF32LE, + encoding_utf32be = cmsys::FStream::BOM_UTF32BE + }; int encoding = encoding_none; int arg_mode = arg_none; - for(unsigned int i=3; i < args.size(); ++i) - { - if(args[i] == "LIMIT_INPUT") - { + for (unsigned int i = 3; i < args.size(); ++i) { + if (args[i] == "LIMIT_INPUT") { arg_mode = arg_limit_input; - } - else if(args[i] == "LIMIT_OUTPUT") - { + } else if (args[i] == "LIMIT_OUTPUT") { arg_mode = arg_limit_output; - } - else if(args[i] == "LIMIT_COUNT") - { + } else if (args[i] == "LIMIT_COUNT") { arg_mode = arg_limit_count; - } - else if(args[i] == "LENGTH_MINIMUM") - { + } else if (args[i] == "LENGTH_MINIMUM") { arg_mode = arg_length_minimum; - } - else if(args[i] == "LENGTH_MAXIMUM") - { + } else if (args[i] == "LENGTH_MAXIMUM") { arg_mode = arg_length_maximum; - } - else if(args[i] == "REGEX") - { + } else if (args[i] == "REGEX") { arg_mode = arg_regex; - } - else if(args[i] == "NEWLINE_CONSUME") - { + } else if (args[i] == "NEWLINE_CONSUME") { newline_consume = true; arg_mode = arg_none; - } - else if(args[i] == "NO_HEX_CONVERSION") - { + } else if (args[i] == "NO_HEX_CONVERSION") { hex_conversion_enabled = false; arg_mode = arg_none; - } - else if(args[i] == "ENCODING") - { + } else if (args[i] == "ENCODING") { arg_mode = arg_encoding; - } - else if(arg_mode == arg_limit_input) - { - if(sscanf(args[i].c_str(), "%d", &limit_input) != 1 || - limit_input < 0) - { + } else if (arg_mode == arg_limit_input) { + if (sscanf(args[i].c_str(), "%d", &limit_input) != 1 || + limit_input < 0) { std::ostringstream e; - e << "STRINGS option LIMIT_INPUT value \"" - << args[i] << "\" is not an unsigned integer."; + e << "STRINGS option LIMIT_INPUT value \"" << args[i] + << "\" is not an unsigned integer."; this->SetError(e.str()); return false; - } - arg_mode = arg_none; } - else if(arg_mode == arg_limit_output) - { - if(sscanf(args[i].c_str(), "%d", &limit_output) != 1 || - limit_output < 0) - { + arg_mode = arg_none; + } else if (arg_mode == arg_limit_output) { + if (sscanf(args[i].c_str(), "%d", &limit_output) != 1 || + limit_output < 0) { std::ostringstream e; - e << "STRINGS option LIMIT_OUTPUT value \"" - << args[i] << "\" is not an unsigned integer."; + e << "STRINGS option LIMIT_OUTPUT value \"" << args[i] + << "\" is not an unsigned integer."; this->SetError(e.str()); return false; - } - arg_mode = arg_none; } - else if(arg_mode == arg_limit_count) - { + arg_mode = arg_none; + } else if (arg_mode == arg_limit_count) { int count; - if(sscanf(args[i].c_str(), "%d", &count) != 1 || count < 0) - { + if (sscanf(args[i].c_str(), "%d", &count) != 1 || count < 0) { std::ostringstream e; - e << "STRINGS option LIMIT_COUNT value \"" - << args[i] << "\" is not an unsigned integer."; + e << "STRINGS option LIMIT_COUNT value \"" << args[i] + << "\" is not an unsigned integer."; this->SetError(e.str()); return false; - } + } limit_count = count; arg_mode = arg_none; - } - else if(arg_mode == arg_length_minimum) - { + } else if (arg_mode == arg_length_minimum) { int len; - if(sscanf(args[i].c_str(), "%d", &len) != 1 || len < 0) - { + if (sscanf(args[i].c_str(), "%d", &len) != 1 || len < 0) { std::ostringstream e; - e << "STRINGS option LENGTH_MINIMUM value \"" - << args[i] << "\" is not an unsigned integer."; + e << "STRINGS option LENGTH_MINIMUM value \"" << args[i] + << "\" is not an unsigned integer."; this->SetError(e.str()); return false; - } + } minlen = len; arg_mode = arg_none; - } - else if(arg_mode == arg_length_maximum) - { + } else if (arg_mode == arg_length_maximum) { int len; - if(sscanf(args[i].c_str(), "%d", &len) != 1 || len < 0) - { + if (sscanf(args[i].c_str(), "%d", &len) != 1 || len < 0) { std::ostringstream e; - e << "STRINGS option LENGTH_MAXIMUM value \"" - << args[i] << "\" is not an unsigned integer."; + e << "STRINGS option LENGTH_MAXIMUM value \"" << args[i] + << "\" is not an unsigned integer."; this->SetError(e.str()); return false; - } + } maxlen = len; arg_mode = arg_none; - } - else if(arg_mode == arg_regex) - { - if(!regex.compile(args[i].c_str())) - { + } else if (arg_mode == arg_regex) { + if (!regex.compile(args[i].c_str())) { std::ostringstream e; - e << "STRINGS option REGEX value \"" - << args[i] << "\" could not be compiled."; + e << "STRINGS option REGEX value \"" << args[i] + << "\" could not be compiled."; this->SetError(e.str()); return false; - } + } have_regex = true; arg_mode = arg_none; - } - else if(arg_mode == arg_encoding) - { - if(args[i] == "UTF-8") - { + } else if (arg_mode == arg_encoding) { + if (args[i] == "UTF-8") { encoding = encoding_utf8; - } - else if(args[i] == "UTF-16LE") - { + } else if (args[i] == "UTF-16LE") { encoding = encoding_utf16le; - } - else if(args[i] == "UTF-16BE") - { + } else if (args[i] == "UTF-16BE") { encoding = encoding_utf16be; - } - else if(args[i] == "UTF-32LE") - { + } else if (args[i] == "UTF-32LE") { encoding = encoding_utf32le; - } - else if(args[i] == "UTF-32BE") - { + } else if (args[i] == "UTF-32BE") { encoding = encoding_utf32be; - } - else - { + } else { std::ostringstream e; - e << "STRINGS option ENCODING \"" - << args[i] << "\" not recognized."; + e << "STRINGS option ENCODING \"" << args[i] << "\" not recognized."; this->SetError(e.str()); return false; - } - arg_mode = arg_none; } - else - { + arg_mode = arg_none; + } else { std::ostringstream e; - e << "STRINGS given unknown argument \"" - << args[i] << "\""; + e << "STRINGS given unknown argument \"" << args[i] << "\""; this->SetError(e.str()); return false; - } } + } - if (hex_conversion_enabled) - { + if (hex_conversion_enabled) { // TODO: should work without temp file, but just on a memory buffer std::string binaryFileName = this->Makefile->GetCurrentBinaryDirectory(); binaryFileName += cmake::GetCMakeFilesDirectory(); binaryFileName += "/FileCommandStringsBinaryFile"; - if(cmHexFileConverter::TryConvert(fileName.c_str(),binaryFileName.c_str())) - { + if (cmHexFileConverter::TryConvert(fileName.c_str(), + binaryFileName.c_str())) { fileName = binaryFileName; - } } + } - // Open the specified file. +// Open the specified file. #if defined(_WIN32) || defined(__CYGWIN__) cmsys::ifstream fin(fileName.c_str(), std::ios::in | std::ios::binary); #else cmsys::ifstream fin(fileName.c_str(), std::ios::in); #endif - if(!fin) - { + if (!fin) { std::ostringstream e; e << "STRINGS file \"" << fileName << "\" cannot be read."; this->SetError(e.str()); return false; - } + } - //If BOM is found and encoding was not specified, use the BOM + // If BOM is found and encoding was not specified, use the BOM int bom_found = cmsys::FStream::ReadBOM(fin); - if(encoding == encoding_none && bom_found != cmsys::FStream::BOM_None) - { + if (encoding == encoding_none && bom_found != cmsys::FStream::BOM_None) { encoding = bom_found; - } + } unsigned int bytes_rem = 0; - if(encoding == encoding_utf16le || encoding == encoding_utf16be) - { + if (encoding == encoding_utf16le || encoding == encoding_utf16be) { bytes_rem = 1; - } - if(encoding == encoding_utf32le || encoding == encoding_utf32be) - { + } + if (encoding == encoding_utf32le || encoding == encoding_utf32be) { bytes_rem = 3; - } + } // Parse strings out of the file. int output_size = 0; std::vector<std::string> strings; std::string s; - while((!limit_count || strings.size() < limit_count) && - (limit_input < 0 || static_cast<int>(fin.tellg()) < limit_input) && - fin) - { + while ((!limit_count || strings.size() < limit_count) && + (limit_input < 0 || static_cast<int>(fin.tellg()) < limit_input) && + fin) { std::string current_str; int c = fin.get(); - for(unsigned int i=0; i<bytes_rem; ++i) - { + for (unsigned int i = 0; i < bytes_rem; ++i) { int c1 = fin.get(); - if(!fin) - { + if (!fin) { fin.putback(static_cast<char>(c1)); break; - } - c = (c << 8) | c1; } - if(encoding == encoding_utf16le) - { + c = (c << 8) | c1; + } + if (encoding == encoding_utf16le) { c = ((c & 0xFF) << 8) | ((c & 0xFF00) >> 8); - } - else if(encoding == encoding_utf32le) - { - c = (((c & 0xFF) << 24) | ((c & 0xFF00) << 8) | - ((c & 0xFF0000) >> 8) | ((c & 0xFF000000) >> 24)); - } + } else if (encoding == encoding_utf32le) { + c = (((c & 0xFF) << 24) | ((c & 0xFF00) << 8) | ((c & 0xFF0000) >> 8) | + ((c & 0xFF000000) >> 24)); + } - if(c == '\r') - { + if (c == '\r') { // Ignore CR character to make output always have UNIX newlines. continue; - } + } - else if((c >= 0x20 && c < 0x7F) || c == '\t' || - (c == '\n' && newline_consume)) - { + else if ((c >= 0x20 && c < 0x7F) || c == '\t' || + (c == '\n' && newline_consume)) { // This is an ASCII character that may be part of a string. // Cast added to avoid compiler warning. Cast is ok because // c is guaranteed to fit in char by the above if... current_str += static_cast<char>(c); - } - else if(encoding == encoding_utf8) - { + } else if (encoding == encoding_utf8) { // Check for UTF-8 encoded string (up to 4 octets) - static const unsigned char utf8_check_table[3][2] = - { - {0xE0, 0xC0}, - {0xF0, 0xE0}, - {0xF8, 0xF0}, - }; + static const unsigned char utf8_check_table[3][2] = { + { 0xE0, 0xC0 }, { 0xF0, 0xE0 }, { 0xF8, 0xF0 }, + }; // how many octets are there? unsigned int num_utf8_bytes = 0; - for(unsigned int j=0; num_utf8_bytes == 0 && j<3; j++) - { - if((c & utf8_check_table[j][0]) == utf8_check_table[j][1]) - num_utf8_bytes = j+2; - } + for (unsigned int j = 0; num_utf8_bytes == 0 && j < 3; j++) { + if ((c & utf8_check_table[j][0]) == utf8_check_table[j][1]) + num_utf8_bytes = j + 2; + } // get subsequent octets and check that they are valid - for(unsigned int j=0; j<num_utf8_bytes; j++) - { - if(j != 0) - { + for (unsigned int j = 0; j < num_utf8_bytes; j++) { + if (j != 0) { c = fin.get(); - if(!fin || (c & 0xC0) != 0x80) - { + if (!fin || (c & 0xC0) != 0x80) { fin.putback(static_cast<char>(c)); break; - } } - current_str += static_cast<char>(c); } + current_str += static_cast<char>(c); + } // if this was an invalid utf8 sequence, discard the data, and put // back subsequent characters - if((current_str.length() != num_utf8_bytes)) - { - for(unsigned int j=0; j<current_str.size()-1; j++) - { + if ((current_str.length() != num_utf8_bytes)) { + for (unsigned int j = 0; j < current_str.size() - 1; j++) { c = current_str[current_str.size() - 1 - j]; fin.putback(static_cast<char>(c)); - } - current_str = ""; } + current_str = ""; } + } - - if(c == '\n' && !newline_consume) - { + if (c == '\n' && !newline_consume) { // The current line has been terminated. Check if the current // string matches the requirements. The length may now be as // low as zero since blank lines are allowed. - if(s.length() >= minlen && - (!have_regex || regex.find(s.c_str()))) - { + if (s.length() >= minlen && (!have_regex || regex.find(s.c_str()))) { output_size += static_cast<int>(s.size()) + 1; - if(limit_output >= 0 && output_size >= limit_output) - { + if (limit_output >= 0 && output_size >= limit_output) { s = ""; break; - } - strings.push_back(s); } + strings.push_back(s); + } // Reset the string to empty. s = ""; - } - else if(current_str.empty()) - { + } else if (current_str.empty()) { // A non-string character has been found. Check if the current // string matches the requirements. We require that the length // be at least one no matter what the user specified. - if(s.length() >= minlen && !s.empty() && - (!have_regex || regex.find(s.c_str()))) - { + if (s.length() >= minlen && !s.empty() && + (!have_regex || regex.find(s.c_str()))) { output_size += static_cast<int>(s.size()) + 1; - if(limit_output >= 0 && output_size >= limit_output) - { + if (limit_output >= 0 && output_size >= limit_output) { s = ""; break; - } - strings.push_back(s); } + strings.push_back(s); + } // Reset the string to empty. s = ""; - } - else - { + } else { s += current_str; - } - + } - if(maxlen > 0 && s.size() == maxlen) - { + if (maxlen > 0 && s.size() == maxlen) { // Terminate a string if the maximum length is reached. - if(s.length() >= minlen && - (!have_regex || regex.find(s.c_str()))) - { + if (s.length() >= minlen && (!have_regex || regex.find(s.c_str()))) { output_size += static_cast<int>(s.size()) + 1; - if(limit_output >= 0 && output_size >= limit_output) - { + if (limit_output >= 0 && output_size >= limit_output) { s = ""; break; - } - strings.push_back(s); } - s = ""; + strings.push_back(s); } + s = ""; } + } // If there is a non-empty current string we have hit the end of the // input file or the input size limit. Check if the current string // matches the requirements. - if((!limit_count || strings.size() < limit_count) && - !s.empty() && s.length() >= minlen && - (!have_regex || regex.find(s.c_str()))) - { + if ((!limit_count || strings.size() < limit_count) && !s.empty() && + s.length() >= minlen && (!have_regex || regex.find(s.c_str()))) { output_size += static_cast<int>(s.size()) + 1; - if(limit_output < 0 || output_size < limit_output) - { + if (limit_output < 0 || output_size < limit_output) { strings.push_back(s); - } } + } // Encode the result in a CMake list. const char* sep = ""; std::string output; - for(std::vector<std::string>::const_iterator si = strings.begin(); - si != strings.end(); ++si) - { + for (std::vector<std::string>::const_iterator si = strings.begin(); + si != strings.end(); ++si) { // Separate the strings in the output to make it a list. output += sep; sep = ";"; @@ -866,15 +693,13 @@ bool cmFileCommand::HandleStringsCommand(std::vector<std::string> const& args) // Store the string in the output, but escape semicolons to // make sure it is a list. std::string const& sr = *si; - for(unsigned int i=0; i < sr.size(); ++i) - { - if(sr[i] == ';') - { + for (unsigned int i = 0; i < sr.size(); ++i) { + if (sr[i] == ';') { output += '\\'; - } - output += sr[i]; } + output += sr[i]; } + } // Save the output in a makefile variable. this->Makefile->AddDefinition(outVar, output.c_str()); @@ -882,7 +707,7 @@ bool cmFileCommand::HandleStringsCommand(std::vector<std::string> const& args) } bool cmFileCommand::HandleGlobCommand(std::vector<std::string> const& args, - bool recurse) + bool recurse) { // File commands has at least one argument assert(args.size() > 1); @@ -899,10 +724,8 @@ bool cmFileCommand::HandleGlobCommand(std::vector<std::string> const& args, bool explicitFollowSymlinks = false; cmPolicies::PolicyStatus status = this->Makefile->GetPolicyStatus(cmPolicies::CMP0009); - if(recurse) - { - switch(status) - { + if (recurse) { + switch (status) { case cmPolicies::REQUIRED_IF_USED: case cmPolicies::REQUIRED_ALWAYS: case cmPolicies::NEW: @@ -912,154 +735,124 @@ bool cmFileCommand::HandleGlobCommand(std::vector<std::string> const& args, case cmPolicies::WARN: g.RecurseThroughSymlinksOn(); break; - } } + } std::string output = ""; bool first = true; - for ( ; i != args.end(); ++i ) - { - if( *i == "LIST_DIRECTORIES" ) - { + for (; i != args.end(); ++i) { + if (*i == "LIST_DIRECTORIES") { ++i; - if(i != args.end()) - { - if(cmSystemTools::IsOn(i->c_str())) - { + if (i != args.end()) { + if (cmSystemTools::IsOn(i->c_str())) { g.SetListDirs(true); g.SetRecurseListDirs(true); - } - else if(cmSystemTools::IsOff(i->c_str())) - { + } else if (cmSystemTools::IsOff(i->c_str())) { g.SetListDirs(false); g.SetRecurseListDirs(false); - } - else - { + } else { this->SetError("LIST_DIRECTORIES missing bool value."); return false; - } } - else - { + } else { this->SetError("LIST_DIRECTORIES missing bool value."); return false; - } - ++i; } + ++i; + } - if ( recurse && (*i == "FOLLOW_SYMLINKS") ) - { + if (recurse && (*i == "FOLLOW_SYMLINKS")) { explicitFollowSymlinks = true; g.RecurseThroughSymlinksOn(); ++i; - if ( i == args.end() ) - { + if (i == args.end()) { this->SetError( "GLOB_RECURSE requires a glob expression after FOLLOW_SYMLINKS"); return false; - } } + } - if ( *i == "RELATIVE" ) - { + if (*i == "RELATIVE") { ++i; // skip RELATIVE - if ( i == args.end() ) - { + if (i == args.end()) { this->SetError("GLOB requires a directory after the RELATIVE tag"); return false; - } + } g.SetRelative(i->c_str()); ++i; - if(i == args.end()) - { + if (i == args.end()) { this->SetError("GLOB requires a glob expression after the directory"); return false; - } } + } cmsys::Glob::GlobMessages globMessages; - if ( !cmsys::SystemTools::FileIsFullPath(i->c_str()) ) - { + if (!cmsys::SystemTools::FileIsFullPath(i->c_str())) { std::string expr = this->Makefile->GetCurrentSourceDirectory(); // Handle script mode - if (!expr.empty()) - { + if (!expr.empty()) { expr += "/" + *i; g.FindFiles(expr, &globMessages); - } - else - { + } else { g.FindFiles(*i, &globMessages); - } } - else - { + } else { g.FindFiles(*i, &globMessages); - } + } - if(!globMessages.empty()) - { + if (!globMessages.empty()) { bool shouldExit = false; - for(cmsys::Glob::GlobMessagesIterator it=globMessages.begin(); - it != globMessages.end(); ++it) - { - if(it->type == cmsys::Glob::cyclicRecursion) - { - this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, - "Cyclic recursion detected while globbing for '" - + *i + "':\n" + it->content); - } - else - { - this->Makefile->IssueMessage(cmake::FATAL_ERROR, - "Error has occurred while globbing for '" - + *i + "' - " + it->content); + for (cmsys::Glob::GlobMessagesIterator it = globMessages.begin(); + it != globMessages.end(); ++it) { + if (it->type == cmsys::Glob::cyclicRecursion) { + this->Makefile->IssueMessage( + cmake::AUTHOR_WARNING, + "Cyclic recursion detected while globbing for '" + *i + "':\n" + + it->content); + } else { + this->Makefile->IssueMessage( + cmake::FATAL_ERROR, "Error has occurred while globbing for '" + + *i + "' - " + it->content); shouldExit = true; - } - } - if(shouldExit) - { - return false; } } + if (shouldExit) { + return false; + } + } std::vector<std::string>::size_type cc; std::vector<std::string>& files = g.GetFiles(); - for ( cc = 0; cc < files.size(); cc ++ ) - { - if ( !first ) - { + for (cc = 0; cc < files.size(); cc++) { + if (!first) { output += ";"; - } + } output += files[cc]; first = false; - } } + } - if(recurse && !explicitFollowSymlinks) - { - switch (status) - { + if (recurse && !explicitFollowSymlinks) { + switch (status) { case cmPolicies::REQUIRED_IF_USED: case cmPolicies::REQUIRED_ALWAYS: case cmPolicies::NEW: // Correct behavior, yay! break; case cmPolicies::OLD: - // Probably not really the expected behavior, but the author explicitly - // asked for the old behavior... no warning. + // Probably not really the expected behavior, but the author explicitly + // asked for the old behavior... no warning. case cmPolicies::WARN: // Possibly unexpected old behavior *and* we actually traversed // symlinks without being explicitly asked to: warn the author. - if(g.GetFollowedSymlinkCount() != 0) - { - this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, + if (g.GetFollowedSymlinkCount() != 0) { + this->Makefile->IssueMessage( + cmake::AUTHOR_WARNING, cmPolicies::GetPolicyWarning(cmPolicies::CMP0009)); - } + } break; - } } + } this->Makefile->AddDefinition(variable, output.c_str()); return true; @@ -1076,35 +869,31 @@ bool cmFileCommand::HandleMakeDirectoryCommand( i++; // Get rid of subcommand std::string expr; - for ( ; i != args.end(); ++i ) - { + for (; i != args.end(); ++i) { const std::string* cdir = &(*i); - if ( !cmsys::SystemTools::FileIsFullPath(i->c_str()) ) - { + if (!cmsys::SystemTools::FileIsFullPath(i->c_str())) { expr = this->Makefile->GetCurrentSourceDirectory(); expr += "/" + *i; cdir = &expr; - } - if ( !this->Makefile->CanIWriteThisFile(cdir->c_str()) ) - { - std::string e = "attempted to create a directory: " + *cdir - + " into a source directory."; + } + if (!this->Makefile->CanIWriteThisFile(cdir->c_str())) { + std::string e = "attempted to create a directory: " + *cdir + + " into a source directory."; this->SetError(e); cmSystemTools::SetFatalErrorOccured(); return false; - } - if ( !cmSystemTools::MakeDirectory(cdir->c_str()) ) - { + } + if (!cmSystemTools::MakeDirectory(cdir->c_str())) { std::string error = "problem creating directory: " + *cdir; this->SetError(error); return false; - } } + } return true; } -bool -cmFileCommand::HandleDifferentCommand(std::vector<std::string> const& args) +bool cmFileCommand::HandleDifferentCommand( + std::vector<std::string> const& args) { /* FILE(DIFFERENT <variable> FILES <lhs> <rhs>) @@ -1114,51 +903,45 @@ cmFileCommand::HandleDifferentCommand(std::vector<std::string> const& args) const char* file_lhs = 0; const char* file_rhs = 0; const char* var = 0; - enum Doing { DoingNone, DoingVar, DoingFileLHS, DoingFileRHS }; + enum Doing + { + DoingNone, + DoingVar, + DoingFileLHS, + DoingFileRHS + }; Doing doing = DoingVar; - for(unsigned int i=1; i < args.size(); ++i) - { - if(args[i] == "FILES") - { + for (unsigned int i = 1; i < args.size(); ++i) { + if (args[i] == "FILES") { doing = DoingFileLHS; - } - else if(doing == DoingVar) - { + } else if (doing == DoingVar) { var = args[i].c_str(); doing = DoingNone; - } - else if(doing == DoingFileLHS) - { + } else if (doing == DoingFileLHS) { file_lhs = args[i].c_str(); doing = DoingFileRHS; - } - else if(doing == DoingFileRHS) - { + } else if (doing == DoingFileRHS) { file_rhs = args[i].c_str(); doing = DoingNone; - } - else - { + } else { std::ostringstream e; e << "DIFFERENT given unknown argument " << args[i]; this->SetError(e.str()); return false; - } } - if(!var) - { + } + if (!var) { this->SetError("DIFFERENT not given result variable name."); return false; - } - if(!file_lhs || !file_rhs) - { + } + if (!file_lhs || !file_rhs) { this->SetError("DIFFERENT not given FILES option with two file names."); return false; - } + } // Compare the files. const char* result = - cmSystemTools::FilesDiffer(file_lhs, file_rhs)? "1" : "0"; + cmSystemTools::FilesDiffer(file_lhs, file_rhs) ? "1" : "0"; this->Makefile->AddDefinition(var, result); return true; } @@ -1166,26 +949,26 @@ cmFileCommand::HandleDifferentCommand(std::vector<std::string> const& args) // File installation helper class. struct cmFileCopier { - cmFileCopier(cmFileCommand* command, const char* name = "COPY"): - FileCommand(command), - Makefile(command->GetMakefile()), - Name(name), - Always(false), - MatchlessFiles(true), - FilePermissions(0), - DirPermissions(0), - CurrentMatchRule(0), - UseGivenPermissionsFile(false), - UseGivenPermissionsDir(false), - UseSourcePermissions(true), - Doing(DoingNone) - { - } + cmFileCopier(cmFileCommand* command, const char* name = "COPY") + : FileCommand(command) + , Makefile(command->GetMakefile()) + , Name(name) + , Always(false) + , MatchlessFiles(true) + , FilePermissions(0) + , DirPermissions(0) + , CurrentMatchRule(0) + , UseGivenPermissionsFile(false) + , UseGivenPermissionsDir(false) + , UseSourcePermissions(true) + , Doing(DoingNone) + { + } virtual ~cmFileCopier() {} bool Run(std::vector<std::string> const& args); -protected: +protected: cmFileCommand* FileCommand; cmMakefile* Makefile; const char* Name; @@ -1204,7 +987,11 @@ protected: { bool Exclude; mode_t Permissions; - MatchProperties(): Exclude(false), Permissions(0) {} + MatchProperties() + : Exclude(false) + , Permissions(0) + { + } }; struct MatchRule; friend struct MatchRule; @@ -1213,15 +1000,18 @@ protected: cmsys::RegularExpression Regex; MatchProperties Properties; std::string RegexString; - MatchRule(std::string const& regex): - Regex(regex.c_str()), RegexString(regex) {} + MatchRule(std::string const& regex) + : Regex(regex.c_str()) + , RegexString(regex) + { + } }; std::vector<MatchRule> MatchRules; // Get the properties from rules matching this input file. MatchProperties CollectMatchProperties(const char* file) - { - // Match rules are case-insensitive on some platforms. + { +// Match rules are case-insensitive on some platforms. #if defined(_WIN32) || defined(__APPLE__) || defined(__CYGWIN__) std::string lower = cmSystemTools::LowerCase(file); const char* file_to_match = lower.c_str(); @@ -1232,58 +1022,64 @@ protected: // Collect properties from all matching rules. bool matched = false; MatchProperties result; - for(std::vector<MatchRule>::iterator mr = this->MatchRules.begin(); - mr != this->MatchRules.end(); ++mr) - { - if(mr->Regex.find(file_to_match)) - { + for (std::vector<MatchRule>::iterator mr = this->MatchRules.begin(); + mr != this->MatchRules.end(); ++mr) { + if (mr->Regex.find(file_to_match)) { matched = true; result.Exclude |= mr->Properties.Exclude; result.Permissions |= mr->Properties.Permissions; - } } - if(!matched && !this->MatchlessFiles) - { + } + if (!matched && !this->MatchlessFiles) { result.Exclude = !cmSystemTools::FileIsDirectory(file); - } - return result; } + return result; + } bool SetPermissions(const char* toFile, mode_t permissions) - { - if(permissions && !cmSystemTools::SetPermissions(toFile, permissions)) - { + { + if (permissions && !cmSystemTools::SetPermissions(toFile, permissions)) { std::ostringstream e; e << this->Name << " cannot set permissions on \"" << toFile << "\""; this->FileCommand->SetError(e.str()); return false; - } - return true; } + return true; + } // Translate an argument to a permissions bit. bool CheckPermissions(std::string const& arg, mode_t& permissions) - { - if(arg == "OWNER_READ") { permissions |= mode_owner_read; } - else if(arg == "OWNER_WRITE") { permissions |= mode_owner_write; } - else if(arg == "OWNER_EXECUTE") { permissions |= mode_owner_execute; } - else if(arg == "GROUP_READ") { permissions |= mode_group_read; } - else if(arg == "GROUP_WRITE") { permissions |= mode_group_write; } - else if(arg == "GROUP_EXECUTE") { permissions |= mode_group_execute; } - else if(arg == "WORLD_READ") { permissions |= mode_world_read; } - else if(arg == "WORLD_WRITE") { permissions |= mode_world_write; } - else if(arg == "WORLD_EXECUTE") { permissions |= mode_world_execute; } - else if(arg == "SETUID") { permissions |= mode_setuid; } - else if(arg == "SETGID") { permissions |= mode_setgid; } - else - { + { + if (arg == "OWNER_READ") { + permissions |= mode_owner_read; + } else if (arg == "OWNER_WRITE") { + permissions |= mode_owner_write; + } else if (arg == "OWNER_EXECUTE") { + permissions |= mode_owner_execute; + } else if (arg == "GROUP_READ") { + permissions |= mode_group_read; + } else if (arg == "GROUP_WRITE") { + permissions |= mode_group_write; + } else if (arg == "GROUP_EXECUTE") { + permissions |= mode_group_execute; + } else if (arg == "WORLD_READ") { + permissions |= mode_world_read; + } else if (arg == "WORLD_WRITE") { + permissions |= mode_world_write; + } else if (arg == "WORLD_EXECUTE") { + permissions |= mode_world_execute; + } else if (arg == "SETUID") { + permissions |= mode_setuid; + } else if (arg == "SETGID") { + permissions |= mode_setgid; + } else { std::ostringstream e; e << this->Name << " given invalid permission \"" << arg << "\"."; this->FileCommand->SetError(e.str()); return false; - } - return true; } + return true; + } bool InstallSymlink(const char* fromFile, const char* toFile); bool InstallFile(const char* fromFile, const char* toFile, @@ -1292,7 +1088,9 @@ protected: MatchProperties const& match_properties); virtual bool Install(const char* fromFile, const char* toFile); virtual std::string const& ToName(std::string const& fromName) - { return fromName; } + { + return fromName; + } enum Type { @@ -1302,13 +1100,13 @@ protected: }; virtual void ReportCopy(const char*, Type, bool) {} virtual bool ReportMissing(const char* fromFile) - { + { // The input file does not exist and installation is not optional. std::ostringstream e; e << this->Name << " cannot find \"" << fromFile << "\"."; this->FileCommand->SetError(e.str()); return false; - } + } MatchRule* CurrentMatchRule; bool UseGivenPermissionsFile; @@ -1336,30 +1134,30 @@ protected: virtual bool CheckValue(std::string const& arg); void NotBeforeMatch(std::string const& arg) - { + { std::ostringstream e; e << "option " << arg << " may not appear before PATTERN or REGEX."; this->FileCommand->SetError(e.str()); this->Doing = DoingError; - } + } void NotAfterMatch(std::string const& arg) - { + { std::ostringstream e; e << "option " << arg << " may not appear after PATTERN or REGEX."; this->FileCommand->SetError(e.str()); this->Doing = DoingError; - } + } virtual void DefaultFilePermissions() - { + { // Use read/write permissions. this->FilePermissions = 0; this->FilePermissions |= mode_owner_read; this->FilePermissions |= mode_owner_write; this->FilePermissions |= mode_group_read; this->FilePermissions |= mode_world_read; - } + } virtual void DefaultDirectoryPermissions() - { + { // Use read/write/executable permissions. this->DirPermissions = 0; this->DirPermissions |= mode_owner_read; @@ -1369,197 +1167,137 @@ protected: this->DirPermissions |= mode_group_execute; this->DirPermissions |= mode_world_read; this->DirPermissions |= mode_world_execute; - } + } }; bool cmFileCopier::Parse(std::vector<std::string> const& args) { this->Doing = DoingFiles; - for(unsigned int i=1; i < args.size(); ++i) - { + for (unsigned int i = 1; i < args.size(); ++i) { // Check this argument. - if(!this->CheckKeyword(args[i]) && - !this->CheckValue(args[i])) - { + if (!this->CheckKeyword(args[i]) && !this->CheckValue(args[i])) { std::ostringstream e; e << "called with unknown argument \"" << args[i] << "\"."; this->FileCommand->SetError(e.str()); return false; - } + } // Quit if an argument is invalid. - if(this->Doing == DoingError) - { + if (this->Doing == DoingError) { return false; - } } + } // Require a destination. - if(this->Destination.empty()) - { + if (this->Destination.empty()) { std::ostringstream e; e << this->Name << " given no DESTINATION"; this->FileCommand->SetError(e.str()); return false; - } + } // If file permissions were not specified set default permissions. - if(!this->UseGivenPermissionsFile && !this->UseSourcePermissions) - { + if (!this->UseGivenPermissionsFile && !this->UseSourcePermissions) { this->DefaultFilePermissions(); - } + } // If directory permissions were not specified set default permissions. - if(!this->UseGivenPermissionsDir && !this->UseSourcePermissions) - { + if (!this->UseGivenPermissionsDir && !this->UseSourcePermissions) { this->DefaultDirectoryPermissions(); - } + } return true; } bool cmFileCopier::CheckKeyword(std::string const& arg) { - if(arg == "DESTINATION") - { - if(this->CurrentMatchRule) - { + if (arg == "DESTINATION") { + if (this->CurrentMatchRule) { this->NotAfterMatch(arg); - } - else - { + } else { this->Doing = DoingDestination; - } } - else if(arg == "PATTERN") - { + } else if (arg == "PATTERN") { this->Doing = DoingPattern; - } - else if(arg == "REGEX") - { + } else if (arg == "REGEX") { this->Doing = DoingRegex; - } - else if(arg == "EXCLUDE") - { + } else if (arg == "EXCLUDE") { // Add this property to the current match rule. - if(this->CurrentMatchRule) - { + if (this->CurrentMatchRule) { this->CurrentMatchRule->Properties.Exclude = true; this->Doing = DoingNone; - } - else - { + } else { this->NotBeforeMatch(arg); - } } - else if(arg == "PERMISSIONS") - { - if(this->CurrentMatchRule) - { + } else if (arg == "PERMISSIONS") { + if (this->CurrentMatchRule) { this->Doing = DoingPermissionsMatch; - } - else - { + } else { this->NotBeforeMatch(arg); - } } - else if(arg == "FILE_PERMISSIONS") - { - if(this->CurrentMatchRule) - { + } else if (arg == "FILE_PERMISSIONS") { + if (this->CurrentMatchRule) { this->NotAfterMatch(arg); - } - else - { + } else { this->Doing = DoingPermissionsFile; this->UseGivenPermissionsFile = true; - } } - else if(arg == "DIRECTORY_PERMISSIONS") - { - if(this->CurrentMatchRule) - { + } else if (arg == "DIRECTORY_PERMISSIONS") { + if (this->CurrentMatchRule) { this->NotAfterMatch(arg); - } - else - { + } else { this->Doing = DoingPermissionsDir; this->UseGivenPermissionsDir = true; - } } - else if(arg == "USE_SOURCE_PERMISSIONS") - { - if(this->CurrentMatchRule) - { + } else if (arg == "USE_SOURCE_PERMISSIONS") { + if (this->CurrentMatchRule) { this->NotAfterMatch(arg); - } - else - { + } else { this->Doing = DoingNone; this->UseSourcePermissions = true; - } } - else if(arg == "NO_SOURCE_PERMISSIONS") - { - if(this->CurrentMatchRule) - { + } else if (arg == "NO_SOURCE_PERMISSIONS") { + if (this->CurrentMatchRule) { this->NotAfterMatch(arg); - } - else - { + } else { this->Doing = DoingNone; this->UseSourcePermissions = false; - } } - else if(arg == "FILES_MATCHING") - { - if(this->CurrentMatchRule) - { + } else if (arg == "FILES_MATCHING") { + if (this->CurrentMatchRule) { this->NotAfterMatch(arg); - } - else - { + } else { this->Doing = DoingNone; this->MatchlessFiles = false; - } } - else - { + } else { return false; - } + } return true; } bool cmFileCopier::CheckValue(std::string const& arg) { - switch(this->Doing) - { + switch (this->Doing) { case DoingFiles: - if(arg.empty() || cmSystemTools::FileIsFullPath(arg.c_str())) - { + if (arg.empty() || cmSystemTools::FileIsFullPath(arg.c_str())) { this->Files.push_back(arg); - } - else - { + } else { std::string file = this->Makefile->GetCurrentSourceDirectory(); file += "/" + arg; this->Files.push_back(file); - } + } break; case DoingDestination: - if(arg.empty() || cmSystemTools::FileIsFullPath(arg.c_str())) - { + if (arg.empty() || cmSystemTools::FileIsFullPath(arg.c_str())) { this->Destination = arg; - } - else - { + } else { this->Destination = this->Makefile->GetCurrentBinaryDirectory(); this->Destination += "/" + arg; - } + } this->Doing = DoingNone; break; - case DoingPattern: - { + case DoingPattern: { // Convert the pattern to a regular expression. Require a // leading slash and trailing end-of-string in the matched // string to make sure the pattern matches only whole file @@ -1568,138 +1306,114 @@ bool cmFileCopier::CheckValue(std::string const& arg) regex += cmsys::Glob::PatternToRegex(arg, false); regex += "$"; this->MatchRules.push_back(MatchRule(regex)); - this->CurrentMatchRule = &*(this->MatchRules.end()-1); - if(this->CurrentMatchRule->Regex.is_valid()) - { + this->CurrentMatchRule = &*(this->MatchRules.end() - 1); + if (this->CurrentMatchRule->Regex.is_valid()) { this->Doing = DoingNone; - } - else - { + } else { std::ostringstream e; e << "could not compile PATTERN \"" << arg << "\"."; this->FileCommand->SetError(e.str()); this->Doing = DoingError; - } } - break; + } break; case DoingRegex: this->MatchRules.push_back(MatchRule(arg)); - this->CurrentMatchRule = &*(this->MatchRules.end()-1); - if(this->CurrentMatchRule->Regex.is_valid()) - { + this->CurrentMatchRule = &*(this->MatchRules.end() - 1); + if (this->CurrentMatchRule->Regex.is_valid()) { this->Doing = DoingNone; - } - else - { + } else { std::ostringstream e; e << "could not compile REGEX \"" << arg << "\"."; this->FileCommand->SetError(e.str()); this->Doing = DoingError; - } + } break; case DoingPermissionsFile: - if(!this->CheckPermissions(arg, this->FilePermissions)) - { + if (!this->CheckPermissions(arg, this->FilePermissions)) { this->Doing = DoingError; - } + } break; case DoingPermissionsDir: - if(!this->CheckPermissions(arg, this->DirPermissions)) - { + if (!this->CheckPermissions(arg, this->DirPermissions)) { this->Doing = DoingError; - } + } break; case DoingPermissionsMatch: - if(!this->CheckPermissions( - arg, this->CurrentMatchRule->Properties.Permissions)) - { + if (!this->CheckPermissions( + arg, this->CurrentMatchRule->Properties.Permissions)) { this->Doing = DoingError; - } + } break; default: return false; - } + } return true; } bool cmFileCopier::Run(std::vector<std::string> const& args) { - if(!this->Parse(args)) - { + if (!this->Parse(args)) { return false; - } + } std::vector<std::string> const& files = this->Files; - for(std::vector<std::string>::size_type i = 0; i < files.size(); ++i) - { + for (std::vector<std::string>::size_type i = 0; i < files.size(); ++i) { // Split the input file into its directory and name components. std::vector<std::string> fromPathComponents; cmSystemTools::SplitPath(files[i], fromPathComponents); - std::string fromName = *(fromPathComponents.end()-1); - std::string fromDir = cmSystemTools::JoinPath(fromPathComponents.begin(), - fromPathComponents.end()-1); + std::string fromName = *(fromPathComponents.end() - 1); + std::string fromDir = cmSystemTools::JoinPath( + fromPathComponents.begin(), fromPathComponents.end() - 1); // Compute the full path to the destination file. std::string toFile = this->Destination; std::string const& toName = this->ToName(fromName); - if(!toName.empty()) - { + if (!toName.empty()) { toFile += "/"; toFile += toName; - } + } // Construct the full path to the source file. The file name may // have been changed above. std::string fromFile = fromDir; - if(!fromName.empty()) - { + if (!fromName.empty()) { fromFile += "/"; fromFile += fromName; - } + } - if(!this->Install(fromFile.c_str(), toFile.c_str())) - { + if (!this->Install(fromFile.c_str(), toFile.c_str())) { return false; - } } + } return true; } bool cmFileCopier::Install(const char* fromFile, const char* toFile) { - if(!*fromFile) - { + if (!*fromFile) { std::ostringstream e; e << "INSTALL encountered an empty string input file name."; this->FileCommand->SetError(e.str()); return false; - } + } // Collect any properties matching this file name. MatchProperties match_properties = this->CollectMatchProperties(fromFile); // Skip the file if it is excluded. - if(match_properties.Exclude) - { + if (match_properties.Exclude) { return true; - } + } - if(cmSystemTools::SameFile(fromFile, toFile)) - { + if (cmSystemTools::SameFile(fromFile, toFile)) { return true; - } - else if(cmSystemTools::FileIsSymlink(fromFile)) - { + } else if (cmSystemTools::FileIsSymlink(fromFile)) { return this->InstallSymlink(fromFile, toFile); - } - else if(cmSystemTools::FileIsDirectory(fromFile)) - { + } else if (cmSystemTools::FileIsDirectory(fromFile)) { return this->InstallDirectory(fromFile, toFile, match_properties); - } - else if(cmSystemTools::FileExists(fromFile)) - { + } else if (cmSystemTools::FileExists(fromFile)) { return this->InstallFile(fromFile, toFile, match_properties); - } + } return this->ReportMissing(fromFile); } @@ -1707,48 +1421,42 @@ bool cmFileCopier::InstallSymlink(const char* fromFile, const char* toFile) { // Read the original symlink. std::string symlinkTarget; - if(!cmSystemTools::ReadSymlink(fromFile, symlinkTarget)) - { + if (!cmSystemTools::ReadSymlink(fromFile, symlinkTarget)) { std::ostringstream e; e << this->Name << " cannot read symlink \"" << fromFile << "\" to duplicate at \"" << toFile << "\"."; this->FileCommand->SetError(e.str()); return false; - } + } // Compare the symlink value to that at the destination if not // always installing. bool copy = true; - if(!this->Always) - { + if (!this->Always) { std::string oldSymlinkTarget; - if(cmSystemTools::ReadSymlink(toFile, oldSymlinkTarget)) - { - if(symlinkTarget == oldSymlinkTarget) - { + if (cmSystemTools::ReadSymlink(toFile, oldSymlinkTarget)) { + if (symlinkTarget == oldSymlinkTarget) { copy = false; - } } } + } // Inform the user about this file installation. this->ReportCopy(toFile, TypeLink, copy); - if(copy) - { + if (copy) { // Remove the destination file so we can always create the symlink. cmSystemTools::RemoveFile(toFile); // Create the symlink. - if(!cmSystemTools::CreateSymlink(symlinkTarget, toFile)) - { + if (!cmSystemTools::CreateSymlink(symlinkTarget, toFile)) { std::ostringstream e; - e << this->Name << " cannot duplicate symlink \"" << fromFile + e << this->Name << " cannot duplicate symlink \"" << fromFile << "\" at \"" << toFile << "\"."; this->FileCommand->SetError(e.str()); return false; - } } + } return true; } @@ -1758,57 +1466,51 @@ bool cmFileCopier::InstallFile(const char* fromFile, const char* toFile, { // Determine whether we will copy the file. bool copy = true; - if(!this->Always) - { + if (!this->Always) { // If both files exist with the same time do not copy. - if(!this->FileTimes.FileTimesDiffer(fromFile, toFile)) - { + if (!this->FileTimes.FileTimesDiffer(fromFile, toFile)) { copy = false; - } } + } // Inform the user about this file installation. this->ReportCopy(toFile, TypeFile, copy); // Copy the file. - if(copy && !cmSystemTools::CopyAFile(fromFile, toFile, true)) - { + if (copy && !cmSystemTools::CopyAFile(fromFile, toFile, true)) { std::ostringstream e; - e << this->Name << " cannot copy file \"" << fromFile - << "\" to \"" << toFile << "\"."; + e << this->Name << " cannot copy file \"" << fromFile << "\" to \"" + << toFile << "\"."; this->FileCommand->SetError(e.str()); return false; - } + } // Set the file modification time of the destination file. - if(copy && !this->Always) - { + if (copy && !this->Always) { // Add write permission so we can set the file time. // Permissions are set unconditionally below anyway. mode_t perm = 0; - if(cmSystemTools::GetPermissions(toFile, perm)) - { + if (cmSystemTools::GetPermissions(toFile, perm)) { cmSystemTools::SetPermissions(toFile, perm | mode_owner_write); - } - if (!cmSystemTools::CopyFileTime(fromFile, toFile)) - { + } + if (!cmSystemTools::CopyFileTime(fromFile, toFile)) { std::ostringstream e; - e << this->Name << " cannot set modification time on \"" - << toFile << "\""; + e << this->Name << " cannot set modification time on \"" << toFile + << "\""; this->FileCommand->SetError(e.str()); return false; - } } + } // Set permissions of the destination file. - mode_t permissions = (match_properties.Permissions? - match_properties.Permissions : this->FilePermissions); - if(!permissions) - { + mode_t permissions = + (match_properties.Permissions ? match_properties.Permissions + : this->FilePermissions); + if (!permissions) { // No permissions were explicitly provided but the user requested // that the source file permissions be used. cmSystemTools::GetPermissions(fromFile, permissions); - } + } return this->SetPermissions(toFile, permissions); } @@ -1821,24 +1523,23 @@ bool cmFileCopier::InstallDirectory(const char* source, !cmSystemTools::FileIsDirectory(destination)); // Make sure the destination directory exists. - if(!cmSystemTools::MakeDirectory(destination)) - { + if (!cmSystemTools::MakeDirectory(destination)) { std::ostringstream e; - e << this->Name << " cannot make directory \"" << destination << "\": " - << cmSystemTools::GetLastSystemError(); + e << this->Name << " cannot make directory \"" << destination + << "\": " << cmSystemTools::GetLastSystemError(); this->FileCommand->SetError(e.str()); return false; - } + } // Compute the requested permissions for the destination directory. - mode_t permissions = (match_properties.Permissions? - match_properties.Permissions : this->DirPermissions); - if(!permissions) - { + mode_t permissions = + (match_properties.Permissions ? match_properties.Permissions + : this->DirPermissions); + if (!permissions) { // No permissions were explicitly provided but the user requested // that the source directory permissions be used. cmSystemTools::GetPermissions(source, permissions); - } + } // Compute the set of permissions required on this directory to // recursively install files and subdirectories safely. @@ -1850,46 +1551,38 @@ bool cmFileCopier::InstallDirectory(const char* source, // permissions temporarily during file installation. mode_t permissions_before = 0; mode_t permissions_after = 0; - if((permissions & required_permissions) == required_permissions) - { + if ((permissions & required_permissions) == required_permissions) { permissions_before = permissions; - } - else - { + } else { permissions_before = permissions | required_permissions; permissions_after = permissions; - } + } // Set the required permissions of the destination directory. - if(!this->SetPermissions(destination, permissions_before)) - { + if (!this->SetPermissions(destination, permissions_before)) { return false; - } + } // Load the directory contents to traverse it recursively. cmsys::Directory dir; - if(source && *source) - { + if (source && *source) { dir.Load(source); - } + } unsigned long numFiles = static_cast<unsigned long>(dir.GetNumberOfFiles()); - for(unsigned long fileNum = 0; fileNum < numFiles; ++fileNum) - { - if(!(strcmp(dir.GetFile(fileNum), ".") == 0 || - strcmp(dir.GetFile(fileNum), "..") == 0)) - { + for (unsigned long fileNum = 0; fileNum < numFiles; ++fileNum) { + if (!(strcmp(dir.GetFile(fileNum), ".") == 0 || + strcmp(dir.GetFile(fileNum), "..") == 0)) { std::string fromPath = source; fromPath += "/"; fromPath += dir.GetFile(fileNum); std::string toPath = destination; toPath += "/"; toPath += dir.GetFile(fileNum); - if(!this->Install(fromPath.c_str(), toPath.c_str())) - { + if (!this->Install(fromPath.c_str(), toPath.c_str())) { return false; - } } } + } // Set the requested permissions of the destination directory. return this->SetPermissions(destination, permissions_after); @@ -1901,17 +1594,17 @@ bool cmFileCommand::HandleCopyCommand(std::vector<std::string> const& args) return copier.Run(args); } -struct cmFileInstaller: public cmFileCopier +struct cmFileInstaller : public cmFileCopier { - cmFileInstaller(cmFileCommand* command): - cmFileCopier(command, "INSTALL"), - InstallType(cmInstallType_FILES), - Optional(false), - MessageAlways(false), - MessageLazy(false), - MessageNever(false), - DestDirLength(0) - { + cmFileInstaller(cmFileCommand* command) + : cmFileCopier(command, "INSTALL") + , InstallType(cmInstallType_FILES) + , Optional(false) + , MessageAlways(false) + , MessageLazy(false) + , MessageNever(false) + , DestDirLength(0) + { // Installation does not use source permissions by default. this->UseSourcePermissions = false; // Check whether to copy files always or only if they have changed. @@ -1920,13 +1613,13 @@ struct cmFileInstaller: public cmFileCopier // Get the current manifest. this->Manifest = this->Makefile->GetSafeDefinition("CMAKE_INSTALL_MANIFEST_FILES"); - } + } ~cmFileInstaller() - { + { // Save the updated install manifest. this->Makefile->AddDefinition("CMAKE_INSTALL_MANIFEST_FILES", this->Manifest.c_str()); - } + } protected: cmInstallType InstallType; @@ -1939,45 +1632,42 @@ protected: std::string Manifest; void ManifestAppend(std::string const& file) - { - if (!this->Manifest.empty()) - { + { + if (!this->Manifest.empty()) { this->Manifest += ";"; - } - this->Manifest += file.substr(this->DestDirLength); } + this->Manifest += file.substr(this->DestDirLength); + } virtual std::string const& ToName(std::string const& fromName) - { return this->Rename.empty()? fromName : this->Rename; } + { + return this->Rename.empty() ? fromName : this->Rename; + } virtual void ReportCopy(const char* toFile, Type type, bool copy) - { - if(!this->MessageNever && (copy || !this->MessageLazy)) - { - std::string message = (copy? "Installing: " : "Up-to-date: "); + { + if (!this->MessageNever && (copy || !this->MessageLazy)) { + std::string message = (copy ? "Installing: " : "Up-to-date: "); message += toFile; this->Makefile->DisplayStatus(message.c_str(), -1); - } - if(type != TypeDir) - { + } + if (type != TypeDir) { // Add the file to the manifest. this->ManifestAppend(toFile); - } } + } virtual bool ReportMissing(const char* fromFile) - { - return (this->Optional || - this->cmFileCopier::ReportMissing(fromFile)); - } + { + return (this->Optional || this->cmFileCopier::ReportMissing(fromFile)); + } virtual bool Install(const char* fromFile, const char* toFile) - { + { // Support installing from empty source to make a directory. - if(this->InstallType == cmInstallType_DIRECTORY && !*fromFile) - { + if (this->InstallType == cmInstallType_DIRECTORY && !*fromFile) { return this->InstallDirectory(fromFile, toFile, MatchProperties()); - } - return this->cmFileCopier::Install(fromFile, toFile); } + return this->cmFileCopier::Install(fromFile, toFile); + } virtual bool Parse(std::vector<std::string> const& args); enum @@ -1989,255 +1679,181 @@ protected: virtual bool CheckKeyword(std::string const& arg); virtual bool CheckValue(std::string const& arg); virtual void DefaultFilePermissions() - { + { this->cmFileCopier::DefaultFilePermissions(); // Add execute permissions based on the target type. - switch(this->InstallType) - { + switch (this->InstallType) { case cmInstallType_SHARED_LIBRARY: case cmInstallType_MODULE_LIBRARY: - if(this->Makefile->IsOn("CMAKE_INSTALL_SO_NO_EXE")) - { + if (this->Makefile->IsOn("CMAKE_INSTALL_SO_NO_EXE")) { break; - } + } case cmInstallType_EXECUTABLE: case cmInstallType_PROGRAMS: this->FilePermissions |= mode_owner_execute; this->FilePermissions |= mode_group_execute; this->FilePermissions |= mode_world_execute; break; - default: break; - } + default: + break; } + } bool GetTargetTypeFromString(const std::string& stype); bool HandleInstallDestination(); }; bool cmFileInstaller::Parse(std::vector<std::string> const& args) { - if(!this->cmFileCopier::Parse(args)) - { + if (!this->cmFileCopier::Parse(args)) { return false; - } + } - if(!this->Rename.empty()) - { - if(this->InstallType != cmInstallType_FILES && - this->InstallType != cmInstallType_PROGRAMS) - { + if (!this->Rename.empty()) { + if (this->InstallType != cmInstallType_FILES && + this->InstallType != cmInstallType_PROGRAMS) { this->FileCommand->SetError("INSTALL option RENAME may be used " "only with FILES or PROGRAMS."); return false; - } - if(this->Files.size() > 1) - { + } + if (this->Files.size() > 1) { this->FileCommand->SetError("INSTALL option RENAME may be used " "only with one file."); return false; - } } + } - if(!this->HandleInstallDestination()) - { + if (!this->HandleInstallDestination()) { return false; - } + } - if(((this->MessageAlways?1:0) + - (this->MessageLazy?1:0) + - (this->MessageNever?1:0)) > 1) - { + if (((this->MessageAlways ? 1 : 0) + (this->MessageLazy ? 1 : 0) + + (this->MessageNever ? 1 : 0)) > 1) { this->FileCommand->SetError("INSTALL options MESSAGE_ALWAYS, " "MESSAGE_LAZY, and MESSAGE_NEVER " "are mutually exclusive."); return false; - } + } return true; } bool cmFileInstaller::CheckKeyword(std::string const& arg) { - if(arg == "TYPE") - { - if(this->CurrentMatchRule) - { + if (arg == "TYPE") { + if (this->CurrentMatchRule) { this->NotAfterMatch(arg); - } - else - { + } else { this->Doing = DoingType; - } } - else if(arg == "FILES") - { - if(this->CurrentMatchRule) - { + } else if (arg == "FILES") { + if (this->CurrentMatchRule) { this->NotAfterMatch(arg); - } - else - { + } else { this->Doing = DoingFiles; - } } - else if(arg == "RENAME") - { - if(this->CurrentMatchRule) - { + } else if (arg == "RENAME") { + if (this->CurrentMatchRule) { this->NotAfterMatch(arg); - } - else - { + } else { this->Doing = DoingRename; - } } - else if(arg == "OPTIONAL") - { - if(this->CurrentMatchRule) - { + } else if (arg == "OPTIONAL") { + if (this->CurrentMatchRule) { this->NotAfterMatch(arg); - } - else - { + } else { this->Doing = DoingNone; this->Optional = true; - } } - else if(arg == "MESSAGE_ALWAYS") - { - if(this->CurrentMatchRule) - { + } else if (arg == "MESSAGE_ALWAYS") { + if (this->CurrentMatchRule) { this->NotAfterMatch(arg); - } - else - { + } else { this->Doing = DoingNone; this->MessageAlways = true; - } } - else if(arg == "MESSAGE_LAZY") - { - if(this->CurrentMatchRule) - { + } else if (arg == "MESSAGE_LAZY") { + if (this->CurrentMatchRule) { this->NotAfterMatch(arg); - } - else - { + } else { this->Doing = DoingNone; this->MessageLazy = true; - } } - else if(arg == "MESSAGE_NEVER") - { - if(this->CurrentMatchRule) - { + } else if (arg == "MESSAGE_NEVER") { + if (this->CurrentMatchRule) { this->NotAfterMatch(arg); - } - else - { + } else { this->Doing = DoingNone; this->MessageNever = true; - } } - else if(arg == "PERMISSIONS") - { - if(this->CurrentMatchRule) - { + } else if (arg == "PERMISSIONS") { + if (this->CurrentMatchRule) { this->Doing = DoingPermissionsMatch; - } - else - { + } else { // file(INSTALL) aliases PERMISSIONS to FILE_PERMISSIONS this->Doing = DoingPermissionsFile; this->UseGivenPermissionsFile = true; - } } - else if(arg == "DIR_PERMISSIONS") - { - if(this->CurrentMatchRule) - { + } else if (arg == "DIR_PERMISSIONS") { + if (this->CurrentMatchRule) { this->NotAfterMatch(arg); - } - else - { + } else { // file(INSTALL) aliases DIR_PERMISSIONS to DIRECTORY_PERMISSIONS this->Doing = DoingPermissionsDir; this->UseGivenPermissionsDir = true; - } } - else if(arg == "COMPONENTS" || arg == "CONFIGURATIONS" || - arg == "PROPERTIES") - { + } else if (arg == "COMPONENTS" || arg == "CONFIGURATIONS" || + arg == "PROPERTIES") { std::ostringstream e; e << "INSTALL called with old-style " << arg << " argument. " << "This script was generated with an older version of CMake. " << "Re-run this cmake version on your build tree."; this->FileCommand->SetError(e.str()); this->Doing = DoingError; - } - else - { + } else { return this->cmFileCopier::CheckKeyword(arg); - } + } return true; } bool cmFileInstaller::CheckValue(std::string const& arg) { - switch(this->Doing) - { + switch (this->Doing) { case DoingType: - if(!this->GetTargetTypeFromString(arg)) - { + if (!this->GetTargetTypeFromString(arg)) { this->Doing = DoingError; - } + } break; case DoingRename: this->Rename = arg; break; default: return this->cmFileCopier::CheckValue(arg); - } + } return true; } -bool cmFileInstaller -::GetTargetTypeFromString(const std::string& stype) +bool cmFileInstaller::GetTargetTypeFromString(const std::string& stype) { - if ( stype == "EXECUTABLE" ) - { + if (stype == "EXECUTABLE") { this->InstallType = cmInstallType_EXECUTABLE; - } - else if ( stype == "FILE" ) - { + } else if (stype == "FILE") { this->InstallType = cmInstallType_FILES; - } - else if ( stype == "PROGRAM" ) - { + } else if (stype == "PROGRAM") { this->InstallType = cmInstallType_PROGRAMS; - } - else if ( stype == "STATIC_LIBRARY" ) - { + } else if (stype == "STATIC_LIBRARY") { this->InstallType = cmInstallType_STATIC_LIBRARY; - } - else if ( stype == "SHARED_LIBRARY" ) - { + } else if (stype == "SHARED_LIBRARY") { this->InstallType = cmInstallType_SHARED_LIBRARY; - } - else if ( stype == "MODULE" ) - { + } else if (stype == "MODULE") { this->InstallType = cmInstallType_MODULE_LIBRARY; - } - else if ( stype == "DIRECTORY" ) - { + } else if (stype == "DIRECTORY") { this->InstallType = cmInstallType_DIRECTORY; - } - else - { + } else { std::ostringstream e; e << "Option TYPE given unknown value \"" << stype << "\"."; this->FileCommand->SetError(e.str()); return false; - } + } return true; } @@ -2246,46 +1862,37 @@ bool cmFileInstaller::HandleInstallDestination() std::string& destination = this->Destination; // allow for / to be a valid destination - if ( destination.size() < 2 && destination != "/" ) - { + if (destination.size() < 2 && destination != "/") { this->FileCommand->SetError("called with inappropriate arguments. " - "No DESTINATION provided or ."); + "No DESTINATION provided or ."); return false; - } + } const char* destdir = cmSystemTools::GetEnv("DESTDIR"); - if ( destdir && *destdir ) - { + if (destdir && *destdir) { std::string sdestdir = destdir; cmSystemTools::ConvertToUnixSlashes(sdestdir); char ch1 = destination[0]; char ch2 = destination[1]; char ch3 = 0; - if ( destination.size() > 2 ) - { + if (destination.size() > 2) { ch3 = destination[2]; - } + } int skip = 0; - if ( ch1 != '/' ) - { + if (ch1 != '/') { int relative = 0; if (((ch1 >= 'a' && ch1 <= 'z') || (ch1 >= 'A' && ch1 <= 'Z')) && - ch2 == ':' ) - { + ch2 == ':') { // Assume windows // let's do some destdir magic: skip = 2; - if ( ch3 != '/' ) - { + if (ch3 != '/') { relative = 1; - } } - else - { + } else { relative = 1; - } - if ( relative ) - { + } + if (relative) { // This is relative path on unix or windows. Since we are doing // destdir, this case does not make sense. this->FileCommand->SetError( @@ -2293,124 +1900,105 @@ bool cmFileInstaller::HandleInstallDestination() "does not make sense when using DESTDIR. Specify " "absolute path or remove DESTDIR environment variable."); return false; - } } - else - { - if ( ch2 == '/' ) - { + } else { + if (ch2 == '/') { // looks like a network path. - std::string message = "called with network path DESTINATION. This " + std::string message = + "called with network path DESTINATION. This " "does not make sense when using DESTDIR. Specify local " "absolute path or remove DESTDIR environment variable." "\nDESTINATION=\n"; message += destination; this->FileCommand->SetError(message); return false; - } } + } destination = sdestdir + (destination.c_str() + skip); this->DestDirLength = int(sdestdir.size()); - } + } - if(this->InstallType != cmInstallType_DIRECTORY) - { - if ( !cmSystemTools::FileExists(destination.c_str()) ) - { - if ( !cmSystemTools::MakeDirectory(destination.c_str()) ) - { + if (this->InstallType != cmInstallType_DIRECTORY) { + if (!cmSystemTools::FileExists(destination.c_str())) { + if (!cmSystemTools::MakeDirectory(destination.c_str())) { std::string errstring = "cannot create directory: " + destination + ". Maybe need administrative privileges."; this->FileCommand->SetError(errstring); return false; - } } - if ( !cmSystemTools::FileIsDirectory(destination) ) - { - std::string errstring = "INSTALL destination: " + destination + - " is not a directory."; + } + if (!cmSystemTools::FileIsDirectory(destination)) { + std::string errstring = + "INSTALL destination: " + destination + " is not a directory."; this->FileCommand->SetError(errstring); return false; - } } + } return true; } -bool -cmFileCommand::HandleRPathChangeCommand(std::vector<std::string> const& args) +bool cmFileCommand::HandleRPathChangeCommand( + std::vector<std::string> const& args) { // Evaluate arguments. const char* file = 0; const char* oldRPath = 0; const char* newRPath = 0; - enum Doing { DoingNone, DoingFile, DoingOld, DoingNew }; + enum Doing + { + DoingNone, + DoingFile, + DoingOld, + DoingNew + }; Doing doing = DoingNone; - for(unsigned int i=1; i < args.size(); ++i) - { - if(args[i] == "OLD_RPATH") - { + for (unsigned int i = 1; i < args.size(); ++i) { + if (args[i] == "OLD_RPATH") { doing = DoingOld; - } - else if(args[i] == "NEW_RPATH") - { + } else if (args[i] == "NEW_RPATH") { doing = DoingNew; - } - else if(args[i] == "FILE") - { + } else if (args[i] == "FILE") { doing = DoingFile; - } - else if(doing == DoingFile) - { + } else if (doing == DoingFile) { file = args[i].c_str(); doing = DoingNone; - } - else if(doing == DoingOld) - { + } else if (doing == DoingOld) { oldRPath = args[i].c_str(); doing = DoingNone; - } - else if(doing == DoingNew) - { + } else if (doing == DoingNew) { newRPath = args[i].c_str(); doing = DoingNone; - } - else - { + } else { std::ostringstream e; e << "RPATH_CHANGE given unknown argument " << args[i]; this->SetError(e.str()); return false; - } } - if(!file) - { + } + if (!file) { this->SetError("RPATH_CHANGE not given FILE option."); return false; - } - if(!oldRPath) - { + } + if (!oldRPath) { this->SetError("RPATH_CHANGE not given OLD_RPATH option."); return false; - } - if(!newRPath) - { + } + if (!newRPath) { this->SetError("RPATH_CHANGE not given NEW_RPATH option."); return false; - } - if(!cmSystemTools::FileExists(file, true)) - { + } + if (!cmSystemTools::FileExists(file, true)) { std::ostringstream e; e << "RPATH_CHANGE given FILE \"" << file << "\" that does not exist."; this->SetError(e.str()); return false; - } + } bool success = true; cmSystemToolsFileTime* ft = cmSystemTools::FileTimeNew(); bool have_ft = cmSystemTools::FileTimeGet(file, ft); std::string emsg; bool changed; - if(!cmSystemTools::ChangeRPath(file, oldRPath, newRPath, &emsg, &changed)) - { + if (!cmSystemTools::ChangeRPath(file, oldRPath, newRPath, &emsg, &changed)) { std::ostringstream e; /* clang-format off */ e << "RPATH_CHANGE could not write new RPATH:\n" @@ -2421,72 +2009,64 @@ cmFileCommand::HandleRPathChangeCommand(std::vector<std::string> const& args) /* clang-format on */ this->SetError(e.str()); success = false; - } - if(success) - { - if(changed) - { + } + if (success) { + if (changed) { std::string message = "Set runtime path of \""; message += file; message += "\" to \""; message += newRPath; message += "\""; this->Makefile->DisplayStatus(message.c_str(), -1); - } - if(have_ft) - { + } + if (have_ft) { cmSystemTools::FileTimeSet(file, ft); - } } + } cmSystemTools::FileTimeDelete(ft); return success; } -bool -cmFileCommand::HandleRPathRemoveCommand(std::vector<std::string> const& args) +bool cmFileCommand::HandleRPathRemoveCommand( + std::vector<std::string> const& args) { // Evaluate arguments. const char* file = 0; - enum Doing { DoingNone, DoingFile }; + enum Doing + { + DoingNone, + DoingFile + }; Doing doing = DoingNone; - for(unsigned int i=1; i < args.size(); ++i) - { - if(args[i] == "FILE") - { + for (unsigned int i = 1; i < args.size(); ++i) { + if (args[i] == "FILE") { doing = DoingFile; - } - else if(doing == DoingFile) - { + } else if (doing == DoingFile) { file = args[i].c_str(); doing = DoingNone; - } - else - { + } else { std::ostringstream e; e << "RPATH_REMOVE given unknown argument " << args[i]; this->SetError(e.str()); return false; - } } - if(!file) - { + } + if (!file) { this->SetError("RPATH_REMOVE not given FILE option."); return false; - } - if(!cmSystemTools::FileExists(file, true)) - { + } + if (!cmSystemTools::FileExists(file, true)) { std::ostringstream e; e << "RPATH_REMOVE given FILE \"" << file << "\" that does not exist."; this->SetError(e.str()); return false; - } + } bool success = true; cmSystemToolsFileTime* ft = cmSystemTools::FileTimeNew(); bool have_ft = cmSystemTools::FileTimeGet(file, ft); std::string emsg; bool removed; - if(!cmSystemTools::RemoveRPath(file, &emsg, &removed)) - { + if (!cmSystemTools::RemoveRPath(file, &emsg, &removed)) { std::ostringstream e; /* clang-format off */ e << "RPATH_REMOVE could not remove RPATH from file:\n" @@ -2495,80 +2075,69 @@ cmFileCommand::HandleRPathRemoveCommand(std::vector<std::string> const& args) /* clang-format on */ this->SetError(e.str()); success = false; - } - if(success) - { - if(removed) - { + } + if (success) { + if (removed) { std::string message = "Removed runtime path from \""; message += file; message += "\""; this->Makefile->DisplayStatus(message.c_str(), -1); - } - if(have_ft) - { + } + if (have_ft) { cmSystemTools::FileTimeSet(file, ft); - } } + } cmSystemTools::FileTimeDelete(ft); return success; } -bool -cmFileCommand::HandleRPathCheckCommand(std::vector<std::string> const& args) +bool cmFileCommand::HandleRPathCheckCommand( + std::vector<std::string> const& args) { // Evaluate arguments. const char* file = 0; const char* rpath = 0; - enum Doing { DoingNone, DoingFile, DoingRPath }; + enum Doing + { + DoingNone, + DoingFile, + DoingRPath + }; Doing doing = DoingNone; - for(unsigned int i=1; i < args.size(); ++i) - { - if(args[i] == "RPATH") - { + for (unsigned int i = 1; i < args.size(); ++i) { + if (args[i] == "RPATH") { doing = DoingRPath; - } - else if(args[i] == "FILE") - { + } else if (args[i] == "FILE") { doing = DoingFile; - } - else if(doing == DoingFile) - { + } else if (doing == DoingFile) { file = args[i].c_str(); doing = DoingNone; - } - else if(doing == DoingRPath) - { + } else if (doing == DoingRPath) { rpath = args[i].c_str(); doing = DoingNone; - } - else - { + } else { std::ostringstream e; e << "RPATH_CHECK given unknown argument " << args[i]; this->SetError(e.str()); return false; - } } - if(!file) - { + } + if (!file) { this->SetError("RPATH_CHECK not given FILE option."); return false; - } - if(!rpath) - { + } + if (!rpath) { this->SetError("RPATH_CHECK not given RPATH option."); return false; - } + } // If the file exists but does not have the desired RPath then // delete it. This is used during installation to re-install a file // if its RPath will change. - if(cmSystemTools::FileExists(file, true) && - !cmSystemTools::CheckRPath(file, rpath)) - { + if (cmSystemTools::FileExists(file, true) && + !cmSystemTools::CheckRPath(file, rpath)) { cmSystemTools::RemoveFile(file); - } + } return true; } @@ -2582,65 +2151,55 @@ bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args) bool cmFileCommand::HandleRelativePathCommand( std::vector<std::string> const& args) { - if(args.size() != 4 ) - { + if (args.size() != 4) { this->SetError("RELATIVE_PATH called with incorrect number of arguments"); return false; - } + } const std::string& outVar = args[1]; const std::string& directoryName = args[2]; const std::string& fileName = args[3]; - if(!cmSystemTools::FileIsFullPath(directoryName.c_str())) - { + if (!cmSystemTools::FileIsFullPath(directoryName.c_str())) { std::string errstring = - "RELATIVE_PATH must be passed a full path to the directory: " - + directoryName; + "RELATIVE_PATH must be passed a full path to the directory: " + + directoryName; this->SetError(errstring); return false; - } - if(!cmSystemTools::FileIsFullPath(fileName.c_str())) - { + } + if (!cmSystemTools::FileIsFullPath(fileName.c_str())) { std::string errstring = - "RELATIVE_PATH must be passed a full path to the file: " - + fileName; + "RELATIVE_PATH must be passed a full path to the file: " + fileName; this->SetError(errstring); return false; - } + } - std::string res = cmSystemTools::RelativePath(directoryName.c_str(), - fileName.c_str()); - this->Makefile->AddDefinition(outVar, - res.c_str()); + std::string res = + cmSystemTools::RelativePath(directoryName.c_str(), fileName.c_str()); + this->Makefile->AddDefinition(outVar, res.c_str()); return true; } - bool cmFileCommand::HandleRename(std::vector<std::string> const& args) { - if(args.size() != 3) - { + if (args.size() != 3) { this->SetError("RENAME given incorrect number of arguments."); return false; - } + } // Compute full path for old and new names. std::string oldname = args[1]; - if(!cmsys::SystemTools::FileIsFullPath(oldname.c_str())) - { + if (!cmsys::SystemTools::FileIsFullPath(oldname.c_str())) { oldname = this->Makefile->GetCurrentSourceDirectory(); oldname += "/" + args[1]; - } + } std::string newname = args[2]; - if(!cmsys::SystemTools::FileIsFullPath(newname.c_str())) - { + if (!cmsys::SystemTools::FileIsFullPath(newname.c_str())) { newname = this->Makefile->GetCurrentSourceDirectory(); newname += "/" + args[2]; - } + } - if(!cmSystemTools::RenameFile(oldname.c_str(), newname.c_str())) - { + if (!cmSystemTools::RenameFile(oldname.c_str(), newname.c_str())) { std::string err = cmSystemTools::GetLastSystemError(); std::ostringstream e; /* clang-format off */ @@ -2652,11 +2211,10 @@ bool cmFileCommand::HandleRename(std::vector<std::string> const& args) /* clang-format on */ this->SetError(e.str()); return false; - } + } return true; } - bool cmFileCommand::HandleRemove(std::vector<std::string> const& args, bool recurse) { @@ -2665,79 +2223,64 @@ bool cmFileCommand::HandleRemove(std::vector<std::string> const& args, std::vector<std::string>::const_iterator i = args.begin(); i++; // Get rid of subcommand - for(;i != args.end(); ++i) - { + for (; i != args.end(); ++i) { std::string fileName = *i; - if(!cmsys::SystemTools::FileIsFullPath(fileName.c_str())) - { + if (!cmsys::SystemTools::FileIsFullPath(fileName.c_str())) { fileName = this->Makefile->GetCurrentSourceDirectory(); fileName += "/" + *i; - } + } - if(cmSystemTools::FileIsDirectory(fileName) && - !cmSystemTools::FileIsSymlink(fileName) && recurse) - { + if (cmSystemTools::FileIsDirectory(fileName) && + !cmSystemTools::FileIsSymlink(fileName) && recurse) { cmSystemTools::RemoveADirectory(fileName); - } - else - { + } else { cmSystemTools::RemoveFile(fileName); - } } + } return true; } -bool cmFileCommand::HandleCMakePathCommand(std::vector<std::string> - const& args, - bool nativePath) +bool cmFileCommand::HandleCMakePathCommand( + std::vector<std::string> const& args, bool nativePath) { std::vector<std::string>::const_iterator i = args.begin(); - if(args.size() != 3) - { + if (args.size() != 3) { this->SetError("FILE([TO_CMAKE_PATH|TO_NATIVE_PATH] path result) must be " - "called with exactly three arguments."); + "called with exactly three arguments."); return false; - } + } i++; // Get rid of subcommand #if defined(_WIN32) && !defined(__CYGWIN__) char pathSep = ';'; #else char pathSep = ':'; #endif - std::vector<cmsys::String> path = cmSystemTools::SplitString(*i, - pathSep); + std::vector<cmsys::String> path = cmSystemTools::SplitString(*i, pathSep); i++; - const char* var = i->c_str(); + const char* var = i->c_str(); std::string value; - for(std::vector<cmsys::String>::iterator j = path.begin(); - j != path.end(); ++j) - { - if(j != path.begin()) - { + for (std::vector<cmsys::String>::iterator j = path.begin(); j != path.end(); + ++j) { + if (j != path.begin()) { value += ";"; - } - if(!nativePath) - { + } + if (!nativePath) { cmSystemTools::ConvertToUnixSlashes(*j); - } - else - { + } else { *j = cmSystemTools::ConvertToOutputPath(j->c_str()); // remove double quotes in the path cmsys::String& s = *j; - if(s.size() > 1 && s[0] == '\"' && s[s.size()-1] == '\"') - { - s = s.substr(1,s.size()-2); - } + if (s.size() > 1 && s[0] == '\"' && s[s.size() - 1] == '\"') { + s = s.substr(1, s.size() - 2); } - value += *j; } + value += *j; + } this->Makefile->AddDefinition(var, value.c_str()); return true; } - #if defined(CMAKE_BUILD_WITH_CMAKE) // Stuff for curl download/upload @@ -2745,212 +2288,181 @@ typedef std::vector<char> cmFileCommandVectorOfChar; namespace { - size_t - cmWriteToFileCallback(void *ptr, size_t size, size_t nmemb, - void *data) - { - int realsize = (int)(size * nmemb); - cmsys::ofstream* fout = static_cast<cmsys::ofstream*>(data); - const char* chPtr = static_cast<char*>(ptr); - fout->write(chPtr, realsize); - return realsize; - } - - - size_t - cmWriteToMemoryCallback(void *ptr, size_t size, size_t nmemb, - void *data) - { - int realsize = (int)(size * nmemb); - cmFileCommandVectorOfChar *vec - = static_cast<cmFileCommandVectorOfChar*>(data); - const char* chPtr = static_cast<char*>(ptr); - vec->insert(vec->end(), chPtr, chPtr + realsize); - return realsize; - } - +size_t cmWriteToFileCallback(void* ptr, size_t size, size_t nmemb, void* data) +{ + int realsize = (int)(size * nmemb); + cmsys::ofstream* fout = static_cast<cmsys::ofstream*>(data); + const char* chPtr = static_cast<char*>(ptr); + fout->write(chPtr, realsize); + return realsize; +} - static size_t - cmFileCommandCurlDebugCallback(CURL *, curl_infotype type, char *chPtr, - size_t size, void *data) - { - cmFileCommandVectorOfChar *vec - = static_cast<cmFileCommandVectorOfChar*>(data); - switch(type) - { - case CURLINFO_TEXT: - case CURLINFO_HEADER_IN: - case CURLINFO_HEADER_OUT: - vec->insert(vec->end(), chPtr, chPtr + size); - break; - case CURLINFO_DATA_IN: - case CURLINFO_DATA_OUT: - case CURLINFO_SSL_DATA_IN: - case CURLINFO_SSL_DATA_OUT: - { - char buf[128]; - int n = sprintf(buf, "[%" KWIML_INT_PRIu64 " bytes data]\n", - static_cast<KWIML_INT_uint64_t>(size)); - if (n > 0) - { - vec->insert(vec->end(), buf, buf + n); - } - } - break; - default: - break; - } - return 0; - } +size_t cmWriteToMemoryCallback(void* ptr, size_t size, size_t nmemb, + void* data) +{ + int realsize = (int)(size * nmemb); + cmFileCommandVectorOfChar* vec = + static_cast<cmFileCommandVectorOfChar*>(data); + const char* chPtr = static_cast<char*>(ptr); + vec->insert(vec->end(), chPtr, chPtr + realsize); + return realsize; +} +static size_t cmFileCommandCurlDebugCallback(CURL*, curl_infotype type, + char* chPtr, size_t size, + void* data) +{ + cmFileCommandVectorOfChar* vec = + static_cast<cmFileCommandVectorOfChar*>(data); + switch (type) { + case CURLINFO_TEXT: + case CURLINFO_HEADER_IN: + case CURLINFO_HEADER_OUT: + vec->insert(vec->end(), chPtr, chPtr + size); + break; + case CURLINFO_DATA_IN: + case CURLINFO_DATA_OUT: + case CURLINFO_SSL_DATA_IN: + case CURLINFO_SSL_DATA_OUT: { + char buf[128]; + int n = sprintf(buf, "[%" KWIML_INT_PRIu64 " bytes data]\n", + static_cast<KWIML_INT_uint64_t>(size)); + if (n > 0) { + vec->insert(vec->end(), buf, buf + n); + } + } break; + default: + break; + } + return 0; +} - class cURLProgressHelper +class cURLProgressHelper +{ +public: + cURLProgressHelper(cmFileCommand* fc, const char* text) { - public: - cURLProgressHelper(cmFileCommand *fc, const char *text) - { - this->CurrentPercentage = -1; - this->FileCommand = fc; - this->Text = text; - } - - bool UpdatePercentage(double value, double total, std::string &status) - { - int OldPercentage = this->CurrentPercentage; - - if (total > 0.0) - { - this->CurrentPercentage = static_cast<int>(value/total*100.0 + 0.5); - if(this->CurrentPercentage > 100) - { - // Avoid extra progress reports for unexpected data beyond total. - this->CurrentPercentage = 100; - } - } - - bool updated = (OldPercentage != this->CurrentPercentage); + this->CurrentPercentage = -1; + this->FileCommand = fc; + this->Text = text; + } - if (updated) - { - std::ostringstream oss; - oss << "[" << this->Text << " " << this->CurrentPercentage - << "% complete]"; - status = oss.str(); - } + bool UpdatePercentage(double value, double total, std::string& status) + { + int OldPercentage = this->CurrentPercentage; - return updated; + if (total > 0.0) { + this->CurrentPercentage = static_cast<int>(value / total * 100.0 + 0.5); + if (this->CurrentPercentage > 100) { + // Avoid extra progress reports for unexpected data beyond total. + this->CurrentPercentage = 100; } + } - cmFileCommand *GetFileCommand() - { - return this->FileCommand; - } + bool updated = (OldPercentage != this->CurrentPercentage); - private: - int CurrentPercentage; - cmFileCommand *FileCommand; - std::string Text; - }; + if (updated) { + std::ostringstream oss; + oss << "[" << this->Text << " " << this->CurrentPercentage + << "% complete]"; + status = oss.str(); + } + return updated; + } - static int - cmFileDownloadProgressCallback(void *clientp, - double dltotal, double dlnow, - double ultotal, double ulnow) - { - cURLProgressHelper *helper = - reinterpret_cast<cURLProgressHelper *>(clientp); + cmFileCommand* GetFileCommand() { return this->FileCommand; } - static_cast<void>(ultotal); - static_cast<void>(ulnow); +private: + int CurrentPercentage; + cmFileCommand* FileCommand; + std::string Text; +}; - std::string status; - if (helper->UpdatePercentage(dlnow, dltotal, status)) - { - cmFileCommand *fc = helper->GetFileCommand(); - cmMakefile *mf = fc->GetMakefile(); - mf->DisplayStatus(status.c_str(), -1); - } +static int cmFileDownloadProgressCallback(void* clientp, double dltotal, + double dlnow, double ultotal, + double ulnow) +{ + cURLProgressHelper* helper = reinterpret_cast<cURLProgressHelper*>(clientp); - return 0; - } + static_cast<void>(ultotal); + static_cast<void>(ulnow); + std::string status; + if (helper->UpdatePercentage(dlnow, dltotal, status)) { + cmFileCommand* fc = helper->GetFileCommand(); + cmMakefile* mf = fc->GetMakefile(); + mf->DisplayStatus(status.c_str(), -1); + } - static int - cmFileUploadProgressCallback(void *clientp, - double dltotal, double dlnow, - double ultotal, double ulnow) - { - cURLProgressHelper *helper = - reinterpret_cast<cURLProgressHelper *>(clientp); + return 0; +} + +static int cmFileUploadProgressCallback(void* clientp, double dltotal, + double dlnow, double ultotal, + double ulnow) +{ + cURLProgressHelper* helper = reinterpret_cast<cURLProgressHelper*>(clientp); - static_cast<void>(dltotal); - static_cast<void>(dlnow); + static_cast<void>(dltotal); + static_cast<void>(dlnow); - std::string status; - if (helper->UpdatePercentage(ulnow, ultotal, status)) - { - cmFileCommand *fc = helper->GetFileCommand(); - cmMakefile *mf = fc->GetMakefile(); - mf->DisplayStatus(status.c_str(), -1); - } + std::string status; + if (helper->UpdatePercentage(ulnow, ultotal, status)) { + cmFileCommand* fc = helper->GetFileCommand(); + cmMakefile* mf = fc->GetMakefile(); + mf->DisplayStatus(status.c_str(), -1); + } - return 0; - } + return 0; +} } - namespace { - class cURLEasyGuard +class cURLEasyGuard +{ +public: + cURLEasyGuard(CURL* easy) + : Easy(easy) { - public: - cURLEasyGuard(CURL * easy) - : Easy(easy) - {} - - ~cURLEasyGuard(void) - { - if (this->Easy) - { - ::curl_easy_cleanup(this->Easy); - } - } + } - inline void release(void) - { - this->Easy = 0; - return; - } + ~cURLEasyGuard(void) + { + if (this->Easy) { + ::curl_easy_cleanup(this->Easy); + } + } - private: - ::CURL * Easy; - }; + inline void release(void) + { + this->Easy = 0; + return; + } +private: + ::CURL* Easy; +}; } #endif +#define check_curl_result(result, errstr) \ + if (result != CURLE_OK) { \ + std::string e(errstr); \ + e += ::curl_easy_strerror(result); \ + this->SetError(e); \ + return false; \ + } -#define check_curl_result(result, errstr) \ - if (result != CURLE_OK) \ - { \ - std::string e(errstr); \ - e += ::curl_easy_strerror(result); \ - this->SetError(e); \ - return false; \ - } - - -bool -cmFileCommand::HandleDownloadCommand(std::vector<std::string> const& args) +bool cmFileCommand::HandleDownloadCommand(std::vector<std::string> const& args) { #if defined(CMAKE_BUILD_WITH_CMAKE) std::vector<std::string>::const_iterator i = args.begin(); - if(args.size() < 3) - { + if (args.size() < 3) { this->SetError("DOWNLOAD must be called with at least three arguments."); return false; - } + } ++i; // Get rid of subcommand std::string url = *i; ++i; @@ -2968,183 +2480,140 @@ cmFileCommand::HandleDownloadCommand(std::vector<std::string> const& args) cmsys::auto_ptr<cmCryptoHash> hash; bool showProgress = false; - while(i != args.end()) - { - if(*i == "TIMEOUT") - { + while (i != args.end()) { + if (*i == "TIMEOUT") { ++i; - if(i != args.end()) - { + if (i != args.end()) { timeout = atol(i->c_str()); - } - else - { + } else { this->SetError("DOWNLOAD missing time for TIMEOUT."); return false; - } } - else if(*i == "INACTIVITY_TIMEOUT") - { + } else if (*i == "INACTIVITY_TIMEOUT") { ++i; - if(i != args.end()) - { + if (i != args.end()) { inactivity_timeout = atol(i->c_str()); - } - else - { + } else { this->SetError("DOWNLOAD missing time for INACTIVITY_TIMEOUT."); return false; - } } - else if(*i == "LOG") - { + } else if (*i == "LOG") { ++i; - if( i == args.end()) - { + if (i == args.end()) { this->SetError("DOWNLOAD missing VAR for LOG."); return false; - } - logVar = *i; } - else if(*i == "STATUS") - { + logVar = *i; + } else if (*i == "STATUS") { ++i; - if( i == args.end()) - { + if (i == args.end()) { this->SetError("DOWNLOAD missing VAR for STATUS."); return false; - } - statusVar = *i; } - else if(*i == "TLS_VERIFY") - { + statusVar = *i; + } else if (*i == "TLS_VERIFY") { ++i; - if(i != args.end()) - { + if (i != args.end()) { tls_verify = cmSystemTools::IsOn(i->c_str()); - } - else - { + } else { this->SetError("TLS_VERIFY missing bool value."); return false; - } } - else if(*i == "TLS_CAINFO") - { + } else if (*i == "TLS_CAINFO") { ++i; - if(i != args.end()) - { + if (i != args.end()) { cainfo = i->c_str(); - } - else - { + } else { this->SetError("TLS_CAFILE missing file value."); return false; - } } - else if(*i == "EXPECTED_MD5") - { + } else if (*i == "EXPECTED_MD5") { ++i; - if( i == args.end()) - { + if (i == args.end()) { this->SetError("DOWNLOAD missing sum value for EXPECTED_MD5."); return false; - } + } hash = cmsys::auto_ptr<cmCryptoHash>(cmCryptoHash::New("MD5")); hashMatchMSG = "MD5 sum"; expectedHash = cmSystemTools::LowerCase(*i); - } - else if(*i == "SHOW_PROGRESS") - { + } else if (*i == "SHOW_PROGRESS") { showProgress = true; - } - else if(*i == "EXPECTED_HASH") - { + } else if (*i == "EXPECTED_HASH") { ++i; - if(i == args.end()) - { + if (i == args.end()) { this->SetError("DOWNLOAD missing ALGO=value for EXPECTED_HASH."); return false; - } + } std::string::size_type pos = i->find("="); - if(pos == std::string::npos) - { + if (pos == std::string::npos) { std::string err = "DOWNLOAD EXPECTED_HASH expects ALGO=value but got: "; err += *i; this->SetError(err); return false; - } + } std::string algo = i->substr(0, pos); - expectedHash = cmSystemTools::LowerCase(i->substr(pos+1)); + expectedHash = cmSystemTools::LowerCase(i->substr(pos + 1)); hash = cmsys::auto_ptr<cmCryptoHash>(cmCryptoHash::New(algo.c_str())); - if(!hash.get()) - { + if (!hash.get()) { std::string err = "DOWNLOAD EXPECTED_HASH given unknown ALGO: "; err += algo; this->SetError(err); return false; - } - hashMatchMSG = algo + " hash"; } - ++i; + hashMatchMSG = algo + " hash"; } + ++i; + } // If file exists already, and caller specified an expected md5 or sha, // and the existing file already has the expected hash, then simply // return. // - if(cmSystemTools::FileExists(file.c_str()) && hash.get()) - { + if (cmSystemTools::FileExists(file.c_str()) && hash.get()) { std::string msg; std::string actualHash = hash->HashFile(file); - if(actualHash == expectedHash) - { + if (actualHash == expectedHash) { msg = "returning early; file already exists with expected "; msg += hashMatchMSG; msg += "\""; - if(!statusVar.empty()) - { + if (!statusVar.empty()) { std::ostringstream result; result << (int)0 << ";\"" << msg; - this->Makefile->AddDefinition(statusVar, - result.str().c_str()); - } - return true; + this->Makefile->AddDefinition(statusVar, result.str().c_str()); } + return true; } + } // Make sure parent directory exists so we can write to the file // as we receive downloaded bits from curl... // std::string dir = cmSystemTools::GetFilenamePath(file); - if(!cmSystemTools::FileExists(dir.c_str()) && - !cmSystemTools::MakeDirectory(dir.c_str())) - { - std::string errstring = "DOWNLOAD error: cannot create directory '" - + dir + "' - Specify file by full path name and verify that you " + if (!cmSystemTools::FileExists(dir.c_str()) && + !cmSystemTools::MakeDirectory(dir.c_str())) { + std::string errstring = "DOWNLOAD error: cannot create directory '" + dir + + "' - Specify file by full path name and verify that you " "have directory creation and file write privileges."; this->SetError(errstring); return false; - } + } cmsys::ofstream fout(file.c_str(), std::ios::binary); - if(!fout) - { + if (!fout) { this->SetError("DOWNLOAD cannot open file for write."); return false; - } + } #if defined(_WIN32) && defined(CMAKE_ENCODING_UTF8) url = fix_file_url_windows(url); #endif - ::CURL *curl; + ::CURL* curl; ::curl_global_init(CURL_GLOBAL_DEFAULT); curl = ::curl_easy_init(); - if(!curl) - { + if (!curl) { this->SetError("DOWNLOAD error initializing curl."); return false; - } + } cURLEasyGuard g_curl(curl); ::CURLcode res = ::curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); @@ -3157,8 +2626,7 @@ cmFileCommand::HandleDownloadCommand(std::vector<std::string> const& args) res = ::curl_easy_setopt(curl, CURLOPT_USERAGENT, "curl/" LIBCURL_VERSION); check_curl_result(res, "DOWNLOAD cannot set user agent option: "); - res = ::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, - cmWriteToFileCallback); + res = ::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, cmWriteToFileCallback); check_curl_result(res, "DOWNLOAD cannot set write function: "); res = ::curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, @@ -3166,54 +2634,47 @@ cmFileCommand::HandleDownloadCommand(std::vector<std::string> const& args) check_curl_result(res, "DOWNLOAD cannot set debug function: "); // check to see if TLS verification is requested - if(tls_verify) - { + if (tls_verify) { res = ::curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1); check_curl_result(res, "Unable to set TLS/SSL Verify on: "); - } - else - { + } else { res = ::curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); check_curl_result(res, "Unable to set TLS/SSL Verify off: "); - } + } // check to see if a CAINFO file has been specified // command arg comes first std::string const& cainfo_err = cmCurlSetCAInfo(curl, cainfo); - if (!cainfo_err.empty()) - { + if (!cainfo_err.empty()) { this->SetError(cainfo_err); return false; - } + } cmFileCommandVectorOfChar chunkDebug; - res = ::curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&fout); + res = ::curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&fout); check_curl_result(res, "DOWNLOAD cannot set write data: "); - res = ::curl_easy_setopt(curl, CURLOPT_DEBUGDATA, (void *)&chunkDebug); + res = ::curl_easy_setopt(curl, CURLOPT_DEBUGDATA, (void*)&chunkDebug); check_curl_result(res, "DOWNLOAD cannot set debug data: "); res = ::curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); check_curl_result(res, "DOWNLOAD cannot set follow-redirect option: "); - if(!logVar.empty()) - { + if (!logVar.empty()) { res = ::curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); check_curl_result(res, "DOWNLOAD cannot set verbose: "); - } + } - if(timeout > 0) - { - res = ::curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout ); + if (timeout > 0) { + res = ::curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); check_curl_result(res, "DOWNLOAD cannot set timeout: "); - } + } - if(inactivity_timeout > 0) - { + if (inactivity_timeout > 0) { // Give up if there is no progress for a long time. ::curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 1); ::curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, inactivity_timeout); - } + } // Need the progress helper's scope to last through the duration of // the curl_easy_perform call... so this object is declared at function @@ -3222,19 +2683,18 @@ cmFileCommand::HandleDownloadCommand(std::vector<std::string> const& args) // cURLProgressHelper helper(this, "download"); - if(showProgress) - { + if (showProgress) { res = ::curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); check_curl_result(res, "DOWNLOAD cannot set noprogress value: "); - res = ::curl_easy_setopt(curl, - CURLOPT_PROGRESSFUNCTION, cmFileDownloadProgressCallback); + res = ::curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, + cmFileDownloadProgressCallback); check_curl_result(res, "DOWNLOAD cannot set progress function: "); - res = ::curl_easy_setopt(curl, - CURLOPT_PROGRESSDATA, reinterpret_cast<void*>(&helper)); + res = ::curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, + reinterpret_cast<void*>(&helper)); check_curl_result(res, "DOWNLOAD cannot set progress data: "); - } + } res = ::curl_easy_perform(curl); @@ -3242,13 +2702,11 @@ cmFileCommand::HandleDownloadCommand(std::vector<std::string> const& args) g_curl.release(); ::curl_easy_cleanup(curl); - if(!statusVar.empty()) - { + if (!statusVar.empty()) { std::ostringstream result; result << (int)res << ";\"" << ::curl_easy_strerror(res) << "\""; - this->Makefile->AddDefinition(statusVar, - result.str().c_str()); - } + this->Makefile->AddDefinition(statusVar, result.str().c_str()); + } ::curl_global_cleanup(); @@ -3259,44 +2717,38 @@ cmFileCommand::HandleDownloadCommand(std::vector<std::string> const& args) // Verify MD5 sum if requested: // - if (hash.get()) - { + if (hash.get()) { std::string actualHash = hash->HashFile(file); - if (actualHash.empty()) - { + if (actualHash.empty()) { this->SetError("DOWNLOAD cannot compute hash on downloaded file"); return false; - } + } - if (expectedHash != actualHash) - { + if (expectedHash != actualHash) { std::ostringstream oss; oss << "DOWNLOAD HASH mismatch" << std::endl - << " for file: [" << file << "]" << std::endl - << " expected hash: [" << expectedHash << "]" << std::endl - << " actual hash: [" << actualHash << "]" << std::endl - << " status: [" << (int)res << ";\"" - << ::curl_easy_strerror(res) << "\"]" << std::endl - ; - - if(!statusVar.empty() && res == 0) - { + << " for file: [" << file << "]" << std::endl + << " expected hash: [" << expectedHash << "]" << std::endl + << " actual hash: [" << actualHash << "]" << std::endl + << " status: [" << (int)res << ";\"" + << ::curl_easy_strerror(res) << "\"]" << std::endl; + + if (!statusVar.empty() && res == 0) { std::string status = "1;HASH mismatch: " - "expected: " + expectedHash + - " actual: " + actualHash; + "expected: " + + expectedHash + " actual: " + actualHash; this->Makefile->AddDefinition(statusVar, status.c_str()); - } + } this->SetError(oss.str()); return false; - } } + } - if (!logVar.empty()) - { + if (!logVar.empty()) { chunkDebug.push_back(0); this->Makefile->AddDefinition(logVar, &*chunkDebug.begin()); - } + } return true; #else @@ -3305,16 +2757,13 @@ cmFileCommand::HandleDownloadCommand(std::vector<std::string> const& args) #endif } - -bool -cmFileCommand::HandleUploadCommand(std::vector<std::string> const& args) +bool cmFileCommand::HandleUploadCommand(std::vector<std::string> const& args) { #if defined(CMAKE_BUILD_WITH_CMAKE) - if(args.size() < 3) - { + if (args.size() < 3) { this->SetError("UPLOAD must be called with at least three arguments."); return false; - } + } std::vector<std::string>::const_iterator i = args.begin(); ++i; std::string filename = *i; @@ -3328,72 +2777,53 @@ cmFileCommand::HandleUploadCommand(std::vector<std::string> const& args) std::string statusVar; bool showProgress = false; - while(i != args.end()) - { - if(*i == "TIMEOUT") - { + while (i != args.end()) { + if (*i == "TIMEOUT") { ++i; - if(i != args.end()) - { + if (i != args.end()) { timeout = atol(i->c_str()); - } - else - { + } else { this->SetError("UPLOAD missing time for TIMEOUT."); return false; - } } - else if(*i == "INACTIVITY_TIMEOUT") - { + } else if (*i == "INACTIVITY_TIMEOUT") { ++i; - if(i != args.end()) - { + if (i != args.end()) { inactivity_timeout = atol(i->c_str()); - } - else - { + } else { this->SetError("UPLOAD missing time for INACTIVITY_TIMEOUT."); return false; - } } - else if(*i == "LOG") - { + } else if (*i == "LOG") { ++i; - if( i == args.end()) - { + if (i == args.end()) { this->SetError("UPLOAD missing VAR for LOG."); return false; - } - logVar = *i; } - else if(*i == "STATUS") - { + logVar = *i; + } else if (*i == "STATUS") { ++i; - if( i == args.end()) - { + if (i == args.end()) { this->SetError("UPLOAD missing VAR for STATUS."); return false; - } - statusVar = *i; } - else if(*i == "SHOW_PROGRESS") - { + statusVar = *i; + } else if (*i == "SHOW_PROGRESS") { showProgress = true; - } + } ++i; - } + } // Open file for reading: // - FILE *fin = cmsys::SystemTools::Fopen(filename, "rb"); - if(!fin) - { + FILE* fin = cmsys::SystemTools::Fopen(filename, "rb"); + if (!fin) { std::string errStr = "UPLOAD cannot open file '"; errStr += filename + "' for reading."; this->SetError(errStr); return false; - } + } unsigned long file_size = cmsys::SystemTools::FileLength(filename); @@ -3401,15 +2831,14 @@ cmFileCommand::HandleUploadCommand(std::vector<std::string> const& args) url = fix_file_url_windows(url); #endif - ::CURL *curl; + ::CURL* curl; ::curl_global_init(CURL_GLOBAL_DEFAULT); curl = ::curl_easy_init(); - if(!curl) - { + if (!curl) { this->SetError("UPLOAD error initializing curl."); fclose(fin); return false; - } + } cURLEasyGuard g_curl(curl); @@ -3424,8 +2853,8 @@ cmFileCommand::HandleUploadCommand(std::vector<std::string> const& args) res = ::curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); check_curl_result(res, "UPLOAD cannot set url: "); - res = ::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, - cmWriteToMemoryCallback); + res = + ::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, cmWriteToMemoryCallback); check_curl_result(res, "UPLOAD cannot set write function: "); res = ::curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, @@ -3435,33 +2864,30 @@ cmFileCommand::HandleUploadCommand(std::vector<std::string> const& args) cmFileCommandVectorOfChar chunkResponse; cmFileCommandVectorOfChar chunkDebug; - res = ::curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunkResponse); + res = ::curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&chunkResponse); check_curl_result(res, "UPLOAD cannot set write data: "); - res = ::curl_easy_setopt(curl, CURLOPT_DEBUGDATA, (void *)&chunkDebug); + res = ::curl_easy_setopt(curl, CURLOPT_DEBUGDATA, (void*)&chunkDebug); check_curl_result(res, "UPLOAD cannot set debug data: "); res = ::curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); check_curl_result(res, "UPLOAD cannot set follow-redirect option: "); - if(!logVar.empty()) - { + if (!logVar.empty()) { res = ::curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); check_curl_result(res, "UPLOAD cannot set verbose: "); - } + } - if(timeout > 0) - { - res = ::curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout ); + if (timeout > 0) { + res = ::curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); check_curl_result(res, "UPLOAD cannot set timeout: "); - } + } - if(inactivity_timeout > 0) - { + if (inactivity_timeout > 0) { // Give up if there is no progress for a long time. ::curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 1); ::curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, inactivity_timeout); - } + } // Need the progress helper's scope to last through the duration of // the curl_easy_perform call... so this object is declared at function @@ -3470,27 +2896,26 @@ cmFileCommand::HandleUploadCommand(std::vector<std::string> const& args) // cURLProgressHelper helper(this, "upload"); - if(showProgress) - { + if (showProgress) { res = ::curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); check_curl_result(res, "UPLOAD cannot set noprogress value: "); - res = ::curl_easy_setopt(curl, - CURLOPT_PROGRESSFUNCTION, cmFileUploadProgressCallback); + res = ::curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, + cmFileUploadProgressCallback); check_curl_result(res, "UPLOAD cannot set progress function: "); - res = ::curl_easy_setopt(curl, - CURLOPT_PROGRESSDATA, reinterpret_cast<void*>(&helper)); + res = ::curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, + reinterpret_cast<void*>(&helper)); check_curl_result(res, "UPLOAD cannot set progress data: "); - } + } // now specify which file to upload res = ::curl_easy_setopt(curl, CURLOPT_INFILE, fin); check_curl_result(res, "UPLOAD cannot set input file: "); // and give the size of the upload (optional) - res = ::curl_easy_setopt(curl, - CURLOPT_INFILESIZE, static_cast<long>(file_size)); + res = + ::curl_easy_setopt(curl, CURLOPT_INFILESIZE, static_cast<long>(file_size)); check_curl_result(res, "UPLOAD cannot set input file size: "); res = ::curl_easy_perform(curl); @@ -3499,41 +2924,36 @@ cmFileCommand::HandleUploadCommand(std::vector<std::string> const& args) g_curl.release(); ::curl_easy_cleanup(curl); - if(!statusVar.empty()) - { + if (!statusVar.empty()) { std::ostringstream result; result << (int)res << ";\"" << ::curl_easy_strerror(res) << "\""; - this->Makefile->AddDefinition(statusVar, - result.str().c_str()); - } + this->Makefile->AddDefinition(statusVar, result.str().c_str()); + } ::curl_global_cleanup(); fclose(fin); fin = NULL; - if(!logVar.empty()) - { + if (!logVar.empty()) { std::string log; - if(!chunkResponse.empty()) - { + if (!chunkResponse.empty()) { chunkResponse.push_back(0); log += "Response:\n"; log += &*chunkResponse.begin(); log += "\n"; - } + } - if(!chunkDebug.empty()) - { + if (!chunkDebug.empty()) { chunkDebug.push_back(0); log += "Debug:\n"; log += &*chunkDebug.begin(); log += "\n"; - } + } this->Makefile->AddDefinition(logVar, log.c_str()); - } + } return true; #else @@ -3542,81 +2962,72 @@ cmFileCommand::HandleUploadCommand(std::vector<std::string> const& args) #endif } -void cmFileCommand::AddEvaluationFile(const std::string &inputName, - const std::string &outputExpr, - const std::string &condition, - bool inputIsContent - ) +void cmFileCommand::AddEvaluationFile(const std::string& inputName, + const std::string& outputExpr, + const std::string& condition, + bool inputIsContent) { cmListFileBacktrace lfbt = this->Makefile->GetBacktrace(); cmGeneratorExpression outputGe(lfbt); - cmsys::auto_ptr<cmCompiledGeneratorExpression> outputCge - = outputGe.Parse(outputExpr); + cmsys::auto_ptr<cmCompiledGeneratorExpression> outputCge = + outputGe.Parse(outputExpr); cmGeneratorExpression conditionGe(lfbt); - cmsys::auto_ptr<cmCompiledGeneratorExpression> conditionCge - = conditionGe.Parse(condition); + cmsys::auto_ptr<cmCompiledGeneratorExpression> conditionCge = + conditionGe.Parse(condition); - this->Makefile->AddEvaluationFile(inputName, outputCge, - conditionCge, inputIsContent); + this->Makefile->AddEvaluationFile(inputName, outputCge, conditionCge, + inputIsContent); } -bool cmFileCommand::HandleGenerateCommand( - std::vector<std::string> const& args) +bool cmFileCommand::HandleGenerateCommand(std::vector<std::string> const& args) { - if (args.size() < 5) - { + if (args.size() < 5) { this->SetError("Incorrect arguments to GENERATE subcommand."); return false; - } - if (args[1] != "OUTPUT") - { + } + if (args[1] != "OUTPUT") { this->SetError("Incorrect arguments to GENERATE subcommand."); return false; - } + } std::string condition; - if (args.size() > 5) - { - if (args[5] != "CONDITION") - { + if (args.size() > 5) { + if (args[5] != "CONDITION") { this->SetError("Incorrect arguments to GENERATE subcommand."); return false; - } - if (args.size() != 7) - { + } + if (args.size() != 7) { this->SetError("Incorrect arguments to GENERATE subcommand."); return false; - } + } condition = args[6]; - if (condition.empty()) - { + if (condition.empty()) { this->SetError("CONDITION of sub-command GENERATE must not be empty if " - "specified."); + "specified."); return false; - } } + } std::string output = args[2]; const bool inputIsContent = args[3] != "INPUT"; - if (inputIsContent && args[3] != "CONTENT") - { + if (inputIsContent && args[3] != "CONTENT") { this->SetError("Incorrect arguments to GENERATE subcommand."); return false; - } + } std::string input = args[4]; this->AddEvaluationFile(input, output, condition, inputIsContent); return true; } -bool cmFileCommand::HandleLockCommand( - std::vector<std::string> const& args) +bool cmFileCommand::HandleLockCommand(std::vector<std::string> const& args) { #if defined(CMAKE_BUILD_WITH_CMAKE) // Default values bool directory = false; bool release = false; - enum Guard { + enum Guard + { GUARD_FUNCTION, GUARD_FILE, GUARD_PROCESS @@ -3626,148 +3037,111 @@ bool cmFileCommand::HandleLockCommand( unsigned long timeout = static_cast<unsigned long>(-1); // Parse arguments - if(args.size() < 2) - { + if (args.size() < 2) { this->Makefile->IssueMessage( - cmake::FATAL_ERROR, - "sub-command LOCK requires at least two arguments."); + cmake::FATAL_ERROR, "sub-command LOCK requires at least two arguments."); return false; - } + } std::string path = args[1]; - for (unsigned i = 2; i < args.size(); ++i) - { - if (args[i] == "DIRECTORY") - { + for (unsigned i = 2; i < args.size(); ++i) { + if (args[i] == "DIRECTORY") { directory = true; - } - else if (args[i] == "RELEASE") - { + } else if (args[i] == "RELEASE") { release = true; - } - else if (args[i] == "GUARD") - { + } else if (args[i] == "GUARD") { ++i; const char* merr = "expected FUNCTION, FILE or PROCESS after GUARD"; - if (i >= args.size()) - { + if (i >= args.size()) { this->Makefile->IssueMessage(cmake::FATAL_ERROR, merr); return false; - } - else - { - if (args[i] == "FUNCTION") - { + } else { + if (args[i] == "FUNCTION") { guard = GUARD_FUNCTION; - } - else if (args[i] == "FILE") - { + } else if (args[i] == "FILE") { guard = GUARD_FILE; - } - else if (args[i] == "PROCESS") - { + } else if (args[i] == "PROCESS") { guard = GUARD_PROCESS; - } - else - { + } else { std::ostringstream e; e << merr << ", but got:\n \"" << args[i] << "\"."; this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); return false; - } } } - else if (args[i] == "RESULT_VARIABLE") - { + } else if (args[i] == "RESULT_VARIABLE") { ++i; - if (i >= args.size()) - { + if (i >= args.size()) { this->Makefile->IssueMessage( - cmake::FATAL_ERROR, - "expected variable name after RESULT_VARIABLE"); + cmake::FATAL_ERROR, "expected variable name after RESULT_VARIABLE"); return false; - } - resultVariable = args[i]; } - else if (args[i] == "TIMEOUT") - { + resultVariable = args[i]; + } else if (args[i] == "TIMEOUT") { ++i; - if (i >= args.size()) - { - this->Makefile->IssueMessage( - cmake::FATAL_ERROR, - "expected timeout value after TIMEOUT"); + if (i >= args.size()) { + this->Makefile->IssueMessage(cmake::FATAL_ERROR, + "expected timeout value after TIMEOUT"); return false; - } + } long scanned; - if(!cmSystemTools::StringToLong(args[i].c_str(), &scanned) - || scanned < 0) - { + if (!cmSystemTools::StringToLong(args[i].c_str(), &scanned) || + scanned < 0) { std::ostringstream e; e << "TIMEOUT value \"" << args[i] << "\" is not an unsigned integer."; this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); return false; - } - timeout = static_cast<unsigned long>(scanned); } - else - { + timeout = static_cast<unsigned long>(scanned); + } else { std::ostringstream e; e << "expected DIRECTORY, RELEASE, GUARD, RESULT_VARIABLE or TIMEOUT\n"; e << "but got: \"" << args[i] << "\"."; this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); return false; - } } + } - if (directory) - { + if (directory) { path += "/cmake.lock"; - } + } - if (!cmsys::SystemTools::FileIsFullPath(path)) - { + if (!cmsys::SystemTools::FileIsFullPath(path)) { path = this->Makefile->GetCurrentSourceDirectory() + ("/" + path); - } + } // Unify path (remove '//', '/../', ...) path = cmSystemTools::CollapseFullPath(path); // Create file and directories if needed std::string parentDir = cmSystemTools::GetParentDirectory(path); - if (!cmSystemTools::MakeDirectory(parentDir)) - { + if (!cmSystemTools::MakeDirectory(parentDir)) { std::ostringstream e; e << "directory\n \"" << parentDir << "\"\ncreation failed "; e << "(check permissions)."; this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); cmSystemTools::SetFatalErrorOccured(); return false; - } - FILE *file = cmsys::SystemTools::Fopen(path, "w"); - if (!file) - { + } + FILE* file = cmsys::SystemTools::Fopen(path, "w"); + if (!file) { std::ostringstream e; e << "file\n \"" << path << "\"\ncreation failed (check permissions)."; this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); cmSystemTools::SetFatalErrorOccured(); return false; - } + } fclose(file); // Actual lock/unlock - cmFileLockPool& lockPool = this->Makefile->GetGlobalGenerator() - ->GetFileLockPool(); + cmFileLockPool& lockPool = + this->Makefile->GetGlobalGenerator()->GetFileLockPool(); cmFileLockResult fileLockResult(cmFileLockResult::MakeOk()); - if (release) - { + if (release) { fileLockResult = lockPool.Release(path); - } - else - { - switch (guard) - { + } else { + switch (guard) { case GUARD_FUNCTION: fileLockResult = lockPool.LockFunctionScope(path, timeout); break; @@ -3780,24 +3154,22 @@ bool cmFileCommand::HandleLockCommand( default: cmSystemTools::SetFatalErrorOccured(); return false; - } } + } const std::string result = fileLockResult.GetOutputMessage(); - if (resultVariable.empty() && !fileLockResult.IsOk()) - { + if (resultVariable.empty() && !fileLockResult.IsOk()) { std::ostringstream e; e << "error locking file\n \"" << path << "\"\n" << result << "."; this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); cmSystemTools::SetFatalErrorOccured(); return false; - } + } - if (!resultVariable.empty()) - { + if (!resultVariable.empty()) { this->Makefile->AddDefinition(resultVariable, result.c_str()); - } + } return true; #else @@ -3810,16 +3182,13 @@ bool cmFileCommand::HandleLockCommand( bool cmFileCommand::HandleTimestampCommand( std::vector<std::string> const& args) { - if(args.size() < 3) - { + if (args.size() < 3) { this->SetError("sub-command TIMESTAMP requires at least two arguments."); return false; - } - else if(args.size() > 5) - { + } else if (args.size() > 5) { this->SetError("sub-command TIMESTAMP takes at most four arguments."); return false; - } + } unsigned int argsIndex = 1; @@ -3828,30 +3197,25 @@ bool cmFileCommand::HandleTimestampCommand( const std::string& outputVariable = args[argsIndex++]; std::string formatString; - if(args.size() > argsIndex && args[argsIndex] != "UTC") - { + if (args.size() > argsIndex && args[argsIndex] != "UTC") { formatString = args[argsIndex++]; - } + } bool utcFlag = false; - if(args.size() > argsIndex) - { - if(args[argsIndex] == "UTC") - { + if (args.size() > argsIndex) { + if (args[argsIndex] == "UTC") { utcFlag = true; - } - else - { + } else { std::string e = " TIMESTAMP sub-command does not recognize option " + - args[argsIndex] + "."; + args[argsIndex] + "."; this->SetError(e); return false; - } } + } cmTimestamp timestamp; - std::string result = timestamp.FileModificationTime( - filename.c_str(), formatString, utcFlag); + std::string result = + timestamp.FileModificationTime(filename.c_str(), formatString, utcFlag); this->Makefile->AddDefinition(outputVariable, result.c_str()); return true; |