* 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;
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"
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;
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();
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;
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;
}
}
} 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;
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) {
}
}
} 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);