Просмотр исходного кода

Add option of adding generated files to source list

Andy Cedilnik 24 лет назад
Родитель
Сommit
e77515c2da
2 измененных файлов с 56 добавлено и 14 удалено
  1. 46 13
      Source/cmSourceFilesCommand.cxx
  2. 10 1
      Source/cmSourceFilesCommand.h

+ 46 - 13
Source/cmSourceFilesCommand.cxx

@@ -51,32 +51,65 @@ bool cmSourceFilesCommand::InitialPass(std::vector<std::string> const& args)
   
   std::string name = args[0];
   m_Makefile->ExpandVariablesInString(name);
+  
+  int generated = 0;
 
   for(std::vector<std::string>::const_iterator i = (args.begin() + 1);
       i != args.end(); ++i)
     {
     std::string copy = *i;
-    m_Makefile->ExpandVariablesInString(copy);
+    // Keyword GENERATED in the source file list means that 
+    // from here on files will be generated
+    if ( copy == "GENERATED" )
+      {
+      generated = 1;
+      continue;
+      }
     cmSourceFile file;
+    m_Makefile->ExpandVariablesInString(copy);
     file.SetIsAnAbstractClass(false);
     std::string path = cmSystemTools::GetFilenamePath(copy);
-    // if this is a full path then 
-    if((path.size() && path[0] == '/') ||
-       (path.size() > 1 && path[1] == ':'))
+    if ( generated )
       {
-      file.SetName(cmSystemTools::GetFilenameName(copy.c_str()).c_str(), 
-                   path.c_str(),
-                   m_Makefile->GetSourceExtensions(),
-                   m_Makefile->GetHeaderExtensions());
+      // This file will be generated, so we should not check
+      // if it exist. 
+      std::string ext = cmSystemTools::GetFilenameExtension(copy);
+      std::string name_no_ext = cmSystemTools::GetFilenameName(copy.c_str());
+      name_no_ext = name_no_ext.substr(0, name_no_ext.length()-ext.length());
+      if ( ext[0] == '.' )
+	{
+	ext = ext.substr(1);
+	}
+      if((path.size() && path[0] == '/') ||
+	 (path.size() > 1 && path[1] == ':'))
+	{
+	file.SetName(name_no_ext.c_str(), path.c_str(), ext.c_str(), false);
+	}
+      else
+	{
+	file.SetName(name_no_ext.c_str(), m_Makefile->GetCurrentOutputDirectory(), 
+		     ext.c_str(), false);
+	}
       }
     else
-      {
-      file.SetName(copy.c_str(), m_Makefile->GetCurrentDirectory(),
-                   m_Makefile->GetSourceExtensions(),
-                   m_Makefile->GetHeaderExtensions());
-      }
+      // if this is a full path then 
+      if((path.size() && path[0] == '/') ||
+	 (path.size() > 1 && path[1] == ':'))
+	{
+	file.SetName(cmSystemTools::GetFilenameName(copy.c_str()).c_str(), 
+		     path.c_str(),
+		     m_Makefile->GetSourceExtensions(),
+		     m_Makefile->GetHeaderExtensions());
+	}
+      else
+	{
+	file.SetName(copy.c_str(), m_Makefile->GetCurrentDirectory(),
+		     m_Makefile->GetSourceExtensions(),
+		     m_Makefile->GetHeaderExtensions());
+	}    
     m_Makefile->AddSource(file, name.c_str());
     }
+
   return true;
 }
 

+ 10 - 1
Source/cmSourceFilesCommand.h

@@ -53,6 +53,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * dependent on other packages (use SOURCE_FILES_REQUIRED() to add
  * dependent source files).
  *
+ * It allows sources to be added even if they are generated by a build 
+ * process. This can be achieved usiong GENERATED keyword:
+ * SOURCE_FILES( Project_SRCS
+ *   Source1
+ *   Source2
+ *   ...
+ *   GENERATED
+ *   SourceThatDoesNotExist )
+ *
  * \sa cmSourceFilesRequireCommand
  */
 class cmSourceFilesCommand : public cmCommand
@@ -91,7 +100,7 @@ public:
   virtual const char* GetFullDocumentation()
     {
     return
-      "SOURCE_FILES(NAME file1 file2 ...)";
+      "SOURCE_FILES(NAME file1 file2 ... [ GENERATED generated_file1 ... ])";
     }
   
   cmTypeMacro(cmSourceFilesCommand, cmCommand);