add options to command
This commit is contained in:
parent
4382ad6d59
commit
98b44ec923
103
main.cpp
103
main.cpp
@ -280,37 +280,118 @@ InputExtractor::List InputExtractor::operator()(const Path::Path &file, const Me
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Config {
|
||||||
|
std::string targetName;
|
||||||
|
Path::Path outfilePath;
|
||||||
|
bool outfileOverride;
|
||||||
|
} config ;
|
||||||
|
|
||||||
|
std::ostream &writeTarget(std::ostream &stream, const std::string &target_name) {
|
||||||
|
stream << target_name << ":";
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream &writeTargetDepends(std::ostream &stream, const Path::Path &path) {
|
||||||
|
stream << path << "\\\n";
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
int openOutfile(std::ofstream &stream) {
|
||||||
|
cout << "writing dependency rules to " << config.outfilePath << endl;
|
||||||
|
|
||||||
|
stream.close();
|
||||||
|
stream.open(config.outfilePath);
|
||||||
|
|
||||||
|
if (!stream) {
|
||||||
|
cerr << "could not write to " << config.outfilePath << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!config.targetName.empty()) {
|
||||||
|
writeTarget(stream, config.targetName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <getopt.h>
|
||||||
|
|
||||||
|
struct option long_opts[] = {
|
||||||
|
{"output", required_argument, NULL, 'o'},
|
||||||
|
{"target", required_argument, NULL, 't'},
|
||||||
|
{}, // terminator
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void help(int argc, char ** args) {
|
||||||
|
cout << args[0] << " [-o output] files..." << endl;
|
||||||
|
cout << "--output" << endl;
|
||||||
|
cout << "-o\tby default the program will create a depfile for every input" << endl;
|
||||||
|
cout << "\tnaming it like the tex file with a .d extension. By giving the -o Option" << endl;
|
||||||
|
cout << "\tthe output fill instead be put in this file exclusivly" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char ** args) {
|
int main(int argc, char ** args) {
|
||||||
// find all the files the given tex files depend on
|
// find all the files the given tex files depend on
|
||||||
int fd = 0;
|
int fd = 0;
|
||||||
struct stat filestat;
|
struct stat filestat;
|
||||||
|
|
||||||
|
int long_index = 0;
|
||||||
|
int opt = 0;
|
||||||
|
while((opt = getopt_long(argc, args, "o:t:", long_opts, &long_index)) != -1) {
|
||||||
|
switch(opt) {
|
||||||
|
case 'o':
|
||||||
|
config.outfilePath = optarg;
|
||||||
|
config.outfileOverride = true;
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
config.targetName = optarg;
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
help(argc, args);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for(;argc > 1; --argc) {
|
std::ofstream outfile;
|
||||||
|
|
||||||
Path::Path filename = args[argc-1];
|
if (!config.outfilePath.empty() && !openOutfile(outfile)) {
|
||||||
|
return -1; // failed to open outfile
|
||||||
|
}
|
||||||
|
|
||||||
|
// scan remaining arguments as input filenames
|
||||||
|
for(; optind < argc; optind++) {
|
||||||
|
Path::Path filename = args[optind];
|
||||||
InputExtractor parser;
|
InputExtractor parser;
|
||||||
|
|
||||||
|
// parse file
|
||||||
InputExtractor::List list = parser.Include(filename);
|
InputExtractor::List list = parser.Include(filename);
|
||||||
|
|
||||||
// output results in makefile rule style
|
// output results in makefile rule style
|
||||||
|
|
||||||
Path::Path outfile_name = Path::Basename(filename) + ".d";
|
// check for open outfile
|
||||||
cout << "writing dependecy rules to " << outfile_name << "...";
|
if (!config.outfileOverride) {
|
||||||
|
config.outfilePath = Path::Basename(filename) + ".d";
|
||||||
|
|
||||||
std::ofstream outfile(outfile_name);
|
if (!openOutfile(outfile)) {
|
||||||
|
continue; // just skip this file
|
||||||
if (!outfile) {
|
}
|
||||||
cout << "could not create file!" << endl;
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
outfile << filename << ":";
|
// check for target override
|
||||||
|
if (config.targetName.empty()) {
|
||||||
|
config.targetName = filename;
|
||||||
|
}
|
||||||
|
|
||||||
for (auto it = list.begin(); it != list.end(); it++) {
|
for (auto it = list.begin(); it != list.end(); it++) {
|
||||||
outfile << *it << "\t\\\n";
|
writeTargetDepends(outfile, *it);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add newline for cleanness
|
||||||
|
outfile << endl;
|
||||||
|
|
||||||
cout << "done" << endl;
|
cout << "done" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user