}
}
-void LoadPartitionPathVariables() {
- LoadVariableFromPartitionPath("PRODUCT", "/product");
- LoadVariableFromPartitionPath("SYSTEM_EXT", "/system_ext");
+void LoadPartitionPathVariables(const std::string& root) {
+ // TODO(b/141714913): generalize path handling
+ LoadVariableFromPartitionPath("PRODUCT", root + "/product");
+ LoadVariableFromPartitionPath("SYSTEM_EXT", root + "/system_ext");
}
-void LoadLibraryListVariables() {
- auto private_library_path =
- "/system/etc/vndkprivate.libraries." + GetVendorVndkVersion() + ".txt";
+void LoadLibraryListVariables(const std::string& root) {
+ auto private_library_path = root + "/system/etc/vndkprivate.libraries." +
+ GetVendorVndkVersion() + ".txt";
auto llndk_library_path =
- "/system/etc/llndk.libraries." + GetVendorVndkVersion() + ".txt";
+ root + "/system/etc/llndk.libraries." + GetVendorVndkVersion() + ".txt";
auto vndksp_library_path =
- "/system/etc/vndksp.libraries." + GetVendorVndkVersion() + ".txt";
- auto vndkcore_library_path =
- "/system/etc/vndkcore.libraries." + GetVendorVndkVersion() + ".txt";
- auto sanitizer_library_path = "/system/etc/sanitizer.libraries.txt";
+ root + "/system/etc/vndksp.libraries." + GetVendorVndkVersion() + ".txt";
+ auto vndkcore_library_path = root + "/system/etc/vndkcore.libraries." +
+ GetVendorVndkVersion() + ".txt";
+ auto sanitizer_library_path = root + "/system/etc/sanitizer.libraries.txt";
Variables::AddValue(
"LLNDK_LIBRARIES",
namespace android {
namespace linkerconfig {
namespace generator {
-void LoadVariables() {
+
+void LoadVariables(const std::string& root) {
LoadVndkVersionVariable();
- LoadPartitionPathVariables();
- LoadLibraryListVariables();
+ LoadPartitionPathVariables(root);
+ LoadLibraryListVariables(root);
}
+
} // namespace generator
} // namespace linkerconfig
-} // namespace android
\ No newline at end of file
+} // namespace android
#include "linkerconfig/baseconfig.h"
#include "linkerconfig/log.h"
#include "linkerconfig/variableloader.h"
+#include "linkerconfig/variables.h"
namespace {
const static struct option program_options[] = {
{"target", required_argument, 0, 't'},
+#ifndef __ANROID__
+ {"root", required_argument, 0, 'r'},
+ {"vndk", required_argument, 0, 'v'},
+#endif
{"help", no_argument, 0, 'h'},
{0, 0, 0, 0}};
struct ProgramArgs {
std::string target_file;
+ std::string root;
+ std::string vndk_version;
};
[[noreturn]] void PrintUsage(int status = EXIT_SUCCESS) {
- std::cerr << "Usage : linkerconfig [--target <target_file>] [--help]"
+ std::cerr << "Usage : linkerconfig [--target <target_file>]"
+#ifndef __ANDROID__
+ " --root <root dir>"
+ " --vndk <vndk version>"
+#endif
+ " [--help]"
<< std::endl;
exit(status);
}
bool ParseArgs(int argc, char* argv[], ProgramArgs* args) {
int parse_result;
- while ((parse_result =
- getopt_long(argc, argv, "th:", program_options, NULL)) != -1) {
+ while ((parse_result = getopt_long(
+ argc, argv, "t:r:v:h", program_options, NULL)) != -1) {
switch (parse_result) {
case 't':
args->target_file = optarg;
break;
+ case 'r':
+ args->root = optarg;
+ break;
+ case 'v':
+ args->vndk_version = optarg;
+ break;
case 'h':
PrintUsage();
default:
return android::linkerconfig::contents::CreateBaseConfiguration();
}
+#ifdef __ANDROID__
struct CombinedLogger {
android::base::LogdLogger logd;
KernelLogger(id, severity, tag, file, line, message);
}
};
+#endif
} // namespace
int main(int argc, char* argv[]) {
- android::base::InitLogging(argv, CombinedLogger());
+ android::base::InitLogging(argv
+#ifdef __ANDROID__
+ ,
+ CombinedLogger()
+#endif
+ );
ProgramArgs args;
out = &file_out;
}
- android::linkerconfig::generator::LoadVariables();
+#ifndef __ANDROID__
+ if (args.root == "" || args.vndk_version == "") {
+ PrintUsage();
+ }
+ android::linkerconfig::modules::Variables::AddValue("ro.vndk.version",
+ args.vndk_version);
+#endif
+
+ android::linkerconfig::generator::LoadVariables(args.root);
auto config = GetConfiguration();
android::linkerconfig::modules::ConfigWriter config_writer;