#include <msp/strings/lexicalcast.h>
#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"
{
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)
--- /dev/null
+#include <msp/core/maputils.h>
+#include <msp/fs/utils.h>
+#include <msp/io/print.h>
+#include <msp/strings/regex.h>
+#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<deps_cache.get_mtime())
+ {
+ try
+ {
+ includes = deps_cache.get_deps(relname);
+ deps_found = true;
+ }
+ catch(const key_error &)
+ { }
+ }
+
+ if(!deps_found)
+ {
+ try
+ {
+ IO::BufferedFile in(path.str());
+
+ if(builder.get_verbose()>=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<string>::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;
+}
--- /dev/null
+#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
+#include "csourcefile.h"
#include "gnuccompiler.h"
using namespace std;
{
input_suffixes.push_back(".c");
}
+
+Target *GnuCCompiler::create_source(const Component &comp, const FS::Path &path) const
+{
+ return new CSourceFile(builder, comp, path);
+}
public:
GnuCCompiler(Builder &);
+ virtual Target *create_source(const Component &, const Msp::FS::Path &) const;
};
#endif
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<Target *> &sources, const std::string &) const
{
if(sources.size()!=1)
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<Target *> &, const std::string &) const;
virtual Task *run(const Target &) const;
};
+#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);
+}
{
public:
GnuCxxCompiler(Builder &);
+
+ virtual Target *create_source(const Component &, const Msp::FS::Path &) const;
};
#endif
-#include <msp/core/maputils.h>
-#include <msp/fs/utils.h>
-#include <msp/io/print.h>
-#include <msp/strings/regex.h>
-#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<deps_cache.get_mtime())
- {
- try
- {
- includes = deps_cache.get_deps(relname);
- deps_found = true;
- }
- catch(const key_error &)
- { }
- }
-
- if(!deps_found)
- {
- try
- {
- IO::BufferedFile in(path.str());
-
- if(builder.get_verbose()>=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<string>::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;
-}
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
#include <msp/io/print.h>
#include <msp/strings/utils.h>
#include "builder.h"
+#include "csourcefile.h"
#include "misc.h"
#include "sharedlibrary.h"
-#include "sourcefile.h"
#include "systemlibrary.h"
#include "virtualfilesystem.h"
if(FS::is_reg(fn))
{
- tgt = new SourceFile(builder, fn);
+ tgt = new CSourceFile(builder, fn);
return tgt;
}
return 0;