]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/tools/pkgdata/winmode.c
ICU-400.42.tar.gz
[apple/icu.git] / icuSources / tools / pkgdata / winmode.c
index f2e5bc1496e458a81038ac7245259ce39ba80b9a..460ae12ca7b7594abf83a1b64a6e17cbfe6a8526 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
 *
-*   Copyright (C) 2000-2003, International Business Machines
+*   Copyright (C) 2000-2007, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
 *   (DLL, common data, etc.)
 */
 
-#include <stdio.h>
-#include <stdlib.h>
 #include "unicode/utypes.h"
+
+#ifdef U_MAKE_IS_NMAKE
+
 #include "unicode/putil.h"
 #include "cmemory.h"
 #include "cstring.h"
 #include "uoptions.h"
 #include "pkgtypes.h"
 #include "makefile.h"
+#include <stdio.h>
+#include <stdlib.h>
 
-#ifdef WIN32
-#define WINBUILDMODE (*(o->options)=='R'?"Release":"Debug")
+/*
+MSVC 2005 has the annoying habit of creating a manifest when one isn't needed.
+The generated library doesn't depend on anything due to the /NOENTRY usage.
+*/
+#if defined(_MSC_VER) && _MSC_VER >= 1400
+#define NO_MANIFEST "/MANIFEST:NO "
+#else
+#define NO_MANIFEST ""
+#endif
 
-void writeCmnRules(UPKGOptions *o,  FileStream *makefile)
+/*#define WINBUILDMODE (*(o->options)=='R'?"Release":"Debug")*/
+#define CONTAINS_REAL_PATH(o) (*(o->options)==PKGDATA_DERIVED_PATH)
+
+void writeCmnRules(UPKGOptions *o, const char *targetDirVar, FileStream *makefile)
 {
     char tmp[1024];
     CharList *infiles;
 
-    infiles = o->filePaths;
-
-    sprintf(tmp, "\"$(TARGETDIR)\\$(CMNTARGET)\" : $(DATAFILEPATHS)\n\t@\"$(GENCMN)\" -C \"%s\" -d \"%s\" -n \"$(NAME)\" 0 <<\n",
-        o->comment, o->targetDir);
-    T_FileStream_writeLine(makefile, tmp);
-
-    pkg_writeCharList(makefile, infiles, "\n", -1);
-/*
-    for(;infiles;infiles = infiles->next) {
-    if(infiles->str[0] != '"' && infiles->str[uprv_strlen(infiles->str)-1] != '"') {
-        sprintf(tmp, "\"%s\"\n", infiles->str);
-    } else {
-        sprintf(tmp, "%s\n", infiles->str);
-    }
-    T_FileStream_writeLine(makefile, tmp);
-    }
-*/
-    sprintf(tmp, "\n<<\n");
+    infiles = o->files; 
+    sprintf(tmp, "\"$(%s)\\$(CMNTARGET)\" : $(DATAFILEPATHS)\n"
+        "\t%s\"$(ICUPKG)\" -t%c %s%s%s -s \"$(SRCDIR)\" -a \"$(LISTFILES)\" new \"$(%s)\\$(CMNTARGET)\"\n",
+        targetDirVar,
+        (o->verbose ? "" : "@"),
+        (U_IS_BIG_ENDIAN ? 'b' : 'l'),
+        (o->comment ? "-C \"" : ""),
+        (o->comment ? o->comment : ""),
+        (o->comment ? "\" " : ""),
+        targetDirVar);
     T_FileStream_writeLine(makefile, tmp);
 }
 
@@ -74,13 +79,22 @@ void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status)
     sprintf(tmp2, "ICUROOT=%s\n\n", o->icuroot);
     T_FileStream_writeLine(makefile, tmp2);
 
