Note: Makefile.direct builds cord.a (not libcord.a or cord.lib).
* Makefile.direct: Update header comment about all and cords targets.
* Makefile.direct (all): Depend also on cords.
* Makefile.direct (cord.a): New target (duplicates cords target).
* Makefile.direct (cords): Do not depend on base_lib; create cord.a
instead of updating gc.a.
* Makefile.direct (cordtest, de): Depend on cords instead of
$(CORD_OBJS); pass cord.a (instead of $(CORD_OBJS)) to $(CC).
* NT_MAKEFILE (CFLAGS_MT): Move variable definition (which uses cvarsmt) to
be after CORDFLAG one.
* NT_MAKEFILE (CORDFLAG, COBJS): New variable.
* WCC_MAKEFILE (CORDFLAG, COBJS): Likewise.
* NT_MAKEFILE [!ENABLE_STATIC] (cvarsmt): Set variable value to empty;
add comment.
* NT_MAKEFILE (all): Depend also on cord.lib.
* OS2_MAKEFILE (all): Likewise.
* WCC_MAKEFILE (all): Likewise.
* NT_MAKEFILE (check): Depend also on cordtest.exe; run also cordtest.
* WCC_MAKEFILE (check): Likewise.
* NT_MAKEFILE (.c.obj): Remove -DCORD_NOT_DLL; add $(CORDFLAG).
* NT_MAKEFILE (cord.lib, cordtest.exe): New target.
* OS2_MAKEFILE (cord.lib, cordtest.exe, clean): Likewise.
* WCC_MAKEFILE (cord.lib, cordtest.exe, cordbscs.obj, cordxtra.obj,
cordprnt.obj, cordtest.obj): Likewise.
* WCC_MAKEFILE [!ENABLE_STATIC] (cord.dll): Likewise.
* NT_MAKEFILE (de.exe): Depend on cord.lib instead of cordbscs.obj and
cordxtra.obj.
* NT_MAKEFILE (clean): Delete cordtst*.tmp files; delete *.lib, *.dll,
and *.exp files instead of gc*.lib, gc*.dll, gc*.exp, cord\*.exe,
cord\*.exp, cord\*.lib, cord\*.pdb.
* README.md (Installation and Portability): Update information about
"make cords".
# to build the collector.
#
# Primary targets:
-# all - builds gc.a, gccpp.a
+# all - builds gc.a, gccpp.a and cord.a
# base_lib - builds gc.a only (basic library)
# c++ - builds gccpp.a only (C++ interface to library)
-# cords - adds cords (heavyweight strings) to library
+# cords - builds cord.a only (heavyweight strings library)
# check - same as "all" but also prints porting information, and runs some
# tests of collector and cords
# check-cpp - builds gc.a and gccpp.a, runs C++ only test
# not time-critical anyway.
# Set SPECIALCFLAGS to -q nodirect_code on Encore.
-all: base_lib c++
+all: base_lib cords c++
atomic_ops.o: $(AO_SRC_DIR)/src/atomic_ops.c
$(CC) $(CFLAGS) -c -o $@ $(AO_SRC_DIR)/src/atomic_ops.c
# Ignore ranlib failure; that usually means it doesn't exist, and
# isn't needed.
-cords: $(CORD_OBJS) $(UTILS) base_lib
+cords cord.a: $(CORD_OBJS) $(UTILS)
rm -f dont_ar_3
./if_mach SPARC SOLARIS touch dont_ar_3
- ./if_mach SPARC SOLARIS $(AR) rus gc.a $(CORD_OBJS)
+ ./if_mach SPARC SOLARIS $(AR) rus cord.a $(CORD_OBJS)
./if_mach M68K AMIGA touch dont_ar_3
- ./if_mach M68K AMIGA $(AR) -vrus gc.a $(CORD_OBJS)
- ./if_not_there dont_ar_3 || $(AR) ru gc.a $(CORD_OBJS)
- ./if_not_there dont_ar_3 || $(RANLIB) gc.a || cat /dev/null
+ ./if_mach M68K AMIGA $(AR) -vrus cord.a $(CORD_OBJS)
+ ./if_not_there dont_ar_3 || $(AR) ru cord.a $(CORD_OBJS)
+ ./if_not_there dont_ar_3 || $(RANLIB) cord.a || cat /dev/null
echo > cords
gc_cpp.o: $(srcdir)/gc_cpp.cc $(srcdir)/include/gc_cpp.h $(srcdir)/include/gc.h
mkdir cord || cat /dev/null
mv cordprnt.o cord/cordprnt.o
-cordtest$(EXEEXT): $(srcdir)/cord/tests/cordtest.c $(CORD_OBJS) \
- base_lib $(UTILS)
+cordtest$(EXEEXT): $(srcdir)/cord/tests/cordtest.c cords base_lib $(UTILS)
rm -f cordtest$(EXEEXT)
- ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o cordtest $(srcdir)/cord/tests/cordtest.c $(CORD_OBJS) gc.a -lucb
- ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o cordtest $(srcdir)/cord/tests/cordtest.c $(CORD_OBJS) gc.a -ldld `./threadlibs`
- ./if_mach M68K AMIGA $(CC) $(CFLAGS) -UGC_AMIGA_MAKINGLIB -o cordtest $(srcdir)/cord/tests/cordtest.c $(CORD_OBJS) gc.a `./threadlibs`
- ./if_not_there cordtest$(EXEEXT) || $(CC) $(CFLAGS) -o cordtest$(EXEEXT) $(srcdir)/cord/tests/cordtest.c $(CORD_OBJS) gc.a `./threadlibs`
+ ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o cordtest $(srcdir)/cord/tests/cordtest.c gc.a cord.a -lucb
+ ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o cordtest $(srcdir)/cord/tests/cordtest.c gc.a cord.a -ldld `./threadlibs`
+ ./if_mach M68K AMIGA $(CC) $(CFLAGS) -UGC_AMIGA_MAKINGLIB -o cordtest $(srcdir)/cord/tests/cordtest.c gc.a cord.a `./threadlibs`
+ ./if_not_there cordtest$(EXEEXT) || $(CC) $(CFLAGS) -o cordtest$(EXEEXT) $(srcdir)/cord/tests/cordtest.c gc.a cord.a `./threadlibs`
cord/de: de$(EXEEXT)
de$(EXEEXT): $(srcdir)/cord/tests/de.c $(srcdir)/cord/tests/de_win.c \
- $(srcdir)/cord/tests/de_win.h cord/cordbscs.o cord/cordxtra.o base_lib \
- $(UTILS)
+ $(srcdir)/cord/tests/de_win.h cords base_lib $(UTILS)
rm -f de$(EXEEXT)
- ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o de $(srcdir)/cord/tests/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses -ltermlib -lucb `./threadlibs`
- ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o de $(srcdir)/cord/tests/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses -ltermlib -ldld `./threadlibs`
- ./if_mach POWERPC AIX $(CC) $(CFLAGS) -o de $(srcdir)/cord/tests/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses
- ./if_mach POWERPC DARWIN $(CC) $(CFLAGS) -o de $(srcdir)/cord/tests/de.c cord/cordbscs.o cord/cordxtra.o gc.a
- ./if_mach M68K AMIGA $(CC) $(CFLAGS) -UGC_AMIGA_MAKINGLIB -o de $(srcdir)/cord/tests/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses
- ./if_not_there de$(EXEEXT) || $(CC) $(CFLAGS) -o de$(EXEEXT) $(srcdir)/cord/tests/de.c $(srcdir)/cord/tests/de_win.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) `./threadlibs`
+ ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o de $(srcdir)/cord/tests/de.c gc.a cord.a -lcurses -ltermlib -lucb `./threadlibs`
+ ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o de $(srcdir)/cord/tests/de.c gc.a cord.a -lcurses -ltermlib -ldld `./threadlibs`
+ ./if_mach POWERPC AIX $(CC) $(CFLAGS) -o de $(srcdir)/cord/tests/de.c gc.a cord.a -lcurses
+ ./if_mach POWERPC DARWIN $(CC) $(CFLAGS) -o de $(srcdir)/cord/tests/de.c gc.a cord.a
+ ./if_mach M68K AMIGA $(CC) $(CFLAGS) -UGC_AMIGA_MAKINGLIB -o de $(srcdir)/cord/tests/de.c gc.a cord.a -lcurses
+ ./if_not_there de$(EXEEXT) || $(CC) $(CFLAGS) -o de$(EXEEXT) $(srcdir)/cord/tests/de.c $(srcdir)/cord/tests/de_win.c gc.a cord.a $(CURSES) `./threadlibs`
if_mach$(EXEEXT): $(srcdir)/tools/if_mach.c \
$(srcdir)/include/private/gcconfig.h
CFLAGS_DEBUG=-DGC_ASSERTIONS
!ENDIF
-!IFNDEF DISABLE_THREADS
-CFLAGS_MT=$(cvarsmt) -DGC_THREADS -DTHREAD_LOCAL_ALLOC -DPARALLEL_MARK
-!ENDIF
-
!IFDEF ENABLE_STATIC
CFLAGS_GCDLL=-DGC_NOT_DLL
+CORDFLAG=
!ELSE
CFLAGS_GCDLL=-DGC_DLL
+# cord.dll and its clients should not link C library statically otherwise
+# FILE-related functions might not work (because own set of opened FILEs
+# is maintained by each copy of the C library thus making impossible to pass
+# FILE pointer from .exe code to .dll code).
+cvarsmt=
+!IFDEF NODEBUG
+CORDFLAG=-MD
+!ELSE
+CORDFLAG=-MDd
+!ENDIF
+!ENDIF
+
+!IFNDEF DISABLE_THREADS
+CFLAGS_MT=$(cvarsmt) -DGC_THREADS -DTHREAD_LOCAL_ALLOC -DPARALLEL_MARK
!ENDIF
CFLAGS_SPECIFIC=$(CFLAGS_DEBUG) $(CFLAGS_GCDLL) $(CFLAGS_MT)
OBJS= misc.obj win32_threads.obj alloc.obj reclaim.obj allchblk.obj mach_dep.obj os_dep.obj mark_rts.obj headers.obj mark.obj obj_map.obj blacklst.obj finalize.obj new_hblk.obj dbg_mlc.obj fnlz_mlc.obj malloc.obj dyn_load.obj typd_mlc.obj ptr_chck.obj gcj_mlc.obj mallocx.obj extra\msvc_dbg.obj thread_local_alloc.obj
-all: gc.lib gccpp.lib
+COBJS= cord\cordbscs.obj cord\cordxtra.obj cord\cordprnt.obj
+
+all: gc.lib cord.lib gccpp.lib
-check: gctest.exe test_cpp.exe de.exe
+check: gctest.exe test_cpp.exe cordtest.exe de.exe
gctest.exe
+ cordtest.exe
test_cpp.exe
.c.obj:
- $(cc) $(cdebug) $(cflags) $(CFLAGS_SPECIFIC) -Iinclude -I$(AO_INCLUDE_DIR) $(CFLAGS_DEFAULT) -DCORD_NOT_DLL -D_CRT_SECURE_NO_DEPRECATE $*.c /Fo$*.obj /wd4100 /wd4127 /wd4701
+ $(cc) $(cdebug) $(cflags) $(CFLAGS_SPECIFIC) $(CORDFLAG) -Iinclude -I$(AO_INCLUDE_DIR) $(CFLAGS_DEFAULT) -D_CRT_SECURE_NO_DEPRECATE $*.c /Fo$*.obj /wd4100 /wd4127 /wd4701
# Disable crt security warnings, since unfortunately they warn about all sorts
# of safe uses of strncpy. It would be nice to leave the rest enabled.
gc.lib: $(OBJS)
lib /out:gc.lib /MACHINE:$(CPU) $(OBJS)
+cord.lib: $(COBJS)
+ lib /out:cord.lib /MACHINE:$(CPU) $(COBJS)
+
gccpp.lib: gc_cpp.obj
lib /out:gccpp.lib /MACHINE:$(CPU) gc_cpp.obj
gc.lib: $(OBJS)
$(link) $(ldebug) kernel32.lib user32.lib /subsystem:windows /dll /INCREMENTAL:NO /pdb:"gc.pdb" /out:gc.dll /implib:gc.lib /MACHINE:$(CPU) $(OBJS)
+cord.lib: $(COBJS) gc.lib
+ $(link) $(ldebug) gc.lib /subsystem:windows /dll /INCREMENTAL:NO /pdb:"cord.pdb" /out:cord.dll /implib:cord.lib /MACHINE:$(CPU) $(COBJS)
+
gccpp.lib: gc_cpp.obj gc.lib
$(link) $(ldebug) gc.lib /subsystem:windows /dll /INCREMENTAL:NO /pdb:"gccpp.pdb" /out:gccpp.dll /implib:gccpp.lib /MACHINE:$(CPU) gc_cpp.obj
$(rc) $(rcvars) -r -fo cord\tests\de_win.res cord\tests\de_win.rc
# Cord/de is a real win32 GUI app.
-de.exe: cord\cordbscs.obj cord\cordxtra.obj cord\tests\de.obj cord\tests\de_win.obj cord\tests\de_win.rbj gc.lib
- $(link) /MACHINE:$(CPU) /INCREMENTAL:NO $(ldebug) $(lflags) -out:de.exe cord\cordbscs.obj cord\cordxtra.obj cord\tests\de.obj cord\tests\de_win.obj cord\tests\de_win.rbj gc.lib gdi32.lib user32.lib
+de.exe: cord\tests\de.obj cord\tests\de_win.obj cord\tests\de_win.rbj gc.lib cord.lib
+ $(link) /MACHINE:$(CPU) /INCREMENTAL:NO $(ldebug) $(lflags) -out:de.exe cord\tests\de.obj cord\tests\de_win.obj cord\tests\de_win.rbj gc.lib cord.lib gdi32.lib user32.lib
+
+cordtest.exe: cord\tests\cordtest.obj gc.lib cord.lib
+ $(link) /subsystem:console /MACHINE:$(CPU) /INCREMENTAL:NO $(ldebug) $(lflags) -out:cordtest.exe cord\tests\cordtest.obj gc.lib cord.lib user32.lib
gc_cpp.obj: gc_cpp.cc include\gc_cpp.h include\gc.h
tar xvfz $(AO_SRC_DIR).tar.gz
clean:
- del *.exe *.log *.obj *.pdb cord\*.exe cord\*.exp cord\*.lib cord\*.obj cord\*.pdb cord\tests\*.rbj cord\tests\*.res cord\tests\*.obj extra\*.obj gc*.lib gc*.dll gc*.exp test_cpp.cpp tests\*.obj 2> nul
+ del *.dll *.exe *.exp *.lib *.log *.obj *.pdb cordtst*.tmp cord\*.obj cord\tests\*.rbj cord\tests\*.res cord\tests\*.obj extra\*.obj test_cpp.cpp tests\*.obj 2> nul
# Setjmp_test may yield overly optimistic results when compiled
# without optimization.
-all: gc.lib
+all: gc.lib cord.lib
check: gctest.exe cordtest.exe
gctest.exe
cord\cordprnt.obj: cord\cordprnt.c include\cord.h include\cord_pos.h include\ec.h
$(CC) $(CFLAGS) /C /Focord\cordprnt cord\cordprnt.c
-cordtest.exe: cord\tests\cordtest.c include\cord.h include\cord_pos.h include\ec.h $(CORDOBJS) gc.lib
- $(CC) $(CFLAGS) /B"/STACK:65536" /Fecordtest cord\tests\cordtest.c gc.lib $(CORDOBJS)
+cord.lib: $(CORDOBJS)
+ echo . > cord.lib
+ erase cord.lib
+ LIB cord.lib $(CORDOBJS), cord.lst
+
+cordtest.exe: cord\tests\cordtest.c include\cord.h include\cord_pos.h include\ec.h gc.lib cord.lib
+ $(CC) $(CFLAGS) /B"/STACK:65536" /Fecordtest cord\tests\cordtest.c gc.lib cord.lib
+
+clean:
+ erase gc.lib cord.lib
+ erase gctest.exe cordtest.exe
+ erase $(OBJS) $(CORDOBJS)
attempt to build and test the "cord" string library.)
Makefile.direct will generate a library gc.a which you should link against.
-Typing "make cords" will add the cord library to gc.a.
+Typing "make cords" will build the cord library (cord.a).
The GNU style build process understands the usual targets. `make check`
runs a number of tests. `make install` installs at least libgc, and libcord.
!ifdef ENABLE_STATIC
DLLFLAG=
TEST_DLLFLAG=-DGC_NOT_DLL
+CORDFLAG=
!else
DLLFLAG=-bd -DGC_DLL
TEST_DLLFLAG=-DGC_DLL
+# cord.dll and its clients should not link C library statically otherwise
+# FILE-related functions might not work (because own set of opened FILEs
+# is maintained by each copy of the C library thus making impossible to pass
+# FILE pointer from, e.g., .exe code to .dll one).
+CORDFLAG=-br
!endif
CC=wcc386
dbg_mlc.obj malloc.obj dyn_load.obj &
typd_mlc.obj ptr_chck.obj mallocx.obj fnlz_mlc.obj gcj_mlc.obj
-all: gc.lib gccpp.lib
+COBJS= cordbscs.obj cordxtra.obj cordprnt.obj
-check: gctest.exe test_cpp.exe .SYMBOLIC
+all: gc.lib gccpp.lib cord.lib
+
+check: gctest.exe test_cpp.exe cordtest.exe .SYMBOLIC
*gctest.exe
*test_cpp.exe
+ *cordtest.exe
!ifdef ENABLE_STATIC
@for %i in ($(OBJS)) do @%append $*.lb1 +'%i'
*wlib -b -c -n -p=512 $@ @$*.lb1
+cord.lib: $(COBJS)
+ @%create $*.lb1
+ @for %i in ($(COBJS)) do @%append $*.lb1 +'%i'
+ *wlib -b -c -n -p=512 $@ @$*.lb1
+
gccpp.lib: gc_cpp.obj
@%create $*.lb1
@%append $*.lb1 +'gc_cpp.obj'
@for %i in ($(OBJS)) do @%append $*.lnk file '%i'
*wlink @$*.lnk
+cord.lib: cord.dll
+ *wlib -b -c -n -p=512 $@ +cord.dll
+
+cord.dll: $(COBJS) gc.lib .AUTODEPEND
+ @%create $*.lnk
+!ifdef DOS4GW
+ @%append $*.lnk sys os2v2_dll
+!else ifdef MSWIN32
+ @%append $*.lnk sys nt_dll
+!else ifdef OS2
+ @%append $*.lnk sys os2v2_dll
+!endif
+ @%append $*.lnk op case
+ @%append $*.lnk name $*
+ @for %i in ($(COBJS)) do @%append $*.lnk file '%i'
+ @%append $*.lnk library gc.lib
+ *wlink @$*.lnk
+
gccpp.lib: gccpp.dll
*wlib -b -c -n -p=512 $@ +gccpp.dll
@%append $*.lnk library gc.lib
*wlink @$*.lnk
+cordtest.exe: cordtest.obj gc.lib cord.lib
+ %create $*.lnk
+!ifdef DOS4GW
+ @%append $*.lnk sys dos4g
+!else ifdef MSWIN32
+ @%append $*.lnk sys nt
+!else ifdef OS2
+ @%append $*.lnk sys os2v2
+!endif
+ @%append $*.lnk op case
+ @%append $*.lnk op stack=256K
+ @%append $*.lnk name $*
+ @%append $*.lnk file cordtest.obj
+ @%append $*.lnk library gc.lib
+ @%append $*.lnk library cord.lib
+ *wlink @$*.lnk
+
test_cpp.exe: test_cpp.obj gc.lib gccpp.lib
%create $*.lnk
!ifdef DOS4GW
@%append $*.lnk library gccpp.lib
*wlink @$*.lnk
+cordbscs.obj: cord\cordbscs.c .AUTODEPEND
+ $(CC) $(CFLAGS) $(CORDFLAG) cord\cordbscs.c
+cordxtra.obj: cord\cordxtra.c .AUTODEPEND
+ $(CC) $(CFLAGS) $(CORDFLAG) cord\cordxtra.c
+cordprnt.obj: cord\cordprnt.c .AUTODEPEND
+ $(CC) $(CFLAGS) $(CORDFLAG) cord\cordprnt.c
+
gc_cpp.obj: gc_cpp.cc .AUTODEPEND
$(CXX) $(TEST_CXXFLAGS) $*.cc
test.obj: tests\test.c .AUTODEPEND
$(CC) $(TEST_CFLAGS) /wcd=13 /wcd=201 /wcd=367 /wcd=368 tests\test.c
+cordtest.obj: cord\tests\cordtest.c .AUTODEPEND
+ $(CC) $(TEST_CFLAGS) $(CORDFLAG) cord\tests\cordtest.c
test_cpp.obj: tests\test_cpp.cc .AUTODEPEND
$(CXX) $(TEST_CXXFLAGS) tests\test_cpp.cc