changeset 3116:0223a65dbd73

Gradle build improvements. - Added OS_ARCH property because it is needed in some native compilation steps (parameterized i386 on windows because might be amd64) - Added ability for CCTask to be used to produce an exe in a single step (Windows requirement) - Added ability for CCTask to rename output files - Allow CCTask headers to be null (might have no JNI associated with it in the case of deployment code) - Temporarily disable pdb for windows (wasn't working anyway) - Added building of deployment code (fxpackager project) - added -encoding UTF8 to compiler (make Windows happy. *sigh* Windows). - Fixed build scenario that caused JDK 8 javac to crash (see JDK-8010659 and JDK-8011413 for details) - Fixed bug where JAVADOC wasn't being used to generate JavaDoc - Fixed javadoc to use a whitelist of projects instead of blacklisting one (since as we move forward the whitelist will be smaller) - Creation of policy file - Added reference to mt.exe to win.gradle
author Richard Bair <richard.bair@oracle.com>
date Wed, 03 Apr 2013 23:38:15 -0700
parents 242ede38f3f7
children 73fe0d16ec55 ed0ac2a73d3c
files build.gradle generator.gradle settings.gradle win.gradle
diffstat 4 files changed, 298 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/build.gradle	Wed Apr 03 18:21:24 2013 +0400
+++ b/build.gradle	Wed Apr 03 23:38:15 2013 -0700
@@ -114,7 +114,8 @@
 // These variables indicate what the platform is that is doing the build. Is
 // this build running on a Mac, Windows, or Linux machine? 32 or 64 bit?
 ext.OS_NAME = System.getProperty("os.name").toLowerCase();
-ext.IS_64 = System.getProperty("os.arch").toLowerCase().contains("64");
+ext.OS_ARCH = System.getProperty("os.arch");
+ext.IS_64 = OS_ARCH.toLowerCase().contains("64");
 ext.IS_MAC = OS_NAME.contains("mac") || OS_NAME.contains("darwin");
 ext.IS_WINDOWS = OS_NAME.contains("windows");
 ext.IS_LINUX = OS_NAME.contains("linux");
@@ -249,6 +250,7 @@
 
 // Log some of the settings we've determined. We could log more here, it doesn't really hurt.
 logger.info("OS_NAME: $OS_NAME");
+logger.info("OS_ARCH: $OS_ARCH");
 logger.info("JAVA_HOME: $JAVA_HOME");
 logger.info("JDK_HOME: $JDK_HOME");
 logger.info("BINARY_STUB: ${file(BINARY_STUB)}");
@@ -424,10 +426,9 @@
 }
 
 class CompileResourceTask extends NativeCompileTask {
-
     protected File outputFile(File sourceFile) {
         final String outFileName = sourceFile.getName().substring(0, sourceFile.getName().lastIndexOf("."));
-        new File("$output/${outFileName}.res");
+        return new File("$output/${outFileName}.res");
     }
 
     protected void doCompile(File sourceFile, File outputFile){
@@ -453,7 +454,10 @@
 
 class CCTask extends NativeCompileTask {
     @Optional String compiler;
-    @InputDirectory File headers;
+    @Optional List<String> linkerOptions = new ArrayList<String>();
+    @Optional @InputDirectory File headers;
+    @Optional Closure eachOutputFile; // will be given a File and must return a File
+    @Optional boolean exe = false;
 
     protected File outputFile(File sourceFile) {
         final String outFileName = sourceFile.getName().substring(0, sourceFile.getName().lastIndexOf("."));
@@ -461,13 +465,19 @@
     }
 
     protected void doCompile(File sourceFile, File outputFile) {
+        if (eachOutputFile != null) {
+            outputFile = eachOutputFile(outputFile);
+        }
+
         // or compile sources using CC
-        final File pdbFile = new File("$output/${outputFile.name.replace('.obj', '.pdb')}");
+        final int lastDot = outputFile.name.lastIndexOf(".");
+        final File pdbFile = new File("$output/${lastDot > 0 ? outputFile.name.substring(0, lastDot) + '.pdb' : outputFile.name + '.pdb'}");
 
         // TODO the PDB file is never being built -- maybe because it is only built during
         // debug builds, otherwise that flag is ignored "/Fd" or "-Fd"
         project.exec({
-            commandLine("${compiler == null ? project.CC : compiler}", "-I$headers");
+            commandLine("${compiler == null ? project.CC : compiler}");
+            if (headers != null) args("-I$headers");
 
             // Add the source roots in as include directories
             sourceRoots.each { root ->
@@ -489,11 +499,23 @@
 
             // Add the name of the source file to compile
             if (project.IS_WINDOWS) {
-                args("/Fd$pdbFile", "/Fo$outputFile", "$sourceFile");
+                if (exe) {
+                    final File exeFile = new File("$output/${lastDot > 0 ? outputFile.name.substring(0, lastDot) + '.exe' : outputFile.name + '.exe'}");
+                    args(/*"/Fd$pdbFile",*/ "/Fo$outputFile", "/Fe$exeFile", "$sourceFile")
+                } else {
+                    args(/*"/Fd$pdbFile",*/ "/Fo$outputFile", "$sourceFile");
+                }
             } else {
                 args("-Fd$pdbFile", "-o", "$outputFile", "$sourceFile");
             }
 
+            // Add any optional linker options -- used now rarely but can be
+            // used for any cc task which isn't going to be followed by a
+            // link task
+            if (linkerOptions != null && !linkerOptions.isEmpty()) {
+                args(linkerOptions);
+            }
+
             if (project.IS_WINDOWS){
                 environment(project.WINDOWS_NATIVE_COMPILE_ENVIRONMENT);
             }
@@ -577,7 +599,7 @@
 allprojects {
     // We want to configure all projects as java projects and use the same compile settings
     // etc, except for the root project which we just want to ignore
-    if (project == rootProject) return
+    if (project == rootProject || project.name == "deployment") return
     // All of our projects are java projects
     apply plugin: "java"
     sourceCompatibility = 1.7
@@ -607,13 +629,13 @@
         // Note that the compileFooJava task is automatically created whenever a source set is
         // defined. So the "test" source set automatically creates a "compileTestJava" task (among others).
         if (name == "compileTestJava") {
-            compile.options.compilerArgs = ["-Djava.ext.dirs=", "-XDignore.symbol.file"]
+            compile.options.compilerArgs = ["-Djava.ext.dirs=", "-XDignore.symbol.file", "-encoding","UTF-8"]
             classpath = sourceSets.test.compileClasspath + rootProject.files(rootProject.BINARY_STUB)
         } else if (name == "compileStubJava") {
-            compile.options.compilerArgs = ["-Djava.ext.dirs=", "-XDignore.symbol.file"]
+            compile.options.compilerArgs = ["-Djava.ext.dirs=", "-XDignore.symbol.file", "-encoding","UTF-8"]
             classpath = sourceSets.stub.compileClasspath + rootProject.files(rootProject.BINARY_STUB)
         } else {
-            compile.options.compilerArgs = ["-Djava.ext.dirs=", "-XDignore.symbol.file", "-s", "$buildDir/builder-src"]
+            compile.options.compilerArgs = ["-Djava.ext.dirs=", "-XDignore.symbol.file", "-s", "$buildDir/builder-src", "-encoding","UTF-8"]
             // Both controls & graphics need to use the annotation processor, but not the other guys.
             if (["graphics", "controls", "swing", "swt", "base", "fxml"].contains(project.name)){
                 compile.options.compilerArgs += ["-processor", "javafx.builder.processor.BuilderProcessor"]
@@ -916,7 +938,7 @@
 project(":controls") {
     dependencies {
         compile project(":build-tools"), project(":base"), project(":graphics"), project(":designTime")
-        testCompile project(":graphics").sourceSets.stub.output
+        testCompile files("../graphics/build/classes/stub")
     }
 
     test {
@@ -1125,6 +1147,155 @@
     classes.dependsOn copyPrismShaders
 }
 
+project(":fxpackager") {
+    // fxpackager has a dependency on ant in order to build the ant jar,
+    // and as such needs to point to the apache binary repository
+    repositories {
+        maven {
+            url "https://repository.apache.org"
+        }
+    }
+
+    dependencies {
+        compile "org.apache.ant:ant:1.8.2"
+    }
+
+    // When producing the jar, we need to relocate a few class files
+    // from their normal location to a resources/classes or resources/web-files
+    // location
+    jar {
+        includeEmptyDirs = false
+        archiveName = "ant-javafx.jar"
+        eachFile { FileCopyDetails details ->
+            if (details.path.startsWith("com/javafx/main")) {
+                details.path = "resources/classes/$details.path"
+            } else if (details.path.startsWith("web-files")) {
+                details.path = "resources/$details.path"
+            }
+        }
+    }
+
+    // The "man" task will create a $buildDir/man containing the man
+    // files for the system being built
+    task man(type: Copy) {
+        includeEmptyDirs = false
+        enabled = IS_LINUX || IS_MAC
+        from "src/main/man"
+        into "$buildDir/man"
+        exclude "**/*.html"
+        if (IS_MAC) exclude "**/ja_JP.UTF-8/**"
+    }
+    processResources.dependsOn man
+
+    // Compile the native launchers. These are included in ant-javafx.jar
+    if (IS_WINDOWS) {
+        task compileWinLauncher(type: CCTask, group: "Build") {
+            description = "Compiles native sources for the application co-bundle launcher"
+            matches = "WinLauncher\\.cpp"
+            params.addAll(["/nologo", "/W3", "/EHsc", "/D_WINDOWS",
+                    "/DUNICODE", "/D_UNICODE", "/DWIN32", "/D_LITTLE_ENDIAN", "/DWIN32_LEAN_AND_MEAN",
+                    "/I$JDK_HOME/include", "/I$JDK_HOME/include/win32", "/arch:SSE", "/fp:fast",
+                    "/O2", "/MD"])
+            output(file("$buildDir/classes/main/com/sun/javafx/tools/resource/windows"))
+            source file("src/main/native/launcher/win")
+            exe = true
+            linkerOptions.addAll(["/link", "/nologo", "/SUBSYSTEM:WINDOWS", "user32.lib", "shell32.lib", "advapi32.lib"])
+        }
+        task compileIconSwap(type: CCTask, group: "Build") {
+            description = "Compiles native sources for the application co-bundle launcher"
+            matches = "iconswap\\.cpp"
+            params.addAll(["/nologo", "/W3", "/EHsc", "/D_WINDOWS", "/DUNICODE", "/D_UNICODE",
+                    "/arch:SSE", "/fp:fast", "/O2"])
+            output(file("$buildDir/classes/main/com/sun/javafx/tools/resource/windows"))
+            source file("src/main/native/launcher/win")
+            exe = true
+            linkerOptions.addAll(["/link", "/nologo", "/SUBSYSTEM:CONSOLE"])
+        }
+        task compileLauncher(dependsOn: [compileWinLauncher, compileIconSwap])
+    } else {
+        task compileLauncher(type: CCTask, group: "Build") {
+            description = "Compiles native sources for the application co-bundle launcher"
+            if (IS_MAC) {
+                matches = ".*\\.m"
+                output(file("$buildDir/classes/main/com/sun/javafx/tools/resource/mac"))
+                params.addAll(CC_PARAMS);
+                source file("src/main/native/launcher/mac")
+                eachOutputFile = { f ->
+                    return new File(f.getParent(), "JavaAppLauncher")
+                }
+            } else {
+                matches = ".*\\.c"
+                output(file("$buildDir/classes/main/com/sun/javafx/tools/resource/linux"))
+                params.addAll(["-DJAVAARCH=\"$OS_ARCH\"", "-I$JDK_HOME/include", "-I$JDK_HOME/include/linux"])
+                linkerOptions.add("-ldl")
+                source file("src/main/native/launcher/linux")
+                eachOutputFile = { f ->
+                    return new File(f.getParent(), "JavaAppLauncher")
+                }
+            }
+        }
+    }
+    assemble.dependsOn compileLauncher;
+
+    // Builds the javafxpackager executable. For everything other than windows,
+    // this is simply moving the existing shell script and ensuring it has proper
+    // permissions. For Windows, this includes compiling the native executable
+    if (IS_WINDOWS){
+        task buildJavaFXPackager(type: CCTask, group: "Build") {
+            description = "Compiles native sources for javafxpackager.exe"
+            matches = "javafxpackager\\.cpp"
+            params.addAll(["/nologo", "/W3", "/EHsc", "/MT", "/GS",
+                    "/DWIN32", "/D_LITTLE_ENDIAN", "/DWIN32_LEAN_AND_MEAN",
+                    "/D_WIN32_WINDOWS=0X0500", "/D_WIN32_WINNT=0X0500",
+                    "/I$JDK_HOME/include", "/I$JDK_HOME/include/win32", "/arch:SSE", "/fp:fast",
+                    "/O2", "-c"])
+            output(file("$buildDir/native"))
+            source file("src/main/native/javafxpackager/win")
+            doLast {
+                mkdir "$buildDir/native"
+                exec({
+                    commandLine("$RC", "/nologo", "/l", "0x409", "/r", "/dJFX_DVERSION=8", "/dJFX_VERSION=8", "/fo$buildDir/native/javafxpackager.res", "src/main/native/javafxpackager/win/javafxpackager.rc");
+                    environment(WINDOWS_NATIVE_COMPILE_ENVIRONMENT);
+                });
+            }
+            doLast {
+                mkdir "$buildDir/javafxpackager"
+                exec({
+                    commandLine("$LINK", "/nologo", "/opt:REF", "/incremental:no", "/manifest", "kernel32.lib", "advapi32.lib",
+                            "/out:$buildDir/native/javafxpackager.exe",
+                            "$buildDir/native/javafxpackager.obj", "$buildDir/native/javafxpackager.res")
+                    environment(WINDOWS_NATIVE_COMPILE_ENVIRONMENT)
+                })
+            }
+            doLast {
+                copy {
+                    from file("src/main/native/javafxpackager/win/javafxpackager.manifest")
+                    into file("$buildDir/native")
+                }
+                // TODO, not sure MT.exe is actually being used currently, so for now skipping.
+//                exec({
+//                    commandLine("$MT -nologo -manifest $buildDir/native/javafxpackager.manifest")
+//                    environment(WINDOWS_NATIVE_COMPILE_ENVIRONMENT)
+//                })
+                copy {
+                    from file("$buildDir/native/javafxpackager.exe")
+                    into file("$buildDir/javafxpackager")
+                }
+            }
+        }
+    } else {
+        task buildJavaFXPackager(group: "Build") << {
+            copy {
+                from "src/main/native/javafxpackager/shell"
+                into "$buildDir/javafxpackager"
+                fileMode = 0755
+            }
+        }
+    }
+
+    assemble.dependsOn buildJavaFXPackager
+}
+
 /******************************************************************************
  *                                                                            *
  *                             Top Level Tasks                                *
@@ -1204,13 +1375,16 @@
 task javadoc(type: Javadoc) {
     group = "Basic"
     description = "Generates the JavaDoc for all the public API"
-    def projectsToDocument = subprojects.findAll({ it != project(":designTime") })
+    executable = JAVADOC
+    def projectsToDocument = [
+            project(":base"), project(":graphics"), project(":controls"),
+            project(":swing"), project(":swt"), project(":fxml")]
     source(projectsToDocument.collect({
         [it.sourceSets.main.java, "$it.buildDir/builder-src"]
     }));
     setDestinationDir(new File(buildDir, 'javadoc'));
     // Might need a classpath
-    classpath = files(subprojects.collect { project ->
+    classpath = files(projectsToDocument.collect { project ->
         project.sourceSets.main.compileClasspath
     });
     exclude("com/**/*", "javafx/scene/ParentDesignInfo*", "Compile*", "javafx/builder/**/*");
@@ -1228,7 +1402,7 @@
         }
     }
 
-    dependsOn(subprojects.collect { project -> project.getTasksByName("classes", true)});
+    dependsOn(projectsToDocument.collect { project -> project.getTasksByName("classes", true)});
 }
 
 // The 'sdk' task will build the rest of the SDK, and depends on the 'jfxrt' task. After
@@ -1251,16 +1425,49 @@
             } else if (COMPILE_TARGET == CompileTarget.WIN) {
                 into("build/${COMPILE_TARGET.name}-sdk/rt/bin");
             } else {
-                into("build/${COMPILE_TARGET.name}-sdk/rt/lib/i386");
+                into("build/${COMPILE_TARGET.name}-sdk/rt/lib/$OS_ARCH");
             }
         }
+
         // Create the javafx.properties file
         final File javafxProperties = file("build/${COMPILE_TARGET.name}-sdk/rt/lib/javafx.properties");
         javafxProperties << "javafx.runtime.version=$RAW_VERSION";
-        // Copy over the javadocs that were generated
+
+        // Create the javafx.policy file
+        final File javafxPolicy = file("build/${COMPILE_TARGET.name}-sdk/rt/lib/security/javafx.policy");
+        javafxPolicy.getParentFile().mkdirs()
+        javafxPolicy <<
+"""
+// JavaFX runtime get all permissions by default
+grant codeBase "file:\${javafx.runtime.home}/lib/ext/jfxrt.jar" {
+    permission java.security.AllPermission;
+};
+"""
+
+        // Copy over the javadocs that were generated. This is done rather than just generating
+        // the docs into the "right place" because for a cross-compile you only need one set of
+        // docs but need to have a copy in each created sdk
         copy {
             from("build/javadoc");
-            into("build/${COMPILE_TARGET.name}-sdk/doc/api");
+            into("build/${COMPILE_TARGET.name}-sdk/docs/api");
+        }
+
+        // Copy over the fxpackager and rename as ant-javafx.jar
+        copy {
+            from "modules/fxpackager/build/libs"
+            into "build/${COMPILE_TARGET.name}-sdk/lib"
+        }
+
+        // Copy over the FXPackager man files
+        copy {
+            from "modules/fxpackager/build/man"
+            into "build/${COMPILE_TARGET.name}-sdk/man"
+        }
+
+        // Copy over the javafxpackager executable
+        copy {
+            from "modules/fxpackager/build/javafxpackager"
+            into "build/${COMPILE_TARGET.name}-sdk/bin"
         }
     }
     dependsOn(jfxrt);
@@ -1333,7 +1540,7 @@
 
 allprojects {
     apply plugin: 'idea'
-    if (project == rootProject) return
+    if (project == rootProject || project.name == "deployment") return
     idea {
         module {
             inheritOutputDirs = true;
--- a/generator.gradle	Wed Apr 03 18:21:24 2013 +0400
+++ b/generator.gradle	Wed Apr 03 23:38:15 2013 -0700
@@ -412,38 +412,84 @@
     // Create the deployment code
     copy {
         from "$RTDir/deploy/javafx-deploy/src/js"
-        into "$FXDir/deploy/deploymentToolkit/src/main/js"
+        into "$FXDir/modules/fxpackager/src/main/resources/resources/web-files"
+    }
+
+    copy {
+        from "$RTDir/deploy/lib"
+        into "$FXDir/modules/fxpackager/src/main/resources/resources/web-files"
+        exclude "java-coffee-cup-23x20.png", "splash.gif"
     }
 
     copy {
         from "$RTDir/deploy/javafx-launcher/src"
-        into "$FXDir/deploy/launcher/src/main/java"
+        into "$FXDir/modules/fxpackager/src/main/java"
     }
 
     copy {
         from "$RTDir/deploy/packager/src"
-        into "$FXDir/deploy/packager/src/main/java"
+        into "$FXDir/modules/fxpackager/src/main/java"
         exclude excludeFromSource
+        exclude "**/*antlib.xml",
+                "**/*.control", "**/*.copyright", "**/*.desktop", "**/*.postinst", "**/*.postrm", "**/*.spec",
+                "**/*.scpt", "**/*.icns", "**/*.template", "**/*.plist",
+                "**/*.bmp", "**/*.ico", "**/*.iss", "**/*.wxs"
     }
 
     copy {
         from "$RTDir/deploy/packager/src", "$RTDir/deploy/packager/scripts"
-        into "$FXDir/deploy/packager/src/main/resources"
+        into "$FXDir/modules/fxpackager/src/main/resources"
         include includeInResources
-        include "**/*antlib.xml"
+        include "**/*antlib.xml",
+                "**/*.control", "**/*.copyright", "**/*.desktop", "**/*.postinst", "**/*.postrm", "**/*.spec",
+                "**/*.scpt", "**/*.icns", "**/*.template", "**/*.plist",
+                "**/*.bmp", "**/*.ico", "**/*.iss", "**/*.wxs"
         exclude excludeFromResources
     }
 
-    ["linux", "macosx", "windows"].each { dir ->
-        copy {
-            from "$RTDir/deploy/packager/native/$dir"
-            into "$FXDir/deploy/packager/native/src/main/$dir"
-        }
+    copy {
+        from "$RTDir/deploy/packager/native/linux"
+        into "$FXDir/modules/fxpackager/src/main/native/launcher/linux"
+    }
+
+    copy {
+        from "$RTDir/deploy/packager/native/macosx"
+        into "$FXDir/modules/fxpackager/src/main/native/launcher/mac"
+    }
+
+    copy {
+        from "$RTDir/deploy/packager/native/windows"
+        into "$FXDir/modules/fxpackager/src/main/native/launcher/win"
+        rename "iconswap.cpp", "IconSwap.cpp"
+        include "WinLauncher.cpp", "iconswap.cpp"
+    }
+
+    copy {
+        from "$RTDir/deploy/packager/scripts"
+        into "$FXDir/modules/fxpackager/src/main/native/javafxpackager/shell"
+    }
+
+    copy {
+        from "$RTDir/deploy/packager/winlauncher"
+        into "$FXDir/modules/fxpackager/src/main/native/javafxpackager/win"
+        include "javafxpackager.manifest", "javafxpackager.rc", "main.cpp"
+        rename "main.cpp", "javafxpackager.cpp"
     }
 
     copy {
         from "$RTDir/deploy/packager/test"
-        into "$FXDir/deploy/packager/test/main/java"
+        into "$FXDir/modules/fxpackager/test/main/java"
+    }
+
+    copy {
+        from "$RTDir/deploy/man"
+        into "$FXDir/modules/fxpackager/src/main/man"
+        exclude "build.xml", "**/ja/**"
+    }
+
+    copy {
+        from "$RTDir/deploy/man/ja"
+        into "$FXDir/modules/fxpackager/src/main/man/ja_JP.UTF-8"
     }
 
     // Find every empty directory and nuke it
--- a/settings.gradle	Wed Apr 03 18:21:24 2013 +0400
+++ b/settings.gradle	Wed Apr 03 23:38:15 2013 -0700
@@ -1,14 +1,14 @@
-include 'build-tools', 'base', 'graphics', 'controls', 'swing', 'swt', /*'web',*/ 'fxml' /*, 'media'*/, 'designTime',
-        /*'graphics:native',*/ 'graphics:effects-jsl', 'graphics:prism-jsl'
-project(':base').projectDir = file('modules/base')
-project(':graphics').projectDir = file('modules/graphics')
-//project(':graphics:native').projectDir = file('modules/graphics/native')
-project(':graphics:effects-jsl').projectDir = file('modules/graphics/effects-jsl')
-project(':graphics:prism-jsl').projectDir = file('modules/graphics/prism-jsl')
-project(':controls').projectDir = file('modules/controls')
-project(':swing').projectDir = file('modules/swing')
-project(':swt').projectDir = file('modules/swt')
-/*project(':media').projectDir = file('modules/media')*/
-//project(':web').projectDir = file('modules/web')
-project(':fxml').projectDir = file('modules/fxml')
-project(':designTime').projectDir = file('modules/designTime')
+include "build-tools", "base", "graphics", "controls", "swing", "swt", "fxml", "designTime",
+        "graphics:effects-jsl", "graphics:prism-jsl",
+        "fxpackager"
+
+project(":base").projectDir = file("modules/base")
+project(":graphics").projectDir = file("modules/graphics")
+project(":graphics:effects-jsl").projectDir = file("modules/graphics/effects-jsl")
+project(":graphics:prism-jsl").projectDir = file("modules/graphics/prism-jsl")
+project(":controls").projectDir = file("modules/controls")
+project(":swing").projectDir = file("modules/swing")
+project(":swt").projectDir = file("modules/swt")
+project(":fxml").projectDir = file("modules/fxml")
+project(":designTime").projectDir = file("modules/designTime")
+project(":fxpackager").projectDir = file("modules/fxpackager")
--- a/win.gradle	Wed Apr 03 18:21:24 2013 +0400
+++ b/win.gradle	Wed Apr 03 23:38:15 2013 -0700
@@ -107,3 +107,4 @@
 defineProperty("LINK", "$WINDOWS_VS_VSINSTALLDIR/VC/BIN/link.exe");
 defineProperty("RC", "$WINDOWS_SDK_DIR/Bin/RC.Exe");
 defineProperty("FXC", "$WINDOWS_DXSDK_DIR/utilities/bin/x86/fxc");
+defineProperty("MT", "$WINDOWS_SDK_DIR/Bin/mt.exe");