-    sprintf(tmp2,
-        "GENCMN = $(ICUROOT)%sbin\\gencmn.exe\n", separator);
+    if (CONTAINS_REAL_PATH(o)) {
+        sprintf(tmp2,
+            "ICUPKG = $(ICUROOT)%sicupkg.exe\n", separator);
+    }
+    else {
+        sprintf(tmp2,
+            "ICUPKG = $(ICUROOT)%sbin\\icupkg.exe\n", separator);
+    }
     T_FileStream_writeLine(makefile, tmp2);
 
     if(isDll) {
         uprv_strcpy(tmp, LIB_PREFIX);
-        uprv_strcat(tmp, o->cShortName);
+        uprv_strcat(tmp, o->libName);
+        if (o->version) {
+            uprv_strcat(tmp, "$(TARGET_VERSION)");
+        }
         uprv_strcat(tmp, UDATA_SO_SUFFIX);
 
         if(o->nooutput || o->verbose) {
@@ -97,19 +111,24 @@ void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status)
 
         sprintf(tmp2,
             "LINK32 = link.exe\n"
-            "LINK32_FLAGS = /nologo /out:\"$(TARGETDIR)\\$(DLLTARGET)\" /DLL /NOENTRY /base:\"0x4ad00000\" /implib:\"$(TARGETDIR)\\$(ENTRYPOINT).lib\" /comment:\"%s\"\n",
-            o->comment
-            );
+            "LINK32_FLAGS = /nologo /release /out:\"$(TARGETDIR)\\$(DLLTARGET)\" /DLL /NOENTRY " NO_MANIFEST "$(LDFLAGS) $(PKGDATA_LDFLAGS) /implib:\"$(TARGETDIR)\\$(LIBNAME).lib\"\n");
         T_FileStream_writeLine(makefile, tmp2);
 
-        sprintf(tmp2,
-            "GENCCODE = $(ICUROOT)%sbin\\genccode.exe\n",  separator);
+        if (CONTAINS_REAL_PATH(o)) {
+            sprintf(tmp2,
+                "GENCCODE = $(ICUROOT)%sgenccode.exe\n", separator);
+        }
+        else {
+            sprintf(tmp2,
+                "GENCCODE = $(ICUROOT)%sbin\\genccode.exe\n", separator);
+        }
         T_FileStream_writeLine(makefile, tmp2);
 
+        /* If you modify this, remember to modify makedata.mak too. */
         T_FileStream_writeLine(makefile, "\n"
             "# Windows specific DLL version information.\n"
-            "!IF EXISTS(\".\\$(NAME)_icudata.res\")\n"
-            "DATA_VER_INFO=\".\\$(NAME)_icudata.res\"\n"
+            "!IF EXISTS(\"$(TEMP_DIR)\\icudata.res\")\n"
+            "DATA_VER_INFO=\"$(TEMP_DIR)\\icudata.res\"\n"
             "!ELSE\n"
             "DATA_VER_INFO=\n"
             "!ENDIF\n\n");
@@ -123,10 +142,12 @@ void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status)
     else if (isStatic)
     {
         uprv_strcpy(tmp, LIB_PREFIX);
-        uprv_strcat(tmp, o->cShortName);
+        uprv_strcat(tmp, o->libName);
         uprv_strcat(tmp, UDATA_LIB_SUFFIX);
 
-        pkg_sttc_writeReadme(o, tmp, status);
+        if (!o->quiet) {
+            pkg_sttc_writeReadme(o, tmp, status);
+        }
         if(U_FAILURE(*status))
         {
             return;
@@ -146,31 +167,31 @@ void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status)
 
         sprintf(tmp2,
             "LINK32 = LIB.exe\n"
-            "LINK32_FLAGS = /nologo /out:\"$(TARGETDIR)\\$(DLLTARGET)\" /EXPORT:\"%s\"\n",
-            o->cShortName
+            "LINK32_FLAGS = /nologo /out:\"$(TARGETDIR)\\$(DLLTARGET)\"\n"
             );
         T_FileStream_writeLine(makefile, tmp2);
 
-        sprintf(tmp2,
-            "GENCCODE = $(ICUROOT)%sbin\\genccode.exe\n",  separator);
-        T_FileStream_writeLine(makefile, tmp2);
-
-        T_FileStream_writeLine(makefile, "\n"
-            "# Windows specific LIB version information.\n"
-            "!IF EXISTS(\".\\$(NAME)_icudata.res\")\n"
-            "DATA_VER_INFO=\".\\$(NAME)_icudata.res\"\n"
-            "!ELSE\n"
-            "DATA_VER_INFO=\n"
-            "!ENDIF\n\n");
 
+        if (CONTAINS_REAL_PATH(o)) {
+            sprintf(tmp2,
+                "GENCCODE = $(ICUROOT)%sgenccode.exe\n", separator);
+        }
+        else {
+            sprintf(tmp2,
+                "GENCCODE = $(ICUROOT)%sbin\\genccode.exe\n", separator);
+        }
+        T_FileStream_writeLine(makefile, tmp2);
 
         uprv_strcpy(tmp, UDATA_CMN_PREFIX "$(NAME)" UDATA_CMN_INTERMEDIATE_SUFFIX OBJ_SUFFIX);
 
-        sprintf(tmp2, "# intermediate obj file:\nCMNOBJTARGET=%s\n\n", tmp);
+        sprintf(tmp2, "# intermediate obj file\nCMNOBJTARGET=%s\n\n", tmp);
         T_FileStream_writeLine(makefile, tmp2);
     }
     uprv_strcpy(tmp, UDATA_CMN_PREFIX);
     uprv_strcat(tmp, o->cShortName);
