[BACK]Return to Makefile.DLLs CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / pari / config

Annotation of OpenXM_contrib/pari/config/Makefile.DLLs, Revision 1.1

1.1     ! maekawa     1: # This makefile is freely available from the website of Cygnus Solutions
        !             2: # at http://www.cygnus.com on the cygwin32 home page. The author is
        !             3: # Fergus Henderson <fjh@cs.mu.oz.au> http://www.cs.mu.oz.au/~fjh
        !             4: # Before using this file you should read and understand the documentation
        !             5: # on the Cygnus website.
        !             6: # This file comes with a suitable disclaimer; i.e.,
        !             7: # This is provided AS IS, with absolutely NO WARRANTY EITHER EXPRESSED
        !             8: # OR IMPLIED.
        !             9:
        !            10: #-----------------------------------------------------------------------------#
        !            11:
        !            12: # Makefile.DLLs, version 0.7.
        !            13:
        !            14: # This Makefile contains rules for creating DLLs on Windows using gnu-win32.
        !            15:
        !            16: #-----------------------------------------------------------------------------#
        !            17:
        !            18: # The SYM_PREFIX is used as a prefix for the symbols in the files
        !            19: # that this makefiles automatically generates.
        !            20: #
        !            21: # The default SYM_PREFIX for libfoo.dll is `libfoo'.
        !            22: # But you can override this by setting `SYM_PREFIX-libfoo = blah'.
        !            23:
        !            24: SYM_PREFIX = $(firstword $(SYM_PREFIX-$*) $*)
        !            25:
        !            26: GUARD_MACRO =          $(SYM_PREFIX)_GLOBALS_H
        !            27: DEFINE_DLL_MACRO =     $(SYM_PREFIX)_DEFINE_DLL
        !            28: USE_DLL_MACRO =                $(SYM_PREFIX)_USE_DLL
        !            29: IMP_MACRO =            $(SYM_PREFIX)_IMP
        !            30: GLOBAL_MACRO =         $(SYM_PREFIX)_GLOBAL
        !            31: IMPURE_PTR =           $(SYM_PREFIX)_impure_ptr
        !            32:
        !            33: # This rule creates a `.def' file, which lists the symbols that are exported
        !            34: # from the DLL.  We use `nm' to get a list of all the exported text (`T')
        !            35: # symbols and data symbols -- including uninitialized data (`B'),
        !            36: # initialized data (`D'), read-only data (`R'), and common blocks (`C').
        !            37: # We also export `_impure_ptr', suitably renamed, so that the
        !            38: # main program can do the necessary initialization of the DLL's _impure_ptr.
        !            39: # (Since there can be more than one DLL, we must rename _impure_ptr as
        !            40: # $(SYM_PREFIX)_impure_ptr to prevent name collisions.)
        !            41: %.def: %.a
        !            42:        echo EXPORTS > $@
        !            43:        echo $(IMPURE_PTR) = _impure_ptr >> $@
        !            44:        nm $< | sed -n '/^........ [BCDRT] _/s/[^_]*_//p' >> $@
        !            45:
        !            46: # We need to use macros to access global data:
        !            47: # the user of the DLL must refer to `bar' as `(*__imp_bar)'.
        !            48: # This rule creates a pair of files `foo_dll.h' and `foo_globals.h'
        !            49: # which contains macros for doing this.
        !            50: #
        !            51: # The DLL may also contain some references to _impure_ptr
        !            52: # (e.g. stdin is defined as a macro which expands to _impure_ptr.stdin).
        !            53: # We need to provide a definition for this (otherwise it will link in
        !            54: # the definition in libccrt.o, which causes lots of problems,
        !            55: # eventually leading to undefined symbol `WinMain').
        !            56: # The DLL's entry function (below) will initialize the _impure_ptr variable
        !            57: # in the DLL so that they point to the main program's reent_data struct.
        !            58:
        !            59: %_dll.h:
        !            60:        echo "/* automatically generated by Makefile.DLLs */"   > $@
        !            61:        echo "#ifndef $(GUARD_MACRO)"                           >> $@
        !            62:        echo "#define $(GUARD_MACRO)"                           >> $@
        !            63:        echo ""                                                 >> $@
        !            64:        echo "#if defined(__GNUC__) && defined(__CYGWIN32__)"   >> $@
        !            65:        echo "  #if defined($(USE_DLL_MACRO))"                  >> $@
        !            66:        echo "    #define $(IMP_MACRO)(name)    __imp_##name"   >> $@
        !            67:        echo "    #define $(GLOBAL_MACRO)(name) (*$(IMP_MACRO)(name))" >> $@
        !            68:        echo "    #include \"$*_globals.h\""                    >> $@
        !            69:        echo "  #endif /* $(USE_DLL_MACRO) */"                  >> $@
        !            70:        echo "#endif /* __GNUC__ && __CYGWIN32__ */"            >> $@
        !            71:        echo ""                                                 >> $@
        !            72:        echo "#endif /* $(GUARD_MACRO) */"                      >> $@
        !            73:
        !            74: %_globals.h: %.a
        !            75:        echo "/* automatically generated by Makefile.DLLs */"   > $@
        !            76:        for sym in $(IMPURE_PTR) \
        !            77:                `nm $< | grep '^........ [BCDR] _' | sed 's/[^_]*_//'`; \
        !            78:        do \
        !            79:                echo "#define $$sym     $(GLOBAL_MACRO)($$sym)" >> $@; \
        !            80:        done
        !            81:
        !            82: %_dll.c:
        !            83:        echo "/* automatically generated by Makefile.DLLs */"   > $@
        !            84:        echo "void *_impure_ptr;"                               >> $@
        !            85:
        !            86: # This rule creates the export object file (`foo.exp') which contains the
        !            87: # jump table array; this export object file becomes part of the DLL.
        !            88: # This rule also creates the import library (`foo_dll.a') which contains small
        !            89: # stubs for all the functions exported by the DLL which jump to them via the
        !            90: # jump table.  Executables that will use the DLL must be linked against this
        !            91: # stub library.
        !            92: %.exp %_dll.a : %.def
        !            93:        dlltool $(DLLTOOLFLAGS) $(DLLTOOLFLAGS-$*)              \
        !            94:                --def $<                                        \
        !            95:                --dllname $*.dll                                \
        !            96:                --output-exp $*.exp                             \
        !            97:                --output-lib $*_dll.a
        !            98:
        !            99: # The `sed' commands below are to convert DOS-style `C:\foo\bar'
        !           100: # pathnames into Unix-style `//c/foo/bar' pathnames.
        !           101: CYGWIN32_LIBS = $(shell echo                                   \
        !           102:        -L`dirname \`gcc -print-file-name=libgcc.a |            \
        !           103:        sed -e 's@^\\\\([A-Za-z]\\\\):@//\\\\1@g' -e 's@\\\\\\\\@/@g' \` ` \
        !           104:        -L`dirname \`gcc -print-file-name=libcygwin.a | \
        !           105:        sed -e 's@^\\\\([A-Za-z]\\\\):@//\\\\1@g' -e 's@\\\\\\\\@/@g' \` ` \
        !           106:        -L`dirname \`gcc -print-file-name=libkernel32.a | \
        !           107:        sed -e 's@^\\\\([A-Za-z]\\\\):@//\\\\1@g' -e 's@\\\\\\\\@/@g' \` ` \
        !           108:        -lgcc -lcygwin -lkernel32 -lgcc)
        !           109:
        !           110: # Making relocatable DLLs doesn't seem to work.
        !           111: # Not quite sure why.  The --image-base values below
        !           112: # where chosen at random, they seem to work on my machine.
        !           113: # DYNRELOC=no is the default
        !           114: # DLLDFLAGS-libgc +=   --image-base=0x2345000
        !           115: # DLLDFLAGS-libmer +=  --image-base=0x1234000
        !           116: # DLLDFLAGS-libmercury +=      --image-base=0x3456000
        !           117:
        !           118: ifeq "$(strip $(DYNRELOC))" "yes"
        !           119:
        !           120: # to create relocatable DLLs, we need to do two passes
        !           121: # (warning: this is untested)
        !           122: %.dll: %.exp %.a %_dll.o dll_init.o dll_fixup.o
        !           123:        $(DLLD) $(DLLDFLAGS) $(DLLDFLAGS-$*) --dll -o $*.base                   \
        !           124:                -e _dll_entry@12                                        \
        !           125:                $*.exp $*.a $*_dll.o                                    \
        !           126:                dll_init.o dll_fixup.o                                  \
        !           127:                $(LDLIBS) $(LDLIBS-$*)                                  \
        !           128:                $(CYGWIN32_LIBS)
        !           129:        # untested
        !           130:        dlltool $(DLLTOOLFLAGS) $(DLLTOOLFLAGS-$*)              \
        !           131:                --def $*.def                                    \
        !           132:                --dllname $*.dll                                \
        !           133:                --base-file $*.base                             \
        !           134:                --output-exp $*.exp
        !           135:        $(DLLD) $(DLLDFLAGS) $(DLLDFLAGS-$*) --dll -o $*.base                   \
        !           136:                -e _dll_entry@12                                        \
        !           137:                $*.exp $*.a $*_dll.o                                    \
        !           138:                dll_init.o dll_fixup.o                                  \
        !           139:                $(LDLIBS) $(LDLIBS-$*)                                  \
        !           140:                $(CYGWIN32_LIBS)
        !           141:        dlltool $(DLLTOOLFLAGS) $(DLLTOOLFLAGS-$*)              \
        !           142:                --def $*.def                                    \
        !           143:                --dllname $*.dll                                \
        !           144:                --base-file $*.base                             \
        !           145:                --output-exp $*.exp
        !           146:        # end untested stuff
        !           147:        $(DLLD) $(DLLDFLAGS) $(DLLDFLAGS-$*) --dll --base-file $*.base -o $@    \
        !           148:                -e _dll_entry@12                                        \
        !           149:                $*.exp $*.a $*_dll.o                                    \
        !           150:                dll_init.o dll_fixup.o                                  \
        !           151:                $(LDLIBS) $(LDLIBS-$*)                                  \
        !           152:                $(CYGWIN32_LIBS)
        !           153:        rm -f $*.base
        !           154:
        !           155: else
        !           156:
        !           157: %.dll: %.exp %.a %_dll.o dll_fixup.o dll_init.o
        !           158:        $(DLLD) $(DLLDFLAGS) $(DLLDFLAGS-$*) --dll -o $@                        \
        !           159:                -e _dll_entry@12                                        \
        !           160:                $*.exp $*.a $*_dll.o                                    \
        !           161:                dll_init.o dll_fixup.o                                  \
        !           162:                $(LDLIBS) $(LDLIBS-$*)                                  \
        !           163:                $(CYGWIN32_LIBS)
        !           164:
        !           165: endif
        !           166:
        !           167: # This black magic piece of assembler needs to be linked in in order to
        !           168: # properly terminate the list of imported DLLs.
        !           169: dll_fixup.s:
        !           170:        echo '.section .idata$$3'       > dll_fixup.s
        !           171:        echo '.long 0,0,0,0,0'          >> dll_fixup.s
        !           172:
        !           173: dll_fixup.o: dll_fixup.s
        !           174:        $(AS) $(ASFLAGS) -o dll_fixup.o dll_fixup.s
        !           175:
        !           176: # Windows requires each DLL to have an initialization function
        !           177: # that is called at certain points (thread/process attach/detach).
        !           178: # This one just initializes `_impure_ptr'.
        !           179: dll_init.c:
        !           180:        echo '#include <stdio.h>'                               > dll_init.c
        !           181:        echo 'extern struct _reent *_impure_ptr;'               >> dll_init.c
        !           182:        echo 'extern struct _reent *__imp_reent_data;'          >> dll_init.c
        !           183:        echo '__attribute__((stdcall))'                         >> dll_init.c
        !           184:        echo 'int dll_entry(int handle, int reason, void *ptr)' >> dll_init.c
        !           185:        echo '{ _impure_ptr=__imp_reent_data; return 1; }'      >> dll_init.c
        !           186:
        !           187: # The following rule is just there to convince gcc
        !           188: # to keep otherwise unused intermediate targets around.
        !           189: dont_throw_away: dll_fixup.o dll_init.o

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>