diff --git a/Modules/CMakeDetermineCompilerId.cmake b/Modules/CMakeDetermineCompilerId.cmake index f0fce8fe7..e30db357a 100644 --- a/Modules/CMakeDetermineCompilerId.cmake +++ b/Modules/CMakeDetermineCompilerId.cmake @@ -76,6 +76,8 @@ MACRO(CMAKE_DETERMINE_COMPILER_ID lang flagvar src) "${CMAKE_${lang}_COMPILER_ID_EXE}\"\n\n") # only check if we don't have it yet IF(NOT CMAKE_${lang}_COMPILER_ID) +# SET(CMAKE_${lang}_COMPILER_ID_EXE "${CMAKE_${lang}_COMPILER_ID_DIR}/ConvertedToBinary") +# FILE(HEX_TO_BIN "${CMAKE_${lang}_COMPILER_ID_EXE_TRY}" "${CMAKE_${lang}_COMPILER_ID_EXE}") # Read the compiler identification string from the executable file. FILE(STRINGS ${CMAKE_${lang}_COMPILER_ID_EXE} CMAKE_${lang}_COMPILER_ID_STRINGS LIMIT_COUNT 2 REGEX "INFO:") diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 5b3390d72..f75ed798b 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -76,6 +76,10 @@ bool cmFileCommand::InitialPass(std::vector const& args) { return this->HandleStringsCommand(args); } +/* else if ( subCommand == "HEX_TO_BIN" ) + { + return this->HandleHex2BinCommand(args); + }*/ else if ( subCommand == "GLOB" ) { return this->HandleGlobCommand(args, false); @@ -257,6 +261,53 @@ bool cmFileCommand::HandleReadCommand(std::vector const& args) return true; } +//---------------------------------------------------------------------------- +/*bool cmFileCommand::HandleHex2BinCommand(std::vector const& args) +{ + if(args.size() != 3) + { + this->SetError("HEX_TO_BIN requires an input and an output file name"); + return false; + } + // Get the file to read. + std::string inFileName = args[1]; + if(!cmsys::SystemTools::FileIsFullPath(inFileName.c_str())) + { + inFileName = this->Makefile->GetCurrentDirectory(); + inFileName += "/" + args[1]; + } + + // Get the file to write. + std::string outFileName = args[2]; + if(!cmsys::SystemTools::FileIsFullPath(outFileName.c_str())) + { + outFileName = this->Makefile->GetCurrentDirectory(); + outFileName += "/" + args[2]; + } + + if ( !this->Makefile->CanIWriteThisFile(outFileName.c_str()) ) + { + std::string e + = "attempted to write a file: " + outFileName + + " into a source directory."; + this->SetError(e.c_str()); + cmSystemTools::SetFatalErrorOccured(); + return false; + } + + std::string dir = cmSystemTools::GetFilenamePath(outFileName); + cmSystemTools::MakeDirectory(dir.c_str()); + + bool success = cmHexFileConverter::TryConvert(inFileName.c_str(), + outFileName.c_str()); + if (!success) + { + success = cmSystemTools::CopyFileAlways(inFileName.c_str(), + outFileName.c_str()); + } + return success; +} */ + //---------------------------------------------------------------------------- bool cmFileCommand::HandleStringsCommand(std::vector const& args) { @@ -294,6 +345,7 @@ bool cmFileCommand::HandleStringsCommand(std::vector const& args) cmsys::RegularExpression regex; bool have_regex = false; bool newline_consume = false; + bool hex_conversion_enabled = true; int arg_mode = arg_none; for(unsigned int i=3; i < args.size(); ++i) { @@ -326,6 +378,11 @@ bool cmFileCommand::HandleStringsCommand(std::vector const& args) newline_consume = true; arg_mode = arg_none; } + else if(args[i] == "NO_HEX_CONVERSION") + { + hex_conversion_enabled = false; + arg_mode = arg_none; + } else if(arg_mode == arg_limit_input) { if(sscanf(args[i].c_str(), "%d", &limit_input) != 1 || @@ -416,15 +473,19 @@ bool cmFileCommand::HandleStringsCommand(std::vector const& args) return false; } } - - std::string binaryFileName = this->Makefile->GetCurrentOutputDirectory(); - binaryFileName += cmake::GetCMakeFilesDirectory(); - binaryFileName += "/FileCommandStringsBinaryFile"; - if (cmHexFileConverter::TryConvert(fileName.c_str(), binaryFileName.c_str())) - { - fileName = binaryFileName; - } + if (hex_conversion_enabled) + { + // TODO: should work without temp file, but just on a memory buffer + std::string binaryFileName = this->Makefile->GetCurrentOutputDirectory(); + binaryFileName += cmake::GetCMakeFilesDirectory(); + binaryFileName += "/FileCommandStringsBinaryFile"; + if (cmHexFileConverter::TryConvert(fileName.c_str(), binaryFileName.c_str())) + { + fileName = binaryFileName; + } + } + // Open the specified file. #if defined(_WIN32) || defined(__CYGWIN__) std::ifstream fin(fileName.c_str(), std::ios::in | std::ios::binary); diff --git a/Source/cmFileCommand.h b/Source/cmFileCommand.h index 5868725f7..029e6983d 100644 --- a/Source/cmFileCommand.h +++ b/Source/cmFileCommand.h @@ -72,7 +72,9 @@ public: " FILE(STRINGS filename variable [LIMIT_COUNT num]\n" " [LIMIT_INPUT numBytes] [LIMIT_OUTPUT numBytes]\n" " [LENGTH_MINIMUM numBytes] [LENGTH_MAXIMUM numBytes]\n" - " [NEWLINE_CONSUME] [REGEX regex])\n" + " [NEWLINE_CONSUME] [REGEX regex]\n" + " [NO_HEX_CONVERSION])\n" + " FILE(HEX_TO_BIN inputfile outputfile)\n" " FILE(GLOB variable [RELATIVE path] [globbing expressions]...)\n" " FILE(GLOB_RECURSE variable [RELATIVE path] \n" " [globbing expressions]...)\n" @@ -93,10 +95,14 @@ public: "want to generate input files to CMake.\n" "READ will read the content of a file and store it into the " "variable.\n" - "STRINGS will parse a list of ASCII strings from a binary file and " + "STRINGS will parse a list of ASCII strings from a file and " "store it in a variable. Binary data in the file are ignored. Carriage " "return (CR) characters are ignored. It works also for Intel Hex and " - "Motorola S-record files.\n " + "Motorola S-record files, which are automatically converted to binary " + "format when reading them. Disable this using NO_HEX_CONVERSION.\n " +/* "HEX_TO_BIN will convert an Intel hex file or Motorola S-record file " + "to a binary file. If the input file is no such file it will simply " + "be copied. \n"*/ "LIMIT_COUNT sets the maximum number of strings to return. " "LIMIT_INPUT sets the maximum number of bytes to read from " "the input file. " @@ -147,6 +153,7 @@ protected: bool HandleWriteCommand(std::vector const& args, bool append); bool HandleReadCommand(std::vector const& args); bool HandleStringsCommand(std::vector const& args); +// bool HandleHex2BinCommand(std::vector const& args); bool HandleGlobCommand(std::vector const& args, bool recurse); bool HandleMakeDirectoryCommand(std::vector const& args);