From e77515c2da3fcbc52809de9f148b6807459e1f28 Mon Sep 17 00:00:00 2001 From: Andy Cedilnik Date: Thu, 17 Jan 2002 14:11:26 -0500 Subject: [PATCH] Add option of adding generated files to source list --- Source/cmSourceFilesCommand.cxx | 59 +++++++++++++++++++++++++-------- Source/cmSourceFilesCommand.h | 11 +++++- 2 files changed, 56 insertions(+), 14 deletions(-) diff --git a/Source/cmSourceFilesCommand.cxx b/Source/cmSourceFilesCommand.cxx index 003bc2f7d..e6d717620 100644 --- a/Source/cmSourceFilesCommand.cxx +++ b/Source/cmSourceFilesCommand.cxx @@ -51,32 +51,65 @@ bool cmSourceFilesCommand::InitialPass(std::vector const& args) std::string name = args[0]; m_Makefile->ExpandVariablesInString(name); + + int generated = 0; for(std::vector::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; } diff --git a/Source/cmSourceFilesCommand.h b/Source/cmSourceFilesCommand.h index 235c6b6ce..924573f38 100644 --- a/Source/cmSourceFilesCommand.h +++ b/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);