Relative to GNUStep make 1.10.0
 
I will try to explain what I have done:
 
HIGH LEVEL:
    Some little mingw tweaks, dlls etc.
    Don't do anything that requires symlinks on mingw.  I.e. Framework Versions and Current folders, and framework headers in derived_sources.
    Mingw will link directly against dlls before using an import library. I had to change target.make and which_lib.c to be aware of this.
 
DETAILS:
 
* Instance/framework.make:
    If HAS_LN_S is no (i.e. mingw) then define a variable HEADERS_DIR_SUFFIX for the suffix /FrameworkName to go onto the public header path.
    Disable Versions and Current if HAS_LN_S is no.
    Don't create the top level symlinks if HAS_LN_S is no.
    If HAS_LN_S is no then create the headers dir both with and without the HEADERS_DIR_SUFFIX
    I added an intermediate target for internal-framework-copy-headers-target, as I was seeing the header file copy being executed n^2 times, for every file, it copied all files.  Perhaps MSYS make 3.79.1 is buggy, but this fixed it.
    If WITH_DLL is yes, then create a def file using DLLTOOL, and then supply it to DLLWRAP.  Otherwise, the objc symbols weren't getting exported properly.
* Instance/subproject.make:
    Handle the HEADERS_DIR_SUFFIX which was passed from framework.make.
    Added an intermediate target for internal-subproject-copy-headers-target, for the same reason as in framework.make
* Master/framework.make:
    If HAS_LN_S is no (i.e. mingw) then define a variable HEADERS_DIR_SUFFIX for the suffix /FrameworkName to go onto the public header path.
* Master/rules.make:
    Had to modify the subproject rule to disable the Versions folders to match the changes in framework.make
    Pass HEADERS_DIR_SUFFIX to submakes
* configure.ac:
    Declare LN_S to be cp -rp for mingw, even if you find a ln command.  (Since it is probably just a wrapper around cp anyway)
* rules.make:
    Include the Framework.framework/Headers dir instead of derived sources if we have no symlinks
    Added a rule to compile .rc (windows resource) files.
* target.make:
    Pass -Wl,--enable-auto-import option to dllwrap and gcc to avoid a warning message at link time if linking directly to a dll.
* which_lib.c:
    Mingw searches for libraries in this order:  name.dll, then libname.a.  Changed which_lib to search in the same order, and to look for a static import library even in dynamic mode.  This fixed many problems I had with objc_d.dll vs. objc.dll.
   
 
   
 
diff -u -r -w -x .svn gnustep-make-orig/Instance/framework.make 
gnustep-make/Instance/framework.make
--- gnustep-make-orig/Instance/framework.make   Thu Sep  2 11:14:21 2004
+++ gnustep-make/Instance/framework.make        Tue Jul  5 12:04:07 2005
@@ -90,6 +90,12 @@
 ifeq ($(MAKE_CURRENT_VERSION),)
   MAKE_CURRENT_VERSION = yes
 endif
+ifeq ($(HAS_LN_S),no)
+  MAKE_CURRENT_VERSION = no
+  HEADERS_DIR_SUFFIX = /$(GNUSTEP_INSTANCE)
+else
+  HEADERS_DIR_SUFFIX =
+endif
 
 # Set VERSION from xxx_VERSION
 ifneq ($($(GNUSTEP_INSTANCE)_VERSION),)
@@ -108,7 +114,12 @@
 
 FRAMEWORK_DIR_NAME = $(GNUSTEP_INSTANCE).framework
 FRAMEWORK_DIR = $(GNUSTEP_BUILD_DIR)/$(FRAMEWORK_DIR_NAME)
+# On windows where we have no symlinks, there is no good way to do the Versions
+ifeq ($(HAS_LN_S),no)
+FRAMEWORK_VERSION_DIR_NAME = $(FRAMEWORK_DIR_NAME)
+else
 FRAMEWORK_VERSION_DIR_NAME = 
$(FRAMEWORK_DIR_NAME)/Versions/$(CURRENT_VERSION_NAME)
+endif
 FRAMEWORK_VERSION_DIR = $(GNUSTEP_BUILD_DIR)/$(FRAMEWORK_VERSION_DIR_NAME)
 
 # This is not doing much at the moment, but at least is defining
