Compare commits

...

4 Commits
0.4.1 ... main

Author SHA1 Message Date
tastytea e4531464b5
Merge branch 'develop' into main
continuous-integration/drone/push Build is passing Details
* Use regex to extract compiler arguments.
* Added --compiler.
2019-10-11 13:25:52 +02:00
tastytea c9e38fa636
Add --compiler, to override compiler command.
continuous-integration/drone/push Build is passing Details
2019-10-10 22:52:51 +02:00
tastytea 5430c2de39
Use regex to find compiler arguments.
continuous-integration/drone/push Build is passing Details
2019-10-10 22:01:36 +02:00
tastytea 6fb459467a
Make NOLINT more precise. 2019-10-10 22:00:22 +02:00
2 changed files with 37 additions and 16 deletions

View File

@ -2,7 +2,7 @@
:doctype: manpage
:Author: tastytea
:Email: tastytea@tastytea.de
:Date: 2019-10-01
:Date: 2019-10-10
:Revision: 0.0.0
:man source: compilescript
:man version: {revision}
@ -40,6 +40,9 @@ The compiler invocation looks like this: <configured compiler> <source file>
Delete old cache files. You can configure the timespan after which a file is
considered old with the config option _clean_after_hours_.
*--compiler* _command_::
Override compiler command. Note that *--compiler*=_command_ does NOT work.
*--version*::
Print version, copyright and license.

View File

@ -25,6 +25,7 @@
#include <experimental/filesystem>
#include <fstream>
#include <iostream>
#include <regex>
#include <string>
#include <system_error>
#include <vector>
@ -59,6 +60,8 @@ public:
void run(const string &filename, char *argv[]);
//! Print version, copyright and license.
void print_version();
//! Set compiler command.
void set_compiler(const string &command);
};
Compilescript::Compilescript()
@ -171,18 +174,11 @@ string Compilescript::compile(const string &filename)
}
std::getline(in, buf);
if (buf.substr(0, 17) == "// compilescript:")
const std::regex re("^(//|#|;) ?compilescript:");
std::smatch match;
if (std::regex_search(buf, match, re))
{
compiler_arguments = buf.substr(17);
}
else if (buf.substr(0, 16) == "//compilescript:")
{
compiler_arguments = buf.substr(16);
}
else if ((buf.substr(0, 15) == "#compilescript:") ||
(buf.substr(0, 15) == ";compilescript:"))
{
compiler_arguments = buf.substr(15);
compiler_arguments = match.suffix();
}
else
{
@ -212,7 +208,7 @@ string Compilescript::compile(const string &filename)
const string command = _compiler + " " + source.string() + " "
+ compiler_arguments + " -o " + binary.string();
int ret = std::system(command.c_str()); // NOLINT Doesn't apply here.
int ret = std::system(command.c_str()); // NOLINT(cert-env33-c)
if (ret != 0)
{
throw std::runtime_error("Compilation failed.");
@ -224,7 +220,7 @@ string Compilescript::compile(const string &filename)
void Compilescript::run(const string &filename, char *argv[])
{
execvp(filename.c_str(), &argv[1]); // NOLINT We know that argv[1] exists.
execvp(filename.c_str(), argv);
}
void Compilescript::print_version()
@ -237,6 +233,11 @@ void Compilescript::print_version()
"\nand you are welcome to redistribute it under certain conditions.\n";
}
void Compilescript::set_compiler(const string &command)
{
_compiler = command;
}
int main(int argc, char *argv[])
{
const vector<string> args(argv, argv + argc);
@ -249,7 +250,8 @@ int main(int argc, char *argv[])
if (args.size() <= 1)
{
cerr << "usage: " << args[0]
<< " [file|--cleanup|--version] [arguments]\n";
<< " [file|--cleanup|--version|--compiler command] "
<< "[arguments]\n";
return 1;
}
if (args[1] == "--cleanup")
@ -262,9 +264,25 @@ int main(int argc, char *argv[])
App.print_version();
return 0;
}
if (args[1] == "--compiler")
{
if (args.size() <= 3)
{
cerr << "Error: You need to specify a command.\n";
return 1;
}
App.set_compiler(args[2]);
const string binary = App.compile(args[3]);
// We know that argv[3] exists.
// NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
App.run(binary, &argv[3]);
return 0;
}
const string binary = App.compile(args[1]);
App.run(binary, argv);
// We know that argv[1] exists.
// NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
App.run(binary, &argv[1]);
}
catch (const std::exception &e)
{