1 #ifndef CPPAD_CG_ABSTRACT_C_COMPILER_INCLUDED 2 #define CPPAD_CG_ABSTRACT_C_COMPILER_INCLUDED 32 std::string _tmpFolder;
33 std::string _sourcesFolder;
34 std::set<std::string> _ofiles;
35 std::set<std::string> _sfiles;
36 std::vector<std::string> _compileFlags;
37 std::vector<std::string> _compileLibFlags;
38 std::vector<std::string> _linkFlags;
40 bool _saveToDiskFirst;
45 _tmpFolder(
"cppadcg_tmp"),
46 _sourcesFolder(
"cppadcg_sources"),
48 _saveToDiskFirst(
false) {
54 std::string getCompilerPath()
const {
58 void setCompilerPath(
const std::string& path) {
67 _tmpFolder = tmpFolder;
70 bool isSaveToDiskFirst()
const override {
71 return _saveToDiskFirst;
74 void setSaveToDiskFirst(
bool saveToDiskFirst)
override {
75 _saveToDiskFirst = saveToDiskFirst;
79 return _sourcesFolder;
83 _sourcesFolder = srcFolder;
86 const std::set<std::string>& getObjectFiles()
const override {
90 const std::set<std::string>& getSourceFiles()
const override {
94 const std::vector<std::string>& getCompileFlags()
const {
98 void setCompileFlags(
const std::vector<std::string>& compileFlags) {
99 _compileFlags = compileFlags;
102 void addCompileFlag(
const std::string& compileFlag) {
103 _compileFlags.push_back(compileFlag);
106 const std::vector<std::string>& getLinkFlags()
const {
110 void setLinkFlags(
const std::vector<std::string>& linkFlags) {
111 _linkFlags = linkFlags;
114 void addLinkFlag(
const std::string& linkFlag) {
115 _linkFlags.push_back(linkFlag);
118 const std::vector<std::string>& getCompileLibFlags()
const {
119 return _compileLibFlags;
122 void setCompileLibFlags(
const std::vector<std::string>& compileLibFlags) {
123 _compileLibFlags = compileLibFlags;
126 void addCompileLibFlag(
const std::string& compileLibFlag) {
127 _compileLibFlags.push_back(compileLibFlag);
130 bool isVerbose()
const override {
134 void setVerbose(
bool verbose)
override {
148 JobTimer* timer =
nullptr)
override {
152 virtual void compileSources(
const std::map<std::string, std::string>& sources,
155 const std::string& outputExtension,
156 std::set<std::string>& outputFiles) {
157 using namespace std::chrono;
166 std::map<std::string, std::string>::const_iterator it;
167 for (it = sources.begin(); it != sources.end(); ++it) {
168 _sfiles.insert(it->first);
170 maxsize = std::max<size_t>(maxsize, file.size());
173 size_t countWidth = std::ceil(std::log10(sources.size()));
176 if (timer !=
nullptr) {
179 if (timer->getMaxLineWidth() < ms)
180 timer->setMaxLineWidth(ms);
181 }
else if (_verbose) {
182 std::cout << std::endl;
185 std::ostringstream os;
187 if (_saveToDiskFirst) {
192 for (it = sources.begin(); it != sources.end(); ++it) {
195 outputFiles.insert(file);
197 steady_clock::time_point beginTime;
199 if (timer !=
nullptr || _verbose) {
200 os <<
"[" << std::setw(countWidth) << std::setfill(
' ') << std::right << count
201 <<
"/" << sources.size() <<
"]";
204 if (timer !=
nullptr) {
207 }
else if (_verbose) {
208 beginTime = steady_clock::now();
209 char f = std::cout.fill();
210 std::cout << os.str() <<
" compiling " 211 << std::setw(maxsize + 9) << std::setfill(
'.') << std::left
212 << (
"'" + file +
"' ") <<
" ";
218 if (_saveToDiskFirst) {
220 std::ofstream sourceFile;
222 sourceFile.open(srcfile.c_str());
223 sourceFile << it->second;
233 if (timer !=
nullptr) {
234 timer->finishedJob();
235 }
else if (_verbose) {
236 steady_clock::time_point endTime = steady_clock::now();
237 duration<float> dt = endTime - beginTime;
238 std::cout <<
"done [" << std::fixed << std::setprecision(3)
239 << dt.count() <<
"]" << std::endl;
252 JobTimer* timer =
nullptr)
override = 0;
256 for (
const std::string& it : _ofiles) {
257 if (
remove(it.c_str()) != 0)
258 std::cerr <<
"Failed to delete temporary file '" << it <<
"'" << std::endl;
263 remove(this->_tmpFolder.c_str());
279 const std::string& output,
280 bool posIndepCode) = 0;
289 const std::string& output,
290 bool posIndepCode) = 0;
void setSourcesFolder(const std::string &srcFolder) override
void compileSources(const std::map< std::string, std::string > &sources, bool posIndepCode, JobTimer *timer=nullptr) override
std::string createPath(const std::string &baseFolder, const std::string &file)
virtual void compileFile(const std::string &path, const std::string &output, bool posIndepCode)=0
virtual void compileSource(const std::string &source, const std::string &output, bool posIndepCode)=0
virtual void buildDynamic(const std::string &library, JobTimer *timer=nullptr) override=0
size_t getJobCount() const
const std::string & getSourcesFolder() const override
const std::string & getTemporaryFolder() const override
void createFolder(const std::string &folder)
void setTemporaryFolder(const std::string &tmpFolder) override