@@ -156,7 +167,7 @@
   DUMMY_FRAMEWORK_CLASS_LIST = 
$(DERIVED_SOURCES_DIR)/$(GNUSTEP_INSTANCE)-class-list
 endif
 
-FRAMEWORK_HEADER_FILES := $(addprefix 
$(FRAMEWORK_VERSION_DIR)/Headers/,$(HEADER_FILES))
+FRAMEWORK_HEADER_FILES := $(addprefix 
$(FRAMEWORK_VERSION_DIR)/Headers$(HEADERS_DIR_SUFFIX)/,$(HEADER_FILES))
 
 ifneq ($(BUILD_DLL),yes)
 
@@ -266,6 +277,7 @@
                        $(FRAMEWORK_VERSION_DIR)/Resources \
                        $(FRAMEWORK_RESOURCE_DIRS) \
                        $(UPDATE_CURRENT_SYMLINK_RULE)
+ifneq ($(HAS_LN_S),no)
        $(ECHO_NOTHING)cd $(FRAMEWORK_DIR); \
          if [ ! -h "Resources" ]; then \
            rm -f Resources; \
@@ -283,23 +295,28 @@
                     ./$(HEADER_FILES_INSTALL_DIR); \
          fi$(END_ECHO)
 endif
+endif
 
 $(FRAMEWORK_LIBRARY_DIR):
        $(ECHO_CREATING)$(MKDIRS) [EMAIL PROTECTED](END_ECHO)
 
 $(FRAMEWORK_VERSION_DIR)/Headers:
        $(ECHO_CREATING)$(MKDIRS) [EMAIL PROTECTED](END_ECHO)
+ifeq ($(HAS_LN_S),no)
+       $(ECHO_CREATING)$(MKDIRS) [EMAIL 
PROTECTED](HEADERS_DIR_SUFFIX)$(END_ECHO)
+endif
 
 $(DERIVED_SOURCES_DIR):
        $(ECHO_CREATING)$(MKDIRS) [EMAIL PROTECTED](END_ECHO)
 
 # Need to share this code with the headers code ... but how.
-$(FRAMEWORK_HEADER_FILES):: $(HEADER_FILES)
+$(FRAMEWORK_HEADER_FILES): internal-framework-copy-headers-target
+internal-framework-copy-headers-target: $(HEADER_FILES)
 ifneq ($(HEADER_FILES),)
        $(ECHO_NOTHING)for file in $(HEADER_FILES) __done; do \
          if [ $$file != __done ]; then \
            $(INSTALL_DATA) $(HEADER_FILES_DIR)/$$file \
-                           $(FRAMEWORK_VERSION_DIR)/Headers/$$file ; \
+                           
$(FRAMEWORK_VERSION_DIR)/Headers$(HEADERS_DIR_SUFFIX)/$$file ; \
          fi; \
        done$(END_ECHO)
 endif
@@ -421,11 +438,14 @@
 
 
 ifeq ($(WITH_DLL),yes)
+$(DERIVED_SOURCES)/$(GNUSTEP_INSTANCE).def: $(DUMMY_FRAMEWORK_OBJ_FILE) 
$(OBJ_FILES_TO_LINK)
+       $(DLLTOOL) --export-all-symbols --output-def 
$(DERIVED_SOURCES)/$(GNUSTEP_INSTANCE).def \
+               $(DUMMY_FRAMEWORK_OBJ_FILE) $(OBJ_FILES_TO_LINK)
 
-$(FRAMEWORK_FILE) : $(DUMMY_FRAMEWORK_OBJ_FILE) $(OBJ_FILES_TO_LINK)
+$(FRAMEWORK_FILE) : $(DUMMY_FRAMEWORK_OBJ_FILE) $(OBJ_FILES_TO_LINK) 
$(DERIVED_SOURCES)/$(GNUSTEP_INSTANCE).def
        $(ECHO_LINKING)$(DLLWRAP) --driver-name $(CC) \
