* limitations under the License.
*/
-#include "common.h"
+#include "ni_common.h"
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
-std::vector<const char*> get_cmd_args(char** begin, char** end)
+std::vector<std::string> getCmdArgs(char** begin, char** end)
{
- for (char** itr = end-1; itr != begin-1; --itr)
- {
- if (itr != end && strncmp(*itr, "--", 2) == 0)
- {
- itr++;
- int len = end - itr;
- return std::vector<const char*>(len, *itr);
- }
- }
- return std::vector<const char*>(end-begin-1, *(begin+1));
+ std::vector<std::string> list;
+ for (char** itr = begin+1; itr != end; itr++) {
+ if (strncmp(*itr, "--", 2) != 0)
+ list.push_back(*itr);
+ }
+ return list;
}
-bool cmd_option_exists(char** begin, char** end, const std::string& option)
+bool cmdOptionExists(char** begin, char** end, const std::string& option)
{
- return std::find(begin, end, option) != end;
+ return std::find(begin, end, option) != end;
}
static void help(const char *argv0)
{
- const char* helpdesc =
- "Usage: %s [args] <root paths or pkg name>\n"
- " --help - Display this screen\n"
- " --system - Create NI under System DLLs\n"
- " --dll - Create NI for DLL\n"
- " --pkg - Create NI for package\n"
- "\n"
- "Example:\n"
- "Create native image for dlls and exes under platform directories\n"
- "%s --system\n"
- "Create native image for dll\n"
- "%s --dll /usr/bin/Tizen.Runtime.Coreclr.dll\n"
- "Create native image under the package's bin and lib directory\n"
- "%s --pkg org.tizen.FormsGallery\n\n";
- printf(helpdesc, argv0, argv0, argv0, argv0);
+ const char* helpDesc =
+ "Usage: %s [args] <root paths or pkg name>\n"
+ " --help - Display this screen\n"
+ " --system - Create NI under System DLLs\n"
+ " --dll - Create NI for DLL\n"
+ " --pkg - Create NI for package\n"
+ " --dir - Create NI for directory\n"
+ " --r2r - Use ready-to-run option (default: FNV)\n"
+ " (This option should be used with other options)\n"
+ " --reset-system - Remove System NI files\n"
+ " --reset-pkg - Remove App NI files\n"
+ " --regen-all-app - Re-generate All App NI files\n"
+ "\n"
+ "Example:\n"
+ "1. Create native image for dlls and exes under platform directories\n"
+ " # %s --system\n"
+ "2. Create native image for dll\n"
+ " # %s --dll /usr/bin/Tizen.Runtime.dll\n"
+ "3. Create native image under the package's bin and lib directory\n"
+ " # %s --pkg org.tizen.FormsGallery\n"
+ "4. Regenerate native images for all installed .net packages with ready-to-run option\n"
+ " # %s --r2r --regen-all-app\n\n";
+ printf(helpDesc, argv0, argv0, argv0, argv0, argv0);
}
int main(int argc, char* argv[])
{
- bool pkg_mode = false;
- bool dll_mode = false;
+ bool pkgMode = false;
+ bool dllMode = false;
+ bool dirMode = false;
+ bool rmPkgMode = false;
+ bool enableR2R = false;
+ bool pkgDllMode = false;
- if (cmd_option_exists(argv, argv+argc, "--help"))
- {
- help(argv[0]);
- return 0;
- }
+ NiCommonOption option = {std::string(), std::string(), std::string()};
+ if (initNICommon(&option) != NI_ERROR_NONE) {
+ fprintf(stderr, "Fail to initialize NI Common\n");
+ return -1;
+ }
- if (cmd_option_exists(argv, argv+argc, "--system"))
- {
- create_ni_platform();
- return 0;
- }
+ if (cmdOptionExists(argv, argv+argc, "--r2r")) {
+ enableR2R = true;
+ }
- if (cmd_option_exists(argv, argv+argc, "--dll"))
- {
- dll_mode = true;
- }
+ if (cmdOptionExists(argv, argv+argc, "--help")) {
+ help(argv[0]);
+ return 0;
+ } else if (cmdOptionExists(argv, argv+argc, "--system")) {
+ createNiPlatform(enableR2R);
+ return 0;
+ } else if (cmdOptionExists(argv, argv+argc, "--dll")) {
+ dllMode = true;
+ } else if (cmdOptionExists(argv, argv+argc, "--pkg")) {
+ pkgMode = true;
+ } else if (cmdOptionExists(argv, argv+argc, "--dir")) {
+ dirMode = true;
+ } else if (cmdOptionExists(argv, argv+argc, "--reset-system")) {
+ removeNiPlatform();
+ return 0;
+ } else if (cmdOptionExists(argv, argv+argc, "--reset-pkg")) {
+ rmPkgMode = true;
+ } else if (cmdOptionExists(argv, argv+argc, "--regen-all-app")) {
+ regenerateAppNI(enableR2R);
+ return 0;
+ } else if (cmdOptionExists(argv, argv+argc, "--pkg-dll")) {
+ pkgDllMode = true;
+ } else {
+ help(argv[0]);
+ return 0;
+ }
- if (cmd_option_exists(argv, argv+argc, "--pkg"))
- {
- pkg_mode = true;
- }
+ std::vector<std::string> args = getCmdArgs(argv, argv+argc);
- std::vector<const char*> args = get_cmd_args(argv, argv+argc);
+ if (args.size() < 1) {
+ if (pkgMode)
+ fprintf(stderr, "Package name is missed\n");
+ else if (dllMode)
+ fprintf(stderr, "DLL path is missed\n");
+ help(argv[0]);
+ return 1;
+ }
- if (args.size() < 1)
- {
- if (pkg_mode)
- fprintf(stderr, "Package name is missed\n");
- else if (dll_mode)
- fprintf(stderr, "DLL path is missed\n");
- help(argv[0]);
- return 1;
- }
+ if (pkgMode) {
+ for (const std::string pkg : args) {
+ // if there is AOTed dlls under package root, that is skiped.
+ int ret = createNiUnderPkgRoot(pkg, enableR2R);
+ if (ret == NI_ERROR_INVALID_PACKAGE) {
+ fprintf(stderr, "Failed to get root path from [%s]\n", pkg.c_str());
+ return -1;
+ } else if (ret != NI_ERROR_NONE) {
+ fprintf(stderr, "Failed to generate NI file [%s]\n", args[1].c_str());
+ return -1;
+ }
+ }
+ } else if (pkgDllMode) {
+ int ret = createNiDllUnderPkgRoot(args[0], args[1], enableR2R);
+ if (ret == NI_ERROR_INVALID_PACKAGE) {
+ fprintf(stderr, "Failed to get root path from [%s]\n", args[0].c_str());
+ return -1;
+ } else if (ret == NI_ERROR_ALREADY_EXIST) {
+ // skip for already exist case
+ return -1;
+ } else if (ret != NI_ERROR_NONE) {
+ fprintf(stderr, "Failed to generate NI file [%s]\n", args[1].c_str());
+ return -1;
+ }
+ } else if (rmPkgMode) {
+ for (const std::string pkg : args) {
+ int ret = removeNiUnderPkgRoot(pkg);
+ if (ret == NI_ERROR_INVALID_PACKAGE) {
+ fprintf(stderr, "Failed to get root path from [%s]\n", pkg.c_str());
+ return -1;
+ } else if (ret != NI_ERROR_NONE) {
+ fprintf(stderr, "Failed to remove dlls for given package [%s]\n", pkg.c_str());
+ return -1;
+ }
+ }
+ } else if (dllMode) {
+ // donot return error code for generation failure.
+ // we have to run crossgen for all input dlls.
+ for (const std::string dll : args) {
+ int ret = createNiDll(dll, enableR2R);
+ if (ret == NI_ERROR_ALREADY_EXIST) {
+ // skip for already exist case
+ } else if (ret != NI_ERROR_NONE) {
+ fprintf(stderr, "Failed to generate NI file [%s]\n", dll.c_str());
+ }
+ }
+ } else if (dirMode) {
+ createNiUnderDirs(args.data(), args.size(), enableR2R);
+ }
- if (pkg_mode)
- {
- for (const char* pkg : args)
- {
- if (create_ni_under_pkg_root(pkg) != 0)
- {
- fprintf(stderr, "Failed to get root path from [%s]\n", pkg);
- return 1;
- }
- }
- }
- else if (dll_mode)
- {
- for (const char* dll : args)
- {
- create_ni_select(dll);
- }
- }
- else
- {
- create_ni_under_dirs(args.data(), args.size());
- }
-
- return 0;
+ return 0;
}