2 * Copyright (c) 2019 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.
19 #include "db_manager.h"
20 #include "ni_common.h"
21 #include "tac_common.h"
29 #include <pkgmgr-info.h>
30 #include <pkgmgr_installer_info.h>
35 #define LOG_TAG "DOTNET_INSTALLER_PLUGIN"
37 std::vector<std::string> getCmdArgs(char** begin, char** end)
39 std::vector<std::string> list;
40 for (char** itr = begin+1; itr != end; itr++) {
41 if (strncmp(*itr, "--", 2) != 0) {
48 static void help(const char *argv0)
50 const char* helpDesc =
51 "Usage: %s [OPTIONS] COMMAND <paths or pkg name>\n"
54 " --help - Display this screen\n"
55 " --ni-system - Create NI under System DLLs\n"
56 " --ni-dll - Create NI for DLL\n"
57 " --ni-pkg - Create NI for package\n"
58 " --ni-pkg-dll - Create NI for DLL in package\n"
59 " --ni-dir - Create NI for directory\n"
60 " --ni-reset-system - Remove System NI files\n"
61 " --ni-reset-pkg - Remove App NI files\n"
62 " --ni-regen-all-app - Re-generate All App NI files\n"
63 " --tac-regen-all - Re-generate All TAC files\n"
64 " --tac-restore-db - Restore TAC Database\n"
65 " --tac-disable-pkg - Disable TAC for package\n"
66 " --tac-enable-pkg - Enable TAC for package\n"
69 " --r2r - Generate a Ready-To-Run image (disables /FragileNonVersionable)\n"
70 " --compatibility - Compatibility mode for older versions of crossgen\n"
71 " (replaces /r with /Trusted_Platform_Assemblies)\n"
72 " --verbose - Display verbose information\n"
73 " --instrument - Generate an instrumented image for profiling (enables /Tuning)\n"
76 "1. Create native image for dlls and exes under platform directories\n"
78 "2. Create native image for dll\n"
79 " # %s --ni-dll /usr/bin/Tizen.Runtime.dll\n"
80 "3. Create native image under the package's bin and lib directory\n"
81 " # %s --ni-pkg org.tizen.FormsGallery\n"
82 "4. Regenerate native images for all installed .net packages with ready-to-run option\n"
83 " # %s --r2r --ni-regen-all-app\n\n";
84 printf(helpDesc, argv0, argv0, argv0, argv0, argv0);
87 int main(int argc, char* argv[])
93 bool rmPkgMode = false;
94 bool pkgDllMode = false;
95 bool disableTacMode = false;
96 bool enableTacMode = false;
98 NiCommonOption option = {std::string(), std::string(), std::string()};
99 if (initNICommon(&option) != NI_ERROR_NONE) {
103 // Parse optional switches first.
104 if (cmdOptionExists(argv, argv+argc, "--r2r")) {
105 flags |= NI_FLAGS_ENABLER2R;
107 if (cmdOptionExists(argv, argv+argc, "--compatibility")) {
108 flags |= NI_FLAGS_COMPATIBILITY;
110 if (cmdOptionExists(argv, argv+argc, "--instrument")) {
111 flags |= NI_FLAGS_INSTRUMENT;
113 if (cmdOptionExists(argv, argv+argc, "--verbose")) {
114 flags |= NI_FLAGS_VERBOSE;
117 // The following commands are mutually exclusive.
118 if (cmdOptionExists(argv, argv+argc, "--help")) {
121 } else if (cmdOptionExists(argv, argv+argc, "--ni-system")) {
122 createNiPlatform(flags);
124 } else if (cmdOptionExists(argv, argv+argc, "--ni-dll")) {
126 } else if (cmdOptionExists(argv, argv+argc, "--ni-pkg")) {
128 } else if (cmdOptionExists(argv, argv+argc, "--ni-dir")) {
130 } else if (cmdOptionExists(argv, argv+argc, "--ni-reset-system")) {
133 } else if (cmdOptionExists(argv, argv+argc, "--ni-reset-pkg")) {
135 } else if (cmdOptionExists(argv, argv+argc, "--ni-pkg-dll")) {
137 } else if (cmdOptionExists(argv, argv+argc, "--ni-regen-all-app")) {
138 regenerateAppNI(flags);
140 } else if (cmdOptionExists(argv, argv+argc, "--tac-regen-all")) {
141 regenerateTACNI(flags);
143 } else if (cmdOptionExists(argv, argv+argc, "--tac-restore-db")) {
146 } else if (cmdOptionExists(argv, argv+argc, "--tac-disable-pkg")) {
147 disableTacMode = true;
148 } else if (cmdOptionExists(argv, argv+argc, "--tac-enable-pkg")) {
149 enableTacMode = true;
155 std::vector<std::string> args = getCmdArgs(argv, argv+argc);
157 if (args.size() < 1) {
158 if (pkgMode || rmPkgMode || disableTacMode || enableTacMode) {
159 fprintf(stderr, "Package name is missed\n");
160 } else if (dllMode) {
161 fprintf(stderr, "DLL path is missing.\n");
165 } else if (args.size() < 2) {
167 fprintf(stderr, "Package name or DLL path is missing.\n");
174 for (const std::string pkg : args) {
175 // if there is AOTed dlls under package root, that is skiped.
176 int ret = createNiUnderPkgRoot(pkg, flags);
177 if (ret == NI_ERROR_INVALID_PACKAGE) {
178 fprintf(stderr, "Failed to get root path from [%s]\n", pkg.c_str());
180 } else if (ret != NI_ERROR_NONE) {
181 fprintf(stderr, "Failed to generate NI file [%s]\n", pkg.c_str());
184 ret = createTACPkgRoot(pkg, flags);
185 if (ret == TAC_ERROR_INVALID_PACKAGE) {
186 fprintf(stderr, "Failed to get root path from [%s]\n", pkg.c_str());
188 } else if (ret != TAC_ERROR_NONE) {
189 fprintf(stderr, "Failed to generate symbolic link file [%s]\n", pkg.c_str());
193 } else if (pkgDllMode) {
194 int ret = createNiDllUnderPkgRoot(args[0], args[1], flags);
195 if (ret == NI_ERROR_INVALID_PACKAGE) {
196 fprintf(stderr, "Failed to get root path from [%s]\n", args[0].c_str());
198 } else if (ret == NI_ERROR_ALREADY_EXIST) {
199 // skip for already exist case
201 } else if (ret != NI_ERROR_NONE) {
202 fprintf(stderr, "Failed to generate NI file [%s]\n", args[1].c_str());
205 } else if (rmPkgMode) {
206 for (const std::string pkg : args) {
207 int ret = removeNiUnderPkgRoot(pkg);
208 if (ret == NI_ERROR_INVALID_PACKAGE) {
209 fprintf(stderr, "Failed to get root path from [%s]\n", pkg.c_str());
211 } else if (ret != NI_ERROR_NONE) {
212 fprintf(stderr, "Failed to remove dlls for given package [%s]\n", pkg.c_str());
215 ret = resetTACPackage(pkg);
216 if (ret == TAC_ERROR_INVALID_PACKAGE) {
217 fprintf(stderr, "Failed to get root path from [%s]\n", pkg.c_str());
219 } else if (ret != TAC_ERROR_NONE) {
220 fprintf(stderr, "Failed to remove symlink for given package [%s]\n", pkg.c_str());
224 } else if (dllMode) {
225 // donot return error code for generation failure.
226 // we have to run crossgen for all input dlls.
227 for (const std::string dll : args) {
228 int ret = createNiDll(dll, flags);
229 if (ret == NI_ERROR_ALREADY_EXIST) {
230 // skip for already exist case
231 } else if (ret != NI_ERROR_NONE) {
232 fprintf(stderr, "Failed to generate NI file [%s]\n", dll.c_str());
235 } else if (dirMode) {
236 createNiUnderDirs(args.data(), args.size(), flags);
237 } else if (disableTacMode) {
238 for (const std::string pkg : args) {
239 int ret = disableTACPackage(pkg);
240 if (ret == TAC_ERROR_INVALID_PACKAGE) {
241 fprintf(stderr, "Failed to get root path from [%s]\n", pkg.c_str());
243 } else if (ret != TAC_ERROR_NONE) {
244 fprintf(stderr, "Failed to disable tac [%s]\n", pkg.c_str());
248 } else if (enableTacMode) {
249 for (const std::string pkg : args) {
250 int ret = enableTACPackage(pkg);
251 if (ret == TAC_ERROR_INVALID_PACKAGE) {
252 fprintf(stderr, "Failed to get root path from [%s]\n", pkg.c_str());
254 } else if (ret != TAC_ERROR_NONE) {
255 fprintf(stderr, "Failed to enable tac [%s]\n", pkg.c_str());