2 # Copyright (c) 1994 by Xerox Corporation. All rights reserved.
3 # Copyright (c) 1996 by Silicon Graphics. All rights reserved.
4 # Copyright (c) 1998 by Fergus Henderson. All rights reserved.
5 # Copyright (c) 2000-2010 by Hewlett-Packard Company. All rights reserved.
7 # THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
8 # OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
10 # Permission is hereby granted to use or copy this program
11 # for any purpose, provided the above notices are retained on all copies.
12 # Permission to modify the code and to distribute modified code is granted,
13 # provided the above notices are retained, and a notice that the code was
14 # modified is included with the above copyright notice.
19 # cmake -G "Visual Studio 8 2005"
20 # in the same dir as this file
21 # this will generate gc.sln
24 option(enable_cplusplus "C++ support" OFF)
33 cmake_minimum_required(VERSION 3.1)
35 # Customize the build by passing "-D<option_name>=ON|OFF" in the command line.
36 option(BUILD_SHARED_LIBS "Build shared libraries" ON)
37 option(build_cord "Build cord library" ON)
38 option(build_tests "Build tests" OFF)
39 option(enable_threads "TODO" OFF) #TODO Support it
40 option(enable_parallel_mark "Parallelize marking and free list construction" ON)
41 option(enable_thread_local_alloc "Turn on thread-local allocation optimization" ON)
42 option(enable_threads_discovery "Enable threads discovery in GC" ON)
43 option(enable_gcj_support "Support for gcj" ON)
44 option(enable_sigrt_signals "Use SIGRTMIN-based signals for thread suspend/resume" OFF)
45 option(enable_gc_debug "Support for pointer back-tracing" OFF)
46 option(enable_java_finalization "Support for java finalization" ON)
47 option(enable_atomic_uncollectable "Support for atomic uncollectible allocation" ON)
48 option(enable_redirect_malloc "Redirect malloc and friends to GC routines" OFF)
49 option(enable_disclaim "Support alternative finalization interface" ON)
50 option(enable_large_config "Optimize for large heap or root set" OFF)
51 option(enable_gc_assertions "Enable collector-internal assertion checking" OFF)
52 option(enable_mmap "Use mmap instead of sbrk to expand the heap" OFF)
53 option(enable_munmap "Return page to the OS if empty for N collections" ON)
54 option(enable_dynamic_loading "Enable tracing of dynamic library data roots" ON)
55 option(enable_register_main_static_data "Perform the initial guess of data root sets" ON)
56 option(enable_checksums "Report erroneously cleared dirty bits" OFF)
57 option(enable_werror "Pass -Werror to the C compiler (treat warnings as errors)" OFF)
58 option(enable_single_obj_compilation "Compile all libgc source files into single .o" OFF)
59 option(enable_handle_fork "Attempt to ensure a usable collector after fork()" ON)
60 option(install_headers "Install header files" ON)
62 add_definitions("-DALL_INTERIOR_POINTERS -DNO_EXECUTE_PERMISSION")
64 if (APPLE AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL ""))
65 set(CMAKE_OSX_ARCHITECTURES "x86_64;i386"
66 CACHE STRING "Build architectures for Mac OS X" FORCE)
69 # Set struct packing alignment to word (instead of 1-byte).
71 add_compile_options(/a4)
73 add_compile_options(/zp4)
76 # Output all warnings.
78 # All warnings except for particular ones.
79 add_compile_options(/w /w-pro /w-aus /w-par /w-ccc /w-inl /w-rch)
81 # All warnings but ignoring "unreferenced formal parameter" and
82 # "conditional expression is constant" ones.
83 add_compile_options(/W4 /wd4100 /wd4127)
84 # Disable crt security warnings, since unfortunately they warn about all
85 # sorts of safe uses of strncpy.
86 add_definitions("-D_CRT_SECURE_NO_DEPRECATE")
88 add_compile_options(/wx)
90 # TODO add -[W]pedantic -Wno-long-long
91 add_compile_options(-Wall -Wextra)
94 include_directories(include)
95 include_directories(libatomic_ops/src)
97 set(SRC alloc.c reclaim.c allchblk.c misc.c mach_dep.c os_dep.c
98 mark_rts.c headers.c mark.c obj_map.c blacklst.c finalize.c
99 new_hblk.c dbg_mlc.c malloc.c dyn_load.c typd_mlc.c ptr_chck.c
104 find_package(Threads REQUIRED)
105 message("Thread Model: ${CMAKE_THREAD_LIBS_INIT}" )
106 include_directories(${Threads_INCLUDE_DIR})
107 set(LIBS ${LIBS} ${Threads_LIBRARIES})
111 # ADD_DEFINITIONS("")
113 # MESSAGE("Parallel mark requires enable_threads ON" )
114 #ENDIF(Threads_FOUND)
116 set(_HOST ${CMAKE_HOST_SYSTEM_PROCESSOR}--${CMAKE_SYSTEM})
117 #FIXME missing the vendor field.
118 string(TOLOWER ${_HOST} HOST)
119 message("HOST = ${HOST}")
121 # Thread Detection. Relying on cmake for lib and includes.
122 #TODO check cmake detection
123 if (CMAKE_USE_PTHREADS_INIT)
124 set(SRC ${SRC} pthread_start.c pthread_support.c pthread_stop_world.c)
125 # Common defines for most POSIX platforms.
126 if (HOST MATCHES .*-.*-aix.*|.*-.*-android.*|.*-.*-cygwin.*|.*-.*-darwin.*|.*-.*-.*freebsd.*|.*-.*-haiku.*|.*-.*-gnu.*|.*-.*-hpux11.*|.*-.*-irix.*|.*-.*-.*linux.*|.*-.*-msys.*|.*-.*-nacl.*|.*-.*-netbsd.*|.*-.*-openbsd.*|.*-.*-osf.*|.*-.*-solaris.*)
127 add_definitions("-DGC_THREADS -D_REENTRANT")
128 if (enable_parallel_mark)
129 add_definitions("-DPARALLEL_MARK")
131 if (enable_thread_local_alloc)
132 add_definitions("-DTHREAD_LOCAL_ALLOC")
133 set(SRC ${SRC} thread_local_alloc.c)
135 message("Explicit GC_INIT() calls may be required.")
137 if (HOST MATCHES .*-.*-hpux11.*)
138 message("Only HP/UX 11 POSIX threads are supported.")
139 add_definitions("-D_POSIX_C_SOURCE=199506L")
140 #TODO test -DVAR=value. Alternative is COMPILE_DEFINITIONS property
142 if (HOST MATCHES .*-.*-hpux10.*)
143 message("HP/UX 10 POSIX threads are not supported.")
145 if (HOST MATCHES .*-.*-netbsd.*)
146 message("Only on NetBSD 2.0 or later.")
147 add_definitions("-D_PTHREADS")
149 if (HOST MATCHES .*-.*-android.*)
150 # Android NDK does not provide pthread_atfork.
151 elseif (HOST MATCHES .*-.*-aix.*|.*-.*-cygwin.*|.*-.*-freebsd.*|.*-.*-haiku.*|.*-.*-hpux11.*|.*-.*-irix.*|.*-.*-kfreebsd.*-gnu|.*-.*-.*linux.*|.*-.*-netbsd.*|.*-.*-openbsd.*|.*-.*-osf.*|.*-.*-solaris.*)
152 if (enable_handle_fork)
153 add_definitions("-DHANDLE_FORK")
154 endif(enable_handle_fork)
156 if (HOST MATCHES .*-.*-cygwin.*|.*-.*-msys.*)
157 set(SRC ${SRC} win32_threads.c)
159 if (HOST MATCHES .*-.*-darwin.*)
160 if (enable_handle_fork)
161 # The incremental mode conflicts with fork handling.
162 if (enable_parallel_mark)
163 add_definitions("-DHANDLE_FORK")
165 endif(enable_handle_fork)
166 set(SRC ${SRC} darwin_stop_world.c)
167 #TODO darwin_threads=true
169 if (enable_sigrt_signals)
170 add_definitions("-DGC_USESIGRT_SIGNALS")
172 endif(CMAKE_USE_PTHREADS_INIT)
174 if (CMAKE_USE_WIN32_THREADS_INIT)
175 add_definitions("-DGC_THREADS")
176 if (enable_parallel_mark)
177 add_definitions("-DPARALLEL_MARK")
178 if (enable_thread_local_alloc)
179 add_definitions("-DTHREAD_LOCAL_ALLOC")
180 set(SRC ${SRC} thread_local_alloc.c)
182 endif(enable_parallel_mark)
183 add_definitions("-DEMPTY_GETENV_RESULTS")
184 set(SRC ${SRC} win32_threads.c)
185 endif(CMAKE_USE_WIN32_THREADS_INIT)
187 if (enable_gcj_support)
188 add_definitions("-DGC_GCJ_SUPPORT")
190 add_definitions("-DGC_ENABLE_SUSPEND_THREAD")
192 set(SRC ${SRC} gcj_mlc.c)
193 endif(enable_gcj_support)
196 add_definitions("-DENABLE_DISCLAIM")
197 set(SRC ${SRC} fnlz_mlc.c)
200 if (enable_java_finalization)
201 add_definitions("-DJAVA_FINALIZATION")
204 if (enable_atomic_uncollectable)
205 add_definitions("-DGC_ATOMIC_UNCOLLECTABLE")
209 add_definitions("-DDBG_HDRS_ALL -DKEEP_BACK_PTRS")
210 if (HOST MATCHES ia64-.*-linux.*|i586-.*-linux.*|i686-.*-linux.*|x86-.*-linux.*|x86_64-.*-linux.*)
211 add_definitions("-DMAKE_BACK_GRAPH")
212 add_definitions("-DSAVE_CALL_COUNT=8")
213 set(SRC ${SRC} backgraph.c)
215 if (HOST MATCHES i.86-.*-dgux.*)
216 add_definitions("-DMAKE_BACK_GRAPH")
217 set(SRC ${SRC} backgraph.c)
219 endif(enable_gc_debug)
221 if (enable_redirect_malloc)
223 add_definitions("-DREDIRECT_MALLOC=GC_debug_malloc_replacement")
224 add_definitions("-DREDIRECT_REALLOC=GC_debug_realloc_replacement")
225 add_definitions("-DREDIRECT_FREE=GC_debug_free")
227 add_definitions("-DREDIRECT_MALLOC=GC_malloc")
229 add_definitions("-DGC_USE_DLOPEN_WRAP")
230 endif(enable_redirect_malloc)
233 add_definitions("-DUSE_MMAP -DUSE_MUNMAP")
235 add_definitions("-DUSE_MMAP")
238 if (NOT enable_dynamic_loading)
239 add_definitions("-DIGNORE_DYNAMIC_LOADING")
242 if (NOT enable_register_main_static_data)
243 add_definitions("-DGC_DONT_REGISTER_MAIN_STATIC_DATA")
246 if (enable_large_config)
247 add_definitions("-DLARGE_CONFIG")
250 if (enable_gc_assertions)
251 add_definitions("-DGC_ASSERTIONS")
254 if (NOT enable_threads_discovery)
255 add_definitions("-DGC_NO_THREADS_DISCOVERY")
258 if (enable_checksums)
259 if (enable_munmap OR enable_threads)
260 message(FATAL_ERROR "CHECKSUMS not compatible with USE_MUNMAP or threads")
262 add_definitions("-DCHECKSUMS")
263 set(SRC ${SRC} checksums.c)
264 endif(enable_checksums)
268 add_compile_options(/w!)
270 add_compile_options(/WX)
271 # Workaround "typedef ignored on left of ..." warning reported in
272 # imagehlp.h of e.g. Windows Kit 8.1.
273 add_compile_options(/wd4091)
275 add_compile_options(/we)
277 add_compile_options(-Werror)
279 # _dyld_bind_fully_image_containing_address is deprecated in OS X 10.5+
280 add_compile_options(-Wno-deprecated-declarations)
285 if (enable_single_obj_compilation OR BUILD_SHARED_LIBS)
286 set(SRC extra/gc.c) # override SRC
287 if (CMAKE_USE_PTHREADS_INIT)
288 add_definitions("-DGC_PTHREAD_START_STANDALONE")
289 set(SRC ${SRC} pthread_start.c)
290 endif(CMAKE_USE_PTHREADS_INIT)
292 # Suppress "GC_push_contents_hdr() is declared but never used" warning.
293 add_compile_options(/w-use)
296 # Add implementation of backtrace() and backtrace_symbols().
298 set(SRC ${SRC} extra/msvc_dbg.c)
301 if (BUILD_SHARED_LIBS)
302 add_definitions("-DGC_DLL")
304 add_definitions("-DGC_NOT_DLL")
306 # Do not require the clients to link with "user32" system library.
307 add_definitions("-DDONT_USE_USER32_DLL")
311 # Extra user-defined flags to pass both to C and C++ compilers.
312 if (DEFINED CFLAGS_EXTRA)
313 add_compile_options(${CFLAGS_EXTRA})
316 add_library(gc ${SRC})
318 if (enable_cplusplus)
319 add_library(gccpp gc_cpp.cc)
320 target_link_libraries(gccpp PRIVATE gc)
324 set(CORD_SRC cord/cordbscs.c cord/cordprnt.c cord/cordxtra.c)
325 add_library(cord ${CORD_SRC})
326 target_link_libraries(cord PRIVATE gc)
327 install(TARGETS cord EXPORT cordExports
328 LIBRARY DESTINATION lib
329 ARCHIVE DESTINATION lib
330 RUNTIME DESTINATION bin
331 INCLUDES DESTINATION include)
334 install(TARGETS gc EXPORT gcExports
335 LIBRARY DESTINATION lib
336 ARCHIVE DESTINATION lib
337 RUNTIME DESTINATION bin
338 INCLUDES DESTINATION include)
340 if (enable_cplusplus)
341 install(TARGETS gccpp EXPORT gccppExports
342 LIBRARY DESTINATION lib
343 ARCHIVE DESTINATION lib
344 RUNTIME DESTINATION bin
345 INCLUDES DESTINATION include)
349 install(FILES include/gc.h
351 include/gc_config_macros.h
355 include/gc_pthread_redirects.h
360 include/leak_detector.h
361 DESTINATION include/gc)
362 install(FILES include/extra/gc.h DESTINATION include)
363 if (enable_cplusplus)
364 install(FILES include/gc_allocator.h
366 DESTINATION include/gc)
367 install(FILES include/extra/gc_cpp.h DESTINATION include)
370 install(FILES include/gc_disclaim.h DESTINATION include/gc)
373 install(FILES include/cord.h
376 DESTINATION include/gc)
378 endif(install_headers)
382 add_executable(cordtest cord/tests/cordtest.c)
383 target_link_libraries(cordtest PRIVATE cord gc)
384 add_test(NAME cordtest COMMAND cordtest)
386 if (WIN32 AND NOT CYGWIN)
387 add_executable(de cord/tests/de.c cord/tests/de_win.c
388 cord/tests/de_win.rc)
389 set_target_properties(de PROPERTIES WIN32_EXECUTABLE TRUE)
390 target_link_libraries(de PRIVATE cord gc gdi32)
394 # Compile some tests as C++ to test extern "C" in header files.
395 if (enable_cplusplus)
396 set_source_files_properties(tests/leak_test.c tests/test.c
397 PROPERTIES LANGUAGE CXX)
398 # To avoid "treating 'c' input as 'c++' when in C++ mode" Clang warning.
399 if (NOT (BORLAND OR MSVC OR WATCOM))
400 add_compile_options(-x c++)
402 endif(enable_cplusplus)
404 add_executable(gctest WIN32 tests/test.c)
405 target_link_libraries(gctest PRIVATE gc)
406 add_test(NAME gctest COMMAND gctest)
408 # Suppress "conditional expression in if statement is always true/false"
409 # and "unreachable code" warnings in GC_MALLOC_[ATOMIC_]WORDS.
410 target_compile_options(gctest PRIVATE
411 /wcd=13 /wcd=201 /wcd=367 /wcd=368 /wcd=726)
414 add_executable(hugetest tests/huge_test.c)
415 target_link_libraries(hugetest PRIVATE gc)
416 add_test(NAME hugetest COMMAND hugetest)
418 add_executable(leaktest tests/leak_test.c)
419 target_link_libraries(leaktest PRIVATE gc)
420 add_test(NAME leaktest COMMAND leaktest)
422 add_executable(middletest tests/middle.c)
423 target_link_libraries(middletest PRIVATE gc)
424 add_test(NAME middletest COMMAND middletest)
426 add_executable(realloc_test tests/realloc_test.c)
427 target_link_libraries(realloc_test PRIVATE gc)
428 add_test(NAME realloc_test COMMAND realloc_test)
430 add_executable(smashtest tests/smash_test.c)
431 target_link_libraries(smashtest PRIVATE gc)
432 add_test(NAME smashtest COMMAND smashtest)
434 if (NOT (BUILD_SHARED_LIBS AND WIN32))
435 add_library(staticrootslib_test tests/staticrootslib.c)
436 target_link_libraries(staticrootslib_test PRIVATE gc)
437 add_library(staticrootslib2_test tests/staticrootslib.c)
438 target_compile_options(staticrootslib2_test PRIVATE "-DSTATICROOTSLIB2")
439 target_link_libraries(staticrootslib2_test PRIVATE gc)
440 add_executable(staticrootstest tests/staticrootstest.c)
441 target_compile_options(staticrootstest PRIVATE "-DSTATICROOTSLIB2")
442 target_link_libraries(staticrootstest PRIVATE
443 gc staticrootslib_test staticrootslib2_test)
444 add_test(NAME staticrootstest COMMAND staticrootstest)
448 add_executable(tracetest tests/trace_test.c)
449 target_link_libraries(tracetest PRIVATE gc)
450 add_test(NAME tracetest COMMAND tracetest)
453 if (enable_cplusplus)
454 add_executable(test_cpp WIN32 tests/test_cpp.cc)
455 target_link_libraries(test_cpp PRIVATE gc gccpp)
456 add_test(NAME test_cpp COMMAND test_cpp)
460 add_executable(disclaim_bench tests/disclaim_bench.c)
461 target_link_libraries(disclaim_bench PRIVATE gc)
462 add_test(NAME disclaim_bench COMMAND disclaim_bench)
464 add_executable(disclaim_test tests/disclaim_test.c)
465 target_link_libraries(disclaim_test PRIVATE gc)
466 add_test(NAME disclaim_test COMMAND disclaim_test)
468 add_executable(disclaim_weakmap_test tests/disclaim_weakmap_test.c)
469 target_link_libraries(disclaim_weakmap_test PRIVATE gc)
470 add_test(NAME disclaim_weakmap_test COMMAND disclaim_weakmap_test)