From: Mikko Rasa Date: Tue, 1 May 2012 10:05:57 +0000 (+0300) Subject: Move C-specific stuff from SourceFile to CSourceFile X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=7e5ac6af8987bf12f3e338d00e96e8cb74f3534b;p=builder.git Move C-specific stuff from SourceFile to CSourceFile --- diff --git a/source/component.cpp b/source/component.cpp index a340f3c..cc4796c 100644 --- a/source/component.cpp +++ b/source/component.cpp @@ -6,12 +6,12 @@ #include #include "builder.h" #include "component.h" +#include "csourcefile.h" #include "datafile.h" #include "executable.h" #include "file.h" #include "objectfile.h" #include "sharedlibrary.h" -#include "sourcefile.h" #include "sourcepackage.h" #include "staticlibrary.h" #include "tarball.h" @@ -169,7 +169,7 @@ void Component::create_targets() const { FileTarget *hdr = builder.get_vfs().get_target(*i); if(!hdr) - hdr = new SourceFile(builder, *this, *i); + hdr = new CSourceFile(builder, *this, *i); // Install headers if requested if(type==HEADERS && install) diff --git a/source/csourcefile.cpp b/source/csourcefile.cpp new file mode 100644 index 0000000..2162cf0 --- /dev/null +++ b/source/csourcefile.cpp @@ -0,0 +1,86 @@ +#include +#include +#include +#include +#include "builder.h" +#include "component.h" +#include "csourcefile.h" +#include "sourcepackage.h" + +using namespace std; +using namespace Msp; + +CSourceFile::CSourceFile(Builder &b, const FS::Path &p): + SourceFile(b, 0, p) +{ } + +CSourceFile::CSourceFile(Builder &b, const Component &c, const FS::Path &p): + SourceFile(b, &c, p) +{ + string ext = FS::extpart(FS::basename(path)); + if(ext==".h" || ext==".H" || ext==".hpp") + install_location = "include/"+comp->get_name(); +} + +void CSourceFile::find_depends() +{ + if(!comp) + { + deps_ready = true; + return; + } + + const SourcePackage &spkg = comp->get_package(); + string relname = FS::relative(path, spkg.get_source()).str(); + DependencyCache &deps_cache = spkg.get_deps_cache(); + bool deps_found = false; + if(mtime=4) + IO::print("Reading includes from %s\n", path.str()); + + Regex r_include("^[ \t]*#include[ \t]+([\"<].*)[\">]"); + + string line; + while(in.getline(line)) + if(RegMatch match = r_include.match(line)) + includes.push_back(match[1].str); + + deps_cache.set_deps(relname, includes); + } + catch(const IO::file_not_found &) + { + if(builder.get_verbose()>=4) + IO::print("Failed to read includes from %s\n", path.str()); + deps_ready = true; + return; + } + } + + const StringList &incpath = comp->get_build_info().incpath; + + FS::Path dir = FS::dirname(path); + for(list::iterator i=includes.begin(); i!=includes.end(); ++i) + { + Target *hdr = builder.get_vfs().find_header(*i, dir, incpath); + if(hdr) + add_depend(hdr); + } + + deps_ready = true; +} diff --git a/source/csourcefile.h b/source/csourcefile.h new file mode 100644 index 0000000..9e231d9 --- /dev/null +++ b/source/csourcefile.h @@ -0,0 +1,24 @@ +#ifndef CSOURCEFILE_H_ +#define CSOURCEFILE_H_ + +#include "misc.h" +#include "sourcefile.h" + +/** +Represents a C or C++ source file. +*/ +class CSourceFile: public SourceFile +{ +private: + StringList includes; + +public: + CSourceFile(Builder &, const Msp::FS::Path &); + CSourceFile(Builder &, const Component &, const Msp::FS::Path &); + + virtual const char *get_type() const { return "CSourceFile"; } + const StringList &get_includes() const { return includes; } + virtual void find_depends(); +}; + +#endif diff --git a/source/gnuccompiler.cpp b/source/gnuccompiler.cpp index 4ff46e8..8fc8b6c 100644 --- a/source/gnuccompiler.cpp +++ b/source/gnuccompiler.cpp @@ -1,3 +1,4 @@ +#include "csourcefile.h" #include "gnuccompiler.h" using namespace std; @@ -8,3 +9,8 @@ GnuCCompiler::GnuCCompiler(Builder &b): { input_suffixes.push_back(".c"); } + +Target *GnuCCompiler::create_source(const Component &comp, const FS::Path &path) const +{ + return new CSourceFile(builder, comp, path); +} diff --git a/source/gnuccompiler.h b/source/gnuccompiler.h index 918f9bd..2ebfc43 100644 --- a/source/gnuccompiler.h +++ b/source/gnuccompiler.h @@ -8,6 +8,7 @@ class GnuCCompiler: public GnuCompiler public: GnuCCompiler(Builder &); + virtual Target *create_source(const Component &, const Msp::FS::Path &) const; }; #endif diff --git a/source/gnucompiler.cpp b/source/gnucompiler.cpp index 4fa293b..34b4e94 100644 --- a/source/gnucompiler.cpp +++ b/source/gnucompiler.cpp @@ -17,11 +17,6 @@ GnuCompiler::GnuCompiler(Builder &b, const string &t, const string &n): name(n) { } -Target *GnuCompiler::create_source(const Component &comp, const FS::Path &path) const -{ - return new SourceFile(builder, comp, path); -} - Target *GnuCompiler::create_target(const list &sources, const std::string &) const { if(sources.size()!=1) diff --git a/source/gnucompiler.h b/source/gnucompiler.h index 9cdf670..127f32e 100644 --- a/source/gnucompiler.h +++ b/source/gnucompiler.h @@ -11,7 +11,6 @@ protected: GnuCompiler(Builder &, const std::string &, const std::string &); public: - virtual Target *create_source(const Component &, const Msp::FS::Path &) const; virtual Target *create_target(const std::list &, const std::string &) const; virtual Task *run(const Target &) const; }; diff --git a/source/gnucxxcompiler.cpp b/source/gnucxxcompiler.cpp index 8084a03..7c863a5 100644 --- a/source/gnucxxcompiler.cpp +++ b/source/gnucxxcompiler.cpp @@ -1,8 +1,16 @@ +#include "csourcefile.h" #include "gnucxxcompiler.h" +using namespace Msp; + GnuCxxCompiler::GnuCxxCompiler(Builder &b): GnuCompiler(b, "CXX", "g++") { input_suffixes.push_back(".cpp"); input_suffixes.push_back(".cc"); } + +Target *GnuCxxCompiler::create_source(const Component &comp, const FS::Path &path) const +{ + return new CSourceFile(builder, comp, path); +} diff --git a/source/gnucxxcompiler.h b/source/gnucxxcompiler.h index bebb7b7..760994f 100644 --- a/source/gnucxxcompiler.h +++ b/source/gnucxxcompiler.h @@ -7,6 +7,8 @@ class GnuCxxCompiler: public GnuCompiler { public: GnuCxxCompiler(Builder &); + + virtual Target *create_source(const Component &, const Msp::FS::Path &) const; }; #endif diff --git a/source/sourcefile.cpp b/source/sourcefile.cpp index 6fd8eb8..13b337e 100644 --- a/source/sourcefile.cpp +++ b/source/sourcefile.cpp @@ -1,88 +1,8 @@ -#include -#include -#include -#include -#include "builder.h" #include "component.h" #include "sourcefile.h" #include "sourcepackage.h" -using namespace std; -using namespace Msp; - -SourceFile::SourceFile(Builder &b, const FS::Path &p): - FileTarget(b, 0, p), - comp(0) +SourceFile::SourceFile(Builder &b, const Component *c, const Msp::FS::Path &p): + FileTarget(b, (c ? &c->get_package() : 0), p), + comp(c) { } - -SourceFile::SourceFile(Builder &b, const Component &c, const FS::Path &p): - FileTarget(b, &c.get_package(), p), - comp(&c) -{ - string ext = FS::extpart(FS::basename(path)); - if(ext==".h" || ext==".H" || ext==".hpp") - install_location = "include/"+comp->get_name(); -} - -void SourceFile::find_depends() -{ - if(!comp) - { - deps_ready = true; - return; - } - - const SourcePackage &spkg = comp->get_package(); - string relname = FS::relative(path, spkg.get_source()).str(); - DependencyCache &deps_cache = spkg.get_deps_cache(); - bool deps_found = false; - if(mtime=4) - IO::print("Reading includes from %s\n", path.str()); - - Regex r_include("^[ \t]*#include[ \t]+([\"<].*)[\">]"); - - string line; - while(in.getline(line)) - if(RegMatch match = r_include.match(line)) - includes.push_back(match[1].str); - - deps_cache.set_deps(relname, includes); - } - catch(const IO::file_not_found &) - { - if(builder.get_verbose()>=4) - IO::print("Failed to read includes from %s\n", path.str()); - deps_ready = true; - return; - } - } - - const StringList &incpath = comp->get_build_info().incpath; - - FS::Path dir = FS::dirname(path); - for(list::iterator i=includes.begin(); i!=includes.end(); ++i) - { - Target *hdr = builder.get_vfs().find_header(*i, dir, incpath); - if(hdr) - add_depend(hdr); - } - - deps_ready = true; -} diff --git a/source/sourcefile.h b/source/sourcefile.h index 49a4331..9f126ac 100644 --- a/source/sourcefile.h +++ b/source/sourcefile.h @@ -5,23 +5,15 @@ class Component; -/** -Represents a C or C++ source file. -*/ class SourceFile: public FileTarget { -private: +protected: const Component *comp; - StringList includes; -public: - SourceFile(Builder &, const Msp::FS::Path &); - SourceFile(Builder &, const Component &, const Msp::FS::Path &); + SourceFile(Builder &, const Component *, const Msp::FS::Path &); - virtual const char *get_type() const { return "SourceFile"; } - const StringList &get_includes() const { return includes; } +public: const Component *get_component() const { return comp; } - virtual void find_depends(); }; #endif diff --git a/source/virtualfilesystem.cpp b/source/virtualfilesystem.cpp index 76c05d9..be646cd 100644 --- a/source/virtualfilesystem.cpp +++ b/source/virtualfilesystem.cpp @@ -2,9 +2,9 @@ #include #include #include "builder.h" +#include "csourcefile.h" #include "misc.h" #include "sharedlibrary.h" -#include "sourcefile.h" #include "systemlibrary.h" #include "virtualfilesystem.h" @@ -150,7 +150,7 @@ FileTarget *VirtualFileSystem::get_header(const FS::Path &fn) if(FS::is_reg(fn)) { - tgt = new SourceFile(builder, fn); + tgt = new CSourceFile(builder, fn); return tgt; } return 0;