|
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
