Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2d4d1b96 authored by Tianjie Xu's avatar Tianjie Xu Committed by android-build-merger
Browse files

Merge "Add command line parser for simulator" am: 7965a95a am: 94bc9e10

am: 7aa310c3

Change-Id: Id76e5c7d5db3c35402bd1ec3facf0748a90e184f
parents 40f08bfc 7aa310c3
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -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
Original line number Original line Diff line number Diff line
@@ -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
Original line number Original line Diff line number Diff line
@@ -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;
  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;
      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;