+    if (o->version && !uprv_strstr(o->shortName,o->version)) {
+        uprv_strcat(tmp, "$(TARGET_VERSION)");
+    }
     uprv_strcat(tmp, UDATA_CMN_SUFFIX);
 
     if(o->nooutput || o->verbose) {
@@ -190,19 +211,24 @@ void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status)
         sprintf(tmp, "all: \"$(TARGETDIR)\\$(DLLTARGET)\"\n\n");
         T_FileStream_writeLine(makefile, tmp);
 
-        sprintf(tmp, "\"$(TARGETDIR)\\$(DLLTARGET)\": \"$(TARGETDIR)\\$(CMNOBJTARGET)\"\n"
-            "\t$(LINK32) $(LINK32_FLAGS) \"$(TARGETDIR)\\$(CMNOBJTARGET)\" $(DATA_VER_INFO)\n\n");
+        sprintf(tmp, "\"$(TARGETDIR)\\$(DLLTARGET)\": \"$(TEMP_DIR)\\$(CMNOBJTARGET)\"\n"
+            "\t$(LINK32) $(LINK32_FLAGS) \"$(TEMP_DIR)\\$(CMNOBJTARGET)\" $(DATA_VER_INFO)\n\n");
         T_FileStream_writeLine(makefile, tmp);
-        sprintf(tmp, "\"$(TARGETDIR)\\$(CMNOBJTARGET)\": \"$(TARGETDIR)\\$(CMNTARGET)\"\n"
-            "\t@\"$(GENCCODE)\" $(GENCOPTIONS) -e $(ENTRYPOINT) -o -d \"$(TARGETDIR)\" \"$(TARGETDIR)\\$(CMNTARGET)\"\n\n");
+        sprintf(tmp, "\"$(TEMP_DIR)\\$(CMNOBJTARGET)\": \"$(TEMP_DIR)\\$(CMNTARGET)\"\n"
+            "\t@\"$(GENCCODE)\" $(GENCOPTIONS) -e $(ENTRYPOINT) -o -d \"$(TEMP_DIR)\" \"$(TEMP_DIR)\\$(CMNTARGET)\"\n\n");
         T_FileStream_writeLine(makefile, tmp);
 
         sprintf(tmp2,
             "clean:\n"
             "\t-@erase \"$(TARGETDIR)\\$(DLLTARGET)\"\n"
-            "\t-@erase \"$(TARGETDIR)\\$(CMNOBJTARGET)\"\n"
-            "\t-@erase \"$(TARGETDIR)\\$(CMNTARGET)\"\n\n");
+            "\t-@erase \"$(TEMP_DIR)\\$(CMNOBJTARGET)\"\n"
+            "\t-@erase \"$(TEMP_DIR)\\$(CMNTARGET)\"\n\n");
         T_FileStream_writeLine(makefile, tmp2);
+
+        T_FileStream_writeLine(makefile, "install: \"$(TARGETDIR)\\$(DLLTARGET)\"\n"
+                                         "\tcopy \"$(TARGETDIR)\\$(DLLTARGET)\" \"$(INSTALLTO)\\$(DLLTARGET)\"\n\n");
+        /* Write compile rules */
+        writeCmnRules(o, "TEMP_DIR", makefile);
     } else { /* common */
         sprintf(tmp, "all: \"$(TARGETDIR)\\$(CMNTARGET)\"\n\n");
         T_FileStream_writeLine(makefile, tmp);
@@ -211,13 +237,16 @@ void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status)
             "clean:\n"
             "\t-@erase \"$(TARGETDIR)\\$(CMNTARGET)\"\n\n");
         T_FileStream_writeLine(makefile, tmp2);
+
+        T_FileStream_writeLine(makefile, "install: \"$(TARGETDIR)\\$(CMNTARGET)\"\n"
+                                         "\tcopy \"$(TARGETDIR)\\$(CMNTARGET)\" \"$(INSTALLTO)\\$(CMNTARGET)\"\n\n");
+
+        /* Write compile rules */
+        writeCmnRules(o, "TARGETDIR", makefile);
     }
 
-    sprintf(tmp2, "rebuild: clean all\n\n");
-    T_FileStream_writeLine(makefile, tmp2);
+    T_FileStream_writeLine(makefile, "rebuild: clean all\n\n");
 
-    /* Write compile rules */
-    writeCmnRules(o, makefile);
 }
 
 #endif