-               -o $(LDOUT)$(FRAMEWORK_FILE) \
-               $(OBJ_FILES_TO_LINK) \
+               --def $(DERIVED_SOURCES)/$(GNUSTEP_INSTANCE).def -o 
$(LDOUT)$(FRAMEWORK_FILE) \
+               $(DUMMY_FRAMEWORK_OBJ_FILE) $(OBJ_FILES_TO_LINK) \
                $(ALL_LDFLAGS) \
                $(ALL_FRAMEWORK_LIBS)$(END_ECHO)
 
diff -u -r -w -x .svn gnustep-make-orig/Instance/subproject.make 
gnustep-make/Instance/subproject.make
--- gnustep-make-orig/Instance/subproject.make  Mon Oct 13 18:25:23 2003
+++ gnustep-make/Instance/subproject.make       Tue Jul  5 12:04:23 2005
@@ -76,24 +76,28 @@
 
 OWNING_PROJECT_HEADER_DIR = 
$(GNUSTEP_BUILD_DIR)/$(OWNING_PROJECT_HEADER_DIR_NAME)
 HEADER_FILES = $($(GNUSTEP_INSTANCE)_HEADER_FILES)
-OWNING_PROJECT_HEADER_FILES = $(patsubst 
%.h,$(OWNING_PROJECT_HEADER_DIR)/%.h,$(HEADER_FILES))
+OWNING_PROJECT_HEADER_FILES = $(patsubst 
%.h,$(OWNING_PROJECT_HEADER_DIR)$(HEADERS_DIR_SUFFIX)/%.h,$(HEADER_FILES))
 
 internal-subproject-build-headers:: $(OWNING_PROJECT_HEADER_FILES)
 
 # We need to build the OWNING_PROJECT_HEADER_DIR directory here
 # because this rule could be executed before the top-level framework
 # has built his dirs
-$(OWNING_PROJECT_HEADER_FILES):: $(HEADER_FILES) $(OWNING_PROJECT_HEADER_DIR)
+$(OWNING_PROJECT_HEADER_FILES): internal-subproject-copy-headers-target
+internal-subproject-copy-headers-target: $(HEADER_FILES) 
$(OWNING_PROJECT_HEADER_DIR)
 ifneq ($(HEADER_FILES),)
        $(ECHO_NOTHING)for file in $(HEADER_FILES) __done; do \
          if [ $$file != __done ]; then \
-           $(INSTALL_DATA) ./$$file $(OWNING_PROJECT_HEADER_DIR)/$$file ; \
+           $(INSTALL_DATA) ./$$file 
$(OWNING_PROJECT_HEADER_DIR)$(HEADERS_DIR_SUFFIX)/$$file ; \
          fi; \
        done$(END_ECHO)
 endif # we got HEADER_FILES
 
 $(OWNING_PROJECT_HEADER_DIR):
        $(ECHO_CREATING)$(MKDIRS) [EMAIL PROTECTED](END_ECHO)
+ifneq ($(HEADERS_DIR_SUFFIX),)
+       $(ECHO_CREATING)$(MKDIRS) [EMAIL 
PROTECTED](HEADERS_DIR_SUFFIX)$(END_ECHO)
+endif
 
 # End FRAMEWORK code
 else
diff -u -r -w -x .svn gnustep-make-orig/Master/framework.make 
gnustep-make/Master/framework.make
--- gnustep-make-orig/Master/framework.make     Tue Jun 21 13:49:36 2005
+++ gnustep-make/Master/framework.make  Tue Jun 28 07:52:18 2005
@@ -25,6 +25,11 @@
 endif
 
 FRAMEWORK_NAME := $(strip $(FRAMEWORK_NAME))
+ifeq ($(HAS_LN_S),no)
+  HEADERS_DIR_SUFFIX = /$(FRAMEWORK_NAME)
+else
+  HEADERS_DIR_SUFFIX =
+endif
 
 # A framework has a special task to do before-all, which is to build 
 # the public framework headers.
