Merge "Add command line parser for simulator"

am: 7965a95adc

Change-Id: Ifa759b9f07a671ad509b0847c30bda4c17edac6c
This commit is contained in:
Tianjie Xu
2019-07-17 10:44:25 -07:00
committed by android-build-merger
3 changed files with 97 additions and 10 deletions
+9
View File
@@ -51,9 +51,18 @@ class BuildInfo {
// Parses the given target-file, initializes the build properties and extracts the images. // Parses the given target-file, initializes the build properties and extracts the images.
bool ParseTargetFile(const std::string_view target_file_path, bool extracted_input); bool ParseTargetFile(const std::string_view target_file_path, bool extracted_input);
std::string GetOemSettings() const {
return oem_settings_;
}
void SetOemSettings(const std::string_view oem_settings) {
oem_settings_ = oem_settings;
}
private: private:
// A map to store the system properties during simulation. // A map to store the system properties during simulation.
std::map<std::string, std::string, std::less<>> build_props_; std::map<std::string, std::string, std::less<>> build_props_;
// A file that contains the oem properties.
std::string oem_settings_;
// A map from the blockdev_name to the FakeBlockDevice object, which contains the path to the // A map from the blockdev_name to the FakeBlockDevice object, which contains the path to the
// temporary file. // temporary file.
std::map<std::string, FakeBlockDevice, std::less<>> blockdev_map_; std::map<std::string, FakeBlockDevice, std::less<>> blockdev_map_;
+5 -1
View File
@@ -87,7 +87,11 @@ int SimulatorRuntime::WipeBlockDevice(const std::string_view filename, size_t /*
} }
bool SimulatorRuntime::ReadFileToString(const std::string_view filename, bool SimulatorRuntime::ReadFileToString(const std::string_view filename,
std::string* /* content */) const { std::string* content) const {
if (android::base::EndsWith(filename, "oem.prop")) {
return android::base::ReadFileToString(source_->GetOemSettings(), content);
}
LOG(INFO) << "SKip reading filename " << filename; LOG(INFO) << "SKip reading filename " << filename;
return true; return true;
} }
+83 -9
View File
@@ -14,11 +14,18 @@
* limitations under the License. * limitations under the License.
*/ */
#include <getopt.h>
#include <stdlib.h>
#include <unistd.h>
#include <string> #include <string>
#include <string_view>
#include <android-base/file.h> #include <android-base/file.h>
#include <android-base/logging.h> #include <android-base/logging.h>
#include <android-base/strings.h>
#include "edify/expr.h"
#include "otautil/error_code.h" #include "otautil/error_code.h"
#include "otautil/paths.h" #include "otautil/paths.h"
#include "updater/blockimg.h" #include "updater/blockimg.h"
@@ -28,21 +35,67 @@
#include "updater/simulator_runtime.h" #include "updater/simulator_runtime.h"
#include "updater/updater.h" #include "updater/updater.h"
using namespace std::string_literals;
void Usage(std::string_view name) {
LOG(INFO) << "Usage: " << name << "[--oem_settings <oem_property_file>]"
<< "[--skip_functions <skip_function_file>]"
<< " --source <source_target_file>"
<< " --ota_package <ota_package>";
}
Value* SimulatorPlaceHolderFn(const char* name, State* /* state */,
const std::vector<std::unique_ptr<Expr>>& /* argv */) {
LOG(INFO) << "Skip function " << name << " in host simulation";
return StringValue("t");
}
int main(int argc, char** argv) { int main(int argc, char** argv) {
// Write the logs to stdout. // Write the logs to stdout.
android::base::InitLogging(argv, &android::base::StderrLogger); android::base::InitLogging(argv, &android::base::StderrLogger);
if (argc != 3 && argc != 4) { std::string oem_settings;
LOG(ERROR) << "unexpected number of arguments: " << argc << std::endl std::string skip_function_file;
<< "Usage: " << argv[0] << " <source_target-file> <ota_package>"; std::string source_target_file;
return EXIT_FAILURE; std::string package_name;
constexpr struct option OPTIONS[] = {
{ "oem_settings", required_argument, nullptr, 0 },
{ "ota_package", required_argument, nullptr, 0 },
{ "skip_functions", required_argument, nullptr, 0 },
{ "source", required_argument, nullptr, 0 },
{ nullptr, 0, nullptr, 0 },
};
int arg;
int option_index;
while ((arg = getopt_long(argc, argv, "", OPTIONS, &option_index)) != -1) {
if (arg != 0) {
LOG(ERROR) << "Invalid command argument";
Usage(argv[0]);
return EXIT_FAILURE;
}
auto option_name = OPTIONS[option_index].name;
// The same oem property file used during OTA generation. It's needed for file_getprop() to
// return the correct value for the source build.
if (option_name == "oem_settings"s) {
oem_settings = optarg;
} else if (option_name == "skip_functions"s) {
skip_function_file = optarg;
} else if (option_name == "source"s) {
source_target_file = optarg;
} else if (option_name == "ota_package"s) {
package_name = optarg;
} else {
Usage(argv[0]);
return EXIT_FAILURE;
}
} }
// TODO(xunchang) implement a commandline parser, e.g. it can take an oem property so that the if (source_target_file.empty() || package_name.empty()) {
// file_getprop() will return correct value. Usage(argv[0]);
return EXIT_FAILURE;
std::string source_target_file = argv[1]; }
std::string package_name = argv[2];
// Configure edify's functions. // Configure edify's functions.
RegisterBuiltins(); RegisterBuiltins();
@@ -50,6 +103,22 @@ int main(int argc, char** argv) {
RegisterBlockImageFunctions(); RegisterBlockImageFunctions();
RegisterDynamicPartitionsFunctions(); RegisterDynamicPartitionsFunctions();
if (!skip_function_file.empty()) {
std::string content;
if (!android::base::ReadFileToString(skip_function_file, &content)) {
PLOG(ERROR) << "Failed to read " << skip_function_file;
return EXIT_FAILURE;
}
auto lines = android::base::Split(content, "\n");
for (const auto& line : lines) {
if (line.empty() || android::base::StartsWith(line, "#")) {
continue;
}
RegisterFunction(line, SimulatorPlaceHolderFn);
}
}
TemporaryFile temp_saved_source; TemporaryFile temp_saved_source;
TemporaryFile temp_last_command; TemporaryFile temp_last_command;
TemporaryDir temp_stash_base; TemporaryDir temp_stash_base;
@@ -67,6 +136,11 @@ int main(int argc, char** argv) {
return EXIT_FAILURE; return EXIT_FAILURE;
} }
if (!oem_settings.empty()) {
CHECK_EQ(0, access(oem_settings.c_str(), R_OK));
source_build_info.SetOemSettings(oem_settings);
}
Updater updater(std::make_unique<SimulatorRuntime>(&source_build_info)); Updater updater(std::make_unique<SimulatorRuntime>(&source_build_info));
if (!updater.Init(cmd_pipe.release(), package_name, false)) { if (!updater.Init(cmd_pipe.release(), package_name, false)) {
return EXIT_FAILURE; return EXIT_FAILURE;