2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "ni_common.h"
25 std::vector<std::string> getCmdArgs(char** begin, char** end)
27 std::vector<std::string> list;
28 for (char** itr = begin+1; itr != end; itr++) {
29 if (strncmp(*itr, "--", 2) != 0)
35 bool cmdOptionExists(char** begin, char** end, const std::string& option)
37 return std::find(begin, end, option) != end;
40 static void help(const char *argv0)
42 const char* helpDesc =
43 "Usage: %s [args] <root paths or pkg name>\n"
44 " --help - Display this screen\n"
45 " --system - Create NI under System DLLs\n"
46 " --dll - Create NI for DLL\n"
47 " --pkg - Create NI for package\n"
48 " --dir - Create NI for directory\n"
49 " --r2r - Use ready-to-run option (default: FNV)\n"
50 " (This option should be used with other options)\n"
51 " --reset-system - Remove System NI files\n"
52 " --reset-pkg - Remove App NI files\n"
53 " --regen-all-app - Re-generate All App NI files\n"
56 "1. Create native image for dlls and exes under platform directories\n"
58 "2. Create native image for dll\n"
59 " # %s --dll /usr/bin/Tizen.Runtime.dll\n"
60 "3. Create native image under the package's bin and lib directory\n"
61 " # %s --pkg org.tizen.FormsGallery\n"
62 "4. Regenerate native images for all installed .net packages with ready-to-run option\n"
63 " # %s --r2r --regen-all-app\n\n";
64 printf(helpDesc, argv0, argv0, argv0, argv0, argv0);
67 int main(int argc, char* argv[])
72 bool rmPkgMode = false;
73 bool enableR2R = false;
74 bool pkgDllMode = false;
76 NiCommonOption option = {std::string(), std::string(), std::string()};
77 if (initNICommon(&option) != NI_ERROR_NONE) {
78 fprintf(stderr, "Fail to initialize NI Common\n");
82 if (cmdOptionExists(argv, argv+argc, "--r2r")) {
86 if (cmdOptionExists(argv, argv+argc, "--help")) {
89 } else if (cmdOptionExists(argv, argv+argc, "--system")) {
90 createNiPlatform(enableR2R);
92 } else if (cmdOptionExists(argv, argv+argc, "--dll")) {
94 } else if (cmdOptionExists(argv, argv+argc, "--pkg")) {
96 } else if (cmdOptionExists(argv, argv+argc, "--dir")) {
98 } else if (cmdOptionExists(argv, argv+argc, "--reset-system")) {
101 } else if (cmdOptionExists(argv, argv+argc, "--reset-pkg")) {
103 } else if (cmdOptionExists(argv, argv+argc, "--regen-all-app")) {
104 regenerateAppNI(enableR2R);
106 } else if (cmdOptionExists(argv, argv+argc, "--pkg-dll")) {
113 std::vector<std::string> args = getCmdArgs(argv, argv+argc);
115 if (args.size() < 1) {
117 fprintf(stderr, "Package name is missed\n");
119 fprintf(stderr, "DLL path is missed\n");
125 for (const std::string pkg : args) {
126 // if there is AOTed dlls under package root, that is skiped.
127 int ret = createNiUnderPkgRoot(pkg, enableR2R);
128 if (ret == NI_ERROR_INVALID_PACKAGE) {
129 fprintf(stderr, "Failed to get root path from [%s]\n", pkg.c_str());
131 } else if (ret != NI_ERROR_NONE) {
132 fprintf(stderr, "Failed to generate NI file [%s]\n", args[1].c_str());
136 } else if (pkgDllMode) {
137 int ret = createNiDllUnderPkgRoot(args[0], args[1], enableR2R);
138 if (ret == NI_ERROR_INVALID_PACKAGE) {
139 fprintf(stderr, "Failed to get root path from [%s]\n", args[0].c_str());
141 } else if (ret == NI_ERROR_ALREADY_EXIST) {
142 // skip for already exist case
144 } else if (ret != NI_ERROR_NONE) {
145 fprintf(stderr, "Failed to generate NI file [%s]\n", args[1].c_str());
148 } else if (rmPkgMode) {
149 for (const std::string pkg : args) {
150 int ret = removeNiUnderPkgRoot(pkg);
151 if (ret == NI_ERROR_INVALID_PACKAGE) {
152 fprintf(stderr, "Failed to get root path from [%s]\n", pkg.c_str());
154 } else if (ret != NI_ERROR_NONE) {
155 fprintf(stderr, "Failed to remove dlls for given package [%s]\n", pkg.c_str());
159 } else if (dllMode) {
160 // donot return error code for generation failure.
161 // we have to run crossgen for all input dlls.
162 for (const std::string dll : args) {
163 int ret = createNiDll(dll, enableR2R);
164 if (ret == NI_ERROR_ALREADY_EXIST) {
165 // skip for already exist case
166 } else if (ret != NI_ERROR_NONE) {
167 fprintf(stderr, "Failed to generate NI file [%s]\n", dll.c_str());
170 } else if (dirMode) {
171 createNiUnderDirs(args.data(), args.size(), enableR2R);