diff -u -r -w -x .svn gnustep-make-orig/Master/rules.make 
gnustep-make/Master/rules.make
--- gnustep-make-orig/Master/rules.make Fri May  7 04:33:34 2004
+++ gnustep-make/Master/rules.make      Tue Jun 28 07:56:29 2005
@@ -295,9 +295,13 @@
       fi; \
       if [ "$(OWNING_PROJECT_HEADER_DIR_NAME)" = "" ]; then \
         if [ "$$type" = "framework" ]; then \
+          if [ "$(HAS_LN_S)" = "no" ]; then \
+            owning_project_header_dir="../$${instance}.framework/Headers" ; \
+          else \
           framework_version="$($(basename $(basename 
$*))_CURRENT_VERSION_NAME)"; \
           if [ "$$framework_version" = "" ]; then framework_version="A"; fi; \
           
owning_project_header_dir="../$${instance}.framework/Versions/$${framework_version}/Headers";
 \
+       fi; \
        else owning_project_header_dir=""; \
        fi; \
       else \
@@ -306,6 +310,7 @@
       if $(MAKE) -C $$f -f $$mf --no-keep-going $$operation \
           OWNING_PROJECT_HEADER_DIR_NAME="$${owning_project_header_dir}" \
           DERIVED_SOURCES="../$(DERIVED_SOURCES)" \
+          HEADERS_DIR_SUFFIX="$(HEADERS_DIR_SUFFIX)" \
           GNUSTEP_BUILD_DIR="$$gsbuild" \
         ; then \
         :; \
@@ -360,9 +365,13 @@
       fi; \
       if [ "$(OWNING_PROJECT_HEADER_DIR_NAME)" = "" ]; then \
         if [ "$$type" = "framework" ]; then \
+          if [ "$(HAS_LN_S)" = "no" ]; then \
+            owning_project_header_dir="../$${instance}.framework/Headers" ; \
+          else \
           framework_version="$($(basename $(basename 
$*))_CURRENT_VERSION_NAME)"; \
           if [ "$$framework_version" = "" ]; then framework_version="A"; fi; \
           
owning_project_header_dir="../$${instance}.framework/Versions/$${framework_version}/Headers";
 \
+         fi; \
        else owning_project_header_dir=""; \
        fi; \
       else \
@@ -371,6 +380,7 @@
       if $(MAKE) -C $$f -f $$mf --no-keep-going $$operation \
           OWNING_PROJECT_HEADER_DIR_NAME="$${owning_project_header_dir}" \
           DERIVED_SOURCES="../$(DERIVED_SOURCES)" \
+          HEADERS_DIR_SUFFIX="$(HEADERS_DIR_SUFFIX)" \
           GNUSTEP_BUILD_DIR="$$gsbuild" \
         ; then \
         :; \
diff -u -r -w -x .svn gnustep-make-orig/configure.ac gnustep-make/configure.ac
--- gnustep-make-orig/configure.ac      Mon Sep  6 22:12:32 2004
+++ gnustep-make/configure.ac   Mon Jun 27 13:42:04 2005
@@ -115,6 +115,8 @@
   export AR=${AR:-ar}
   export RANLIB=${RANLIB:-ranlib}
   export DLLTOOL=${DLLTOOL:-dlltool}
+  as_ln_s='cp -rp'
+  LN_S='cp -rp'
 elif test "$CYGWIN" = yes; then
   echo "hosted on cygwin .."
   export CC=${CC:-gcc}
diff -u -r -w -x .svn gnustep-make-orig/rules.make gnustep-make/rules.make
--- gnustep-make-orig/rules.make        Fri Apr  2 01:28:02 2004
+++ gnustep-make/rules.make     Mon Jun 27 21:30:09 2005
@@ -145,9 +145,18 @@
 # it's a framework subproject, OWNING_PROJECT_HEADER_DIR_NAME will be
 # non-empty.
 #
+ifeq ($(HAS_LN_S),no)
+ifneq ($(FRAMEWORK_NAME),)
+  DERIVED_SOURCES_HEADERS_FLAG = -I$(FRAMEWORK_VERSION_DIR)/Headers
+endif
+ifneq ($(OWNING_PROJECT_HEADER_DIR_NAME),)
+  DERIVED_SOURCES_HEADERS_FLAG = -I$(OWNING_PROJECT_HEADER_DIR_NAME)
+endif
+else
 ifneq ($(FRAMEWORK_NAME)$(OWNING_PROJECT_HEADER_DIR_NAME),)
   DERIVED_SOURCES_HEADERS_FLAG = -I$(DERIVED_SOURCES_DIR)
 endif
+endif
 
 #
 # Include rules to built the instance
@@ -319,6 +328,9 @@
 
 # Then define our own.
 .SUFFIXES: .m .c .psw .java .h .cpp .cxx .C .cc .cp
+ifeq ($(findstring mingw32, $(GNUSTEP_TARGET_OS)), mingw32)
+.SUFFIXES: .rc
+endif
 
 .PRECIOUS: %.c %.h $(GNUSTEP_OBJ_DIR)/%${OEXT}
 
@@ -422,6 +434,11 @@
                                                        $(ALL_CFLAGS)   \
                                                        $(ALL_CCFLAGS)) \
              $($<_FILE_FLAGS) -o [EMAIL PROTECTED](END_ECHO)
+
+ifeq ($(findstring mingw32, $(GNUSTEP_TARGET_OS)), mingw32)
+$(GNUSTEP_OBJ_DIR)/%${OEXT} : %.rc
+       $(ECHO_COMPILING)windres $< [EMAIL PROTECTED](END_ECHO)
+endif
 
 %.class : %.java
        $(ECHO_COMPILING)$(JAVAC) \
diff -u -r -w -x .svn gnustep-make-orig/target.make gnustep-make/target.make
--- gnustep-make-orig/target.make       Tue Sep  7 05:53:51 2004
+++ gnustep-make/target.make    Wed Jun 22 15:10:47 2005
@@ -857,7 +857,10 @@
 SHARED_LIBEXT   = .a
 DLL_LIBEXT      = .dll
 DLLTOOL                 = dlltool
-DLLWRAP                 = dllwrap
+DLLWRAP                 = dllwrap -Wl,--enable-auto-import
+# even though there is a ln -s, it is just a cp -rp
+HAS_LN_S        = no
+LN_S            = cp -rp
 #SHARED_CFLAGS  += 
 
 OBJ_MERGE_CMD = \
@@ -866,6 +869,7 @@
 HAVE_BUNDLES   = yes
 BUNDLE_LD      = $(CC)
 BUNDLE_LDFLAGS += -nodefaultlibs -Xlinker -r
+ADDITIONAL_LDFLAGS += -Wl,--enable-auto-import
 endif
 
 # end Mingw32
diff -u -r -w -x .svn gnustep-make-orig/which_lib.c gnustep-make/which_lib.c
--- gnustep-make-orig/which_lib.c       Tue Jun 21 13:49:51 2005
+++ gnustep-make/which_lib.c    Thu Dec 23 12:46:36 2004
@@ -282,10 +282,19 @@
       struct stat statbuf;
       
       strcpy (full_filename, library_paths[i]);
+#ifdef __MINGW32__
+         /* Mingw can link against dlls directly, so we should look for 
library_name.dll then liblibrary_name.a */
+         strcat (full_filename, "/");
+#else    
       strcat (full_filename, "/lib");
+#endif
       strcat (full_filename, library_name);
       strcat (full_filename, suffix);
+#ifdef __MINGW32__
+      strcat (full_filename, ".dll");
+#else    
       strcat (full_filename, ext);
+#endif      
       
       if (show_all)
        {
@@ -295,6 +304,20 @@
       if (stat (full_filename, &statbuf) < 0)
        /* Error - likely that file doesn't exist.  */
        {
+#ifdef __MINGW32__
+               // On windows a shared library probably has a static "import" 
library
+             strcpy (full_filename, library_paths[i]);
+             strcat (full_filename, "/lib");
+             strcat (full_filename, library_name);
+             strcat (full_filename, suffix);
+             strcat (full_filename, ext);
+             
+             if (show_all)
+                       {
+                         fprintf (stderr, " %s\n", full_filename);
+                       }
+         if (stat (full_filename, &statbuf) < 0)
+#endif
          continue;
        }
       
_______________________________________________
Gnustep-dev mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/gnustep-dev

Reply via email to