Add '--ni-reset-dir' option of dotnettool
[platform/core/dotnet/launcher.git] / NativeLauncher / tool / dotnettool.cc
index 76ed563..120b179 100644 (file)
  * limitations under the License.
  */
 
-#include "log.h"
 #include "utils.h"
-#include "db_manager.h"
 #include "ni_common.h"
 #include "tac_common.h"
 
 #include <algorithm>
 #include <cstdio>
 #include <cstring>
-#include <fstream>
 #include <vector>
 
-#include <pkgmgr-info.h>
-#include <pkgmgr_installer_info.h>
-
-#ifdef  LOG_TAG
-#undef  LOG_TAG
-#endif
-#define LOG_TAG "DOTNET_INSTALLER_PLUGIN"
-
 std::vector<std::string> getCmdArgs(char** begin, char** end)
 {
        std::vector<std::string> list;
@@ -48,23 +37,31 @@ std::vector<std::string> getCmdArgs(char** begin, char** end)
 static void help(const char *argv0)
 {
        const char* helpDesc =
-               "Usage: %s [args] <root paths or pkg name>\n"
+               "Usage: %s [OPTIONS] COMMAND <paths or pkg name>\n"
+               "\n"
+               "Commands:\n"
                "       --help                 - Display this screen\n"
                "       --ni-system            - Create NI under System DLLs\n"
                "       --ni-dll               - Create NI for DLL\n"
                "       --ni-pkg               - Create NI for package\n"
                "       --ni-pkg-dll           - Create NI for DLL in package\n"
                "       --ni-dir               - Create NI for directory\n"
-               "       --r2r                  - Use ready-to-run option (default: FNV)\n"
-               "                                (This option should be used with other options)\n"
                "       --ni-reset-system      - Remove System NI files\n"
                "       --ni-reset-pkg         - Remove App NI files\n"
+               "       --ni-reset-dir         - Remove NI for directory\n"
                "       --ni-regen-all-app     - Re-generate All App NI files\n"
                "       --tac-regen-all        - Re-generate All TAC files\n"
                "       --tac-restore-db       - Restore TAC Database\n"
                "       --tac-disable-pkg      - Disable TAC for package\n"
                "       --tac-enable-pkg       - Enable TAC for package\n"
                "\n"
+               "Options:\n"
+               "       --r2r                  - Generate a Ready-To-Run image (disables /FragileNonVersionable)\n"
+               "       --compatibility        - Compatibility mode for older versions of crossgen\n"
+               "                                (replaces /r with /Trusted_Platform_Assemblies)\n"
+               "       --verbose              - Display verbose information\n"
+               "       --instrument           - Generate an instrumented image for profiling (enables /Tuning)\n"
+               "\n"
                "Example:\n"
                "1. Create native image for dlls and exes under platform directories\n"
                "   # %s --ni-system\n"
@@ -79,32 +76,41 @@ static void help(const char *argv0)
 
 int main(int argc, char* argv[])
 {
+       DWORD flags = 0;
        bool pkgMode = false;
        bool dllMode = false;
        bool dirMode = false;
        bool rmPkgMode = false;
-       bool enableR2R = false;
+       bool rmDirMode = false;
        bool pkgDllMode = false;
        bool disableTacMode = false;
        bool enableTacMode = false;
 
-       bool doGenUniqueBaseSystem = true;
-
        NiCommonOption option = {std::string(), std::string(), std::string()};
        if (initNICommon(&option) != NI_ERROR_NONE) {
-               fprintf(stderr, "Fail to initialize NI Common\n");
                return -1;
        }
 
+       // Parse optional switches first.
        if (cmdOptionExists(argv, argv+argc, "--r2r")) {
-               enableR2R = true;
+               flags |= NI_FLAGS_ENABLER2R;
+       }
+       if (cmdOptionExists(argv, argv+argc, "--compatibility")) {
+               flags |= NI_FLAGS_COMPATIBILITY;
+       }
+       if (cmdOptionExists(argv, argv+argc, "--instrument")) {
+               flags |= NI_FLAGS_INSTRUMENT;
+       }
+       if (cmdOptionExists(argv, argv+argc, "--verbose")) {
+               flags |= NI_FLAGS_VERBOSE;
        }
 
+       // The following commands are mutually exclusive.
        if (cmdOptionExists(argv, argv+argc, "--help")) {
                help(argv[0]);
                return 0;
        } else if (cmdOptionExists(argv, argv+argc, "--ni-system")) {
-               createNiPlatform(enableR2R, doGenUniqueBaseSystem);
+               createNiPlatform(flags);
                return 0;
        } else if (cmdOptionExists(argv, argv+argc, "--ni-dll")) {
                dllMode = true;
@@ -117,13 +123,15 @@ int main(int argc, char* argv[])
                return 0;
        } else if (cmdOptionExists(argv, argv+argc, "--ni-reset-pkg")) {
                rmPkgMode = true;
+       } else if (cmdOptionExists(argv, argv+argc, "--ni-reset-dir")) {
+               rmDirMode = true;
        } else if (cmdOptionExists(argv, argv+argc, "--ni-pkg-dll")) {
                pkgDllMode = true;
        } else if (cmdOptionExists(argv, argv+argc, "--ni-regen-all-app")) {
-               regenerateAppNI(enableR2R);
+               regenerateAppNI(flags);
                return 0;
        } else if (cmdOptionExists(argv, argv+argc, "--tac-regen-all")) {
-               regenerateTAC();
+               regenerateTACNI(flags);
                return 0;
        } else if (cmdOptionExists(argv, argv+argc, "--tac-restore-db")) {
                restoreTACDB();
@@ -143,22 +151,24 @@ int main(int argc, char* argv[])
                if (pkgMode || rmPkgMode || disableTacMode || enableTacMode) {
                        fprintf(stderr, "Package name is missed\n");
                } else if (dllMode) {
-                       fprintf(stderr, "DLL path is missed\n");
+                       fprintf(stderr, "DLL path is missing.\n");
+               } else if (rmDirMode) {
+                       fprintf(stderr, "Directory path is missing.\n");
                }
                help(argv[0]);
-               return 1;
+               return -1;
        } else if (args.size() < 2) {
                if (pkgDllMode) {
-                       fprintf(stderr, "Package name or DLL path is missed\n");
+                       fprintf(stderr, "Package name or DLL path is missing.\n");
                        help(argv[0]);
-                       return 1;
+                       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);
+                       int ret = createNiUnderPkgRoot(pkg, flags);
                        if (ret == NI_ERROR_INVALID_PACKAGE) {
                                fprintf(stderr, "Failed to get root path from [%s]\n", pkg.c_str());
                                return -1;
@@ -166,7 +176,7 @@ int main(int argc, char* argv[])
                                fprintf(stderr, "Failed to generate NI file [%s]\n", pkg.c_str());
                                return -1;
                        }
-                       ret = createTACPackage(pkg);
+                       ret = createTACPkgRoot(pkg, flags);
                        if (ret == TAC_ERROR_INVALID_PACKAGE) {
                                fprintf(stderr, "Failed to get root path from [%s]\n", pkg.c_str());
                                return -1;
@@ -176,7 +186,7 @@ int main(int argc, char* argv[])
                        }
                }
        } else if (pkgDllMode) {
-               int ret = createNiDllUnderPkgRoot(args[0], args[1], enableR2R);
+               int ret = createNiDllUnderPkgRoot(args[0], args[1], flags);
                if (ret == NI_ERROR_INVALID_PACKAGE) {
                        fprintf(stderr, "Failed to get root path from [%s]\n", args[0].c_str());
                        return -1;
@@ -206,11 +216,13 @@ int main(int argc, char* argv[])
                                return -1;
                        }
                }
+       } else if (rmDirMode) {
+               removeNiUnderDirs(args.data(), args.size());
        } 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, doGenUniqueBaseSystem);
+                       int ret = createNiDll(dll, flags);
                        if (ret == NI_ERROR_ALREADY_EXIST) {
                                // skip for already exist case
                        } else if (ret != NI_ERROR_NONE) {
@@ -218,7 +230,7 @@ int main(int argc, char* argv[])
                        }
                }
        } else if (dirMode) {
-               createNiUnderDirs(args.data(), args.size(), enableR2R, doGenUniqueBaseSystem);
+               createNiUnderDirs(args.data(), args.size(), flags);
        } else if (disableTacMode) {
                for (const std::string pkg : args) {
                        int ret = disableTACPackage(pkg);