Merge "AAPT2: Accept a file with arguments when argument list is too long" into nyc-dev am: 28d6c1e493

am: 461be97e30

* commit '461be97e3007d20cc9f494c24aade1302435ae5d':
  AAPT2: Accept a file with arguments when argument list is too long

Change-Id: I7d2bf40c59e06056e46808c8a9d7c7ca97467381
This commit is contained in:
Adam Lesinski
2016-04-28 19:46:42 +00:00
committed by android-build-merger
3 changed files with 40 additions and 1 deletions

View File

@ -1459,6 +1459,21 @@ int link(const std::vector<StringPiece>& args) {
return 1; return 1;
} }
// Expand all argument-files passed into the command line. These start with '@'.
std::vector<std::string> argList;
for (const std::string& arg : flags.getArgs()) {
if (util::stringStartsWith<char>(arg, "@")) {
const std::string path = arg.substr(1, arg.size() - 1);
std::string error;
if (!file::appendArgsFromFile(path, &argList, &error)) {
context.getDiagnostics()->error(DiagMessage(path) << error);
return 1;
}
} else {
argList.push_back(arg);
}
}
if (verbose) { if (verbose) {
context.setVerbose(verbose); context.setVerbose(verbose);
} }
@ -1568,7 +1583,7 @@ int link(const std::vector<StringPiece>& args) {
} }
LinkCommand cmd(&context, options); LinkCommand cmd(&context, options);
return cmd.run(flags.getArgs()); return cmd.run(argList);
} }
} // namespace aapt } // namespace aapt

View File

@ -18,6 +18,7 @@
#include "util/Util.h" #include "util/Util.h"
#include <algorithm> #include <algorithm>
#include <android-base/file.h>
#include <cerrno> #include <cerrno>
#include <cstdio> #include <cstdio>
#include <dirent.h> #include <dirent.h>
@ -190,6 +191,23 @@ Maybe<android::FileMap> mmapPath(const StringPiece& path, std::string* outError)
return std::move(fileMap); return std::move(fileMap);
} }
bool appendArgsFromFile(const StringPiece& path, std::vector<std::string>* outArgList,
std::string* outError) {
std::string contents;
if (!android::base::ReadFileToString(path.toString(), &contents)) {
if (outError) *outError = "failed to read argument-list file";
return false;
}
for (StringPiece line : util::tokenize<char>(contents, ' ')) {
line = util::trimWhitespace(line);
if (!line.empty()) {
outArgList->push_back(line.toString());
}
}
return true;
}
bool FileFilter::setPattern(const StringPiece& pattern) { bool FileFilter::setPattern(const StringPiece& pattern) {
mPatternTokens = util::splitAndLowercase(pattern, ':'); mPatternTokens = util::splitAndLowercase(pattern, ':');
return true; return true;

View File

@ -95,6 +95,12 @@ std::string packageToPath(const StringPiece& package);
*/ */
Maybe<android::FileMap> mmapPath(const StringPiece& path, std::string* outError); Maybe<android::FileMap> mmapPath(const StringPiece& path, std::string* outError);
/**
* Reads the file at path and appends each line to the outArgList vector.
*/
bool appendArgsFromFile(const StringPiece& path, std::vector<std::string>* outArgList,
std::string* outError);
/* /*
* Filter that determines which resource files/directories are * Filter that determines which resource files/directories are
* processed by AAPT. Takes a pattern string supplied by the user. * processed by AAPT. Takes a pattern string supplied by the user.