Dept. of incomplete documentation: what if BufDelay* needs to be multichannel?
[supercollider.git] / CMakeLists.txt
blob137de65e5d66f1f34b8a3f18fb2947bb8f7aee57
1 cmake_minimum_required (VERSION 2.8)
2 project (SuperCollider)
4 include("SCVersion.txt")
5 set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}${PROJECT_VERSION_PATCH}")
6 message(STATUS "SuperCollider Version: ${PROJECT_VERSION}")
8 include(CTest)
9 enable_testing()
11 include (cmake_modules/FinalFile.cmake)
13 if (NOT CMAKE_BUILD_TYPE)
14         message(STATUS "Build type defaulting to \"RelWithDebInfo\"")
15         set(CMAKE_BUILD_TYPE "RelWithDebInfo")
16 endif()
18 if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
19         message(WARNING "WARNING: IN-PLACE BUILDS ARE NOT RECOMMENDED - PLEASE USE A BUILD DIRECTORY")
20 endif()
23 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules
24                       ${CMAKE_MODULE_PATH})
26 CONFIGURE_FILE(
27   "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/cmake_uninstall.cmake.in"
28   "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
29   IMMEDIATE @ONLY)
31 ADD_CUSTOM_TARGET(uninstall
32   "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
34 if(APPLE)
35         STRING(REGEX REPLACE "^.*MacOSX10.([0-9]+).*$" "\\1" MAC_OSX_SDK_VERSION  "${CMAKE_OSX_SYSROOT}")
37         if(CMAKE_OSX_DEPLOYMENT_TARGET)
38                 if (CMAKE_OSX_DEPLOYMENT_TARGET GREATER 10.4)
39                         set(HID_UTIL_DIR "HID_Utilities")
40                 else()
41                         set(HID_UTIL_DIR "HID_Utilities_10_4")
42                 endif()
43         else()
44                 if (${MAC_OSX_SDK_VERSION} GREATER 4)
45                         set(HID_UTIL_DIR "HID_Utilities")
46                 else()
47                         set(HID_UTIL_DIR "HID_Utilities_10_4")
48                 endif()
49         endif()
50         MESSAGE( STATUS "Using HID Utilities from folder '${HID_UTIL_DIR}'")
51 endif()
53 if (CMAKE_SYSTEM_NAME MATCHES "Linux")
54         set(LINUX 1)
55 endif()
57 #############################################
58 # Compiler flags etc
60 if (${CMAKE_COMPILER_IS_GNUCXX})
61         exec_program(${CMAKE_CXX_COMPILER} ARGS -dumpversion OUTPUT_VARIABLE _gcc_version)
63         add_definitions("-fschedule-insns2" "-fomit-frame-pointer")
65         add_definitions("-Wreturn-type")
67 #       disabled for now: -ffast-math breaks avx intrinsics and -fsigned-zeros/-fno-associative-math are not available in some versions
68 #       if (${_gcc_version} VERSION_GREATER 4.0.99)
69 #               add_definitions("-ffast-math -fsigned-zeros -fno-associative-math")
70 #       endif()
72         option(DSO_VISIBILITY "DSO visibility support for gcc" OFF)
74         if (DSO_VISIBILITY)
75                 add_definitions(-fvisibility=hidden)
76         endif()
78         if(APPLE)
79                 exec_program(${CMAKE_CXX_COMPILER} ARGS --version OUTPUT_VARIABLE _gcc_version_info)
80                 if ("${_gcc_version_info}" MATCHES "Apple")
81                         add_definitions("-fpascal-strings")
82                 endif()
83                 add_definitions("-D_REENTRANT")
84         elseif(NOT (WIN32 AND NOT CYGWIN))
85                 add_definitions("-pthread")
86         endif()
87 endif ()
89 if (${CMAKE_CXX_COMPILER} MATCHES icpc)
90         set(CMAKE_COMPILER_IS_INTEL 1)
91         add_definitions(-Wno-unknown-pragmas)
92         add_definitions(-simd)
93 endif()
95 if (${CMAKE_CXX_COMPILER} MATCHES clang)
96         option(DSO_VISIBILITY "DSO visibility support for clang" OFF)
98         if (DSO_VISIBILITY)
99                 add_definitions(-fvisibility=hidden)
100         endif()
102         set(CMAKE_COMPILER_IS_CLANG 1)
103 endif()
105 if(APPLE)
106         set_property(DIRECTORY
107                 APPEND
108                 PROPERTY COMPILE_DEFINITIONS SC_DARWIN)
109 elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
110         add_definitions("-DSC_LINUX")
111         add_definitions(-DSC_DATA_DIR="${CMAKE_INSTALL_PREFIX}/share/SuperCollider")
112 elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
113         add_definitions("-DSC_FREEBSD")
114         add_definitions(-DSC_DATA_DIR="${CMAKE_INSTALL_PREFIX}/share/SuperCollider")
115 endif()
117 if(WIN32)
118     set_property(DIRECTORY
119                  APPEND
120                  PROPERTY COMPILE_DEFINITIONS SC_WIN32 NOMINMAX _WINSOCKAPI_)
122     if(MSVC)
123         SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_RELEASE} /MTd")
124         SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_DEBUG} /MT")
125     endif()
126 endif()
129 #############################################
130 # some default libraries
132 find_package(Pthreads)
134 if (NOT PTHREADS_FOUND)
135     message(SEND_ERROR "cannot find libpthreads")
136 endif()
137 include_directories(${PTHREADS_INCLUDE_DIR})
139 if (MSVC OR MINGW)
140     set(MATH_LIBRARY "")
141 else()
142     find_library(MATH_LIBRARY m)
143 endif()
145 if(CURL)
146         find_package(CURL)
147         if(CURL_FOUND)
148                 add_definitions("-DHAVE_LIBCURL")
149                 include_directories(${CURL_INCLUDE_DIRS})
150         endif()
151 endif()
153 #############################################
154 # Options
155 option(NOVA_SIMD "Build with nova-simd support." ON)
156 option(FINAL_BUILD "Build as single source file." OFF)
158 option(CURL "Build with curl for remote file download." ON)
160 option(FFT_GREEN "Use internal 'Green' FFT lib rather than FFTW. (Not recommended.)" OFF)
162 option(SSE "Compile with support for SSE instructions.")
163 option(SSE41 "Compile with support for SSE4.1 instructions.")
164 option(SSE42 "Compile with support for SSE4.2 instructions.")
167 option(LIBSCSYNTH "Compile libscsynth as shared library" OFF)
170 option(INSTALL_HELP "Install help docs and examples along with the software" ON)
171 option(INSTALL_OLD_HELP "Install old and deprecated help files" ON)
172 option(SC_DOC_RENDER "Pre-render SCDoc documentation. (For putting online, etc)" OFF)
174 if(CMAKE_SYSTEM_NAME MATCHES "Linux")
175     option(SUPERNOVA "Build with supernova as optional audio synthesis server" ON)
176 elseif()
177     option(SUPERNOVA "Build with supernova as optional audio synthesis server" OFF)
178 endif()
180 option(SN_MEMORY_DEBUGGING "Build supernova for memory debugging (disable memory pools).")
181 option(SC_MEMORY_DEBUGGING "Build sclang&scsynth for memory debugging (disable memory pools).")
182 option(GC_SANITYCHECK "Enable sanity checks in the sclang garbage collector.")
184 option(NO_LIBSNDFILE "Disable soundfile functionality. (Not recommended.)" OFF)
186 option(NO_AVAHI "Disable Avahi support. (Not recommended.)" OFF)
188 option(SCLANG_SERVER "Build with internal server." ON)
190 if(CMAKE_SYSTEM_NAME MATCHES "Linux")
191         option(SC_WII "Build sclang with WII support" ON)
192 endif()
194 option(SC_QT "Build SuperCollider with Qt GUI" ON)
195 if (SC_QT)
196   message( STATUS "Compiling with Qt GUI" )
197 endif (SC_QT)
199 if(WIN32)
200         option(SC_PSYCOLLIDER "Build PsyCollider" ON)
201 else()
202         option(SC_PSYCOLLIDER "Build PsyCollider" OFF)
203 endif()
205 if(CMAKE_COMPILER_IS_GNUCXX)
206     option(NATIVE "Optimize binary for this architecture (binaries may not run on other machines, requires gcc-4.3 or higher).")
207     option(LTO "Use GCC's link time optimizer' (experimental).")
208 endif()
210 option(SC_SYMLINK_CLASSLIB "Place a symlink of SCCLassLibrary instead of copying" OFF)
211 option(SC_OX "Try to compile with support for C++0x (experimental, mainly related to supernova)" OFF)
213 #############################################
214 # some preprocessor flags
215 if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG)
216         if (SSE)
217                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse -mfpmath=sse")
218                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -mfpmath=sse")
219         endif()
220         if (SSE41)
221                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.1")
222                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1")
223         endif()
224         if (SSE42)
225                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2")
226                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2")
227         endif()
228         if (NATIVE)
229                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native")
230                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
231         endif()
233         if (SC_OX)
234                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
235         endif()
236 endif()
238 if (CMAKE_COMPILER_IS_INTEL AND NOT WIN32)
239         if (SSE42)
240                 add_definitions(-xSSE4.2)
241         elseif (SSE41)
242                 add_definitions(-xSSE4.1)
243         elseif (SSE)
244                 add_definitions(-mia32)
245         endif()
246         if (SC_OX)
247                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
248         endif()
250         # disable warnings
251         add_definitions(-diag-disable 170) # pointer points outside of underlying object ... used heavily in sclang
252         add_definitions(-diag-disable 279) # controlling expression is constant
254 endif()
256 if (SC_MEMORY_DEBUGGING)
257         add_definitions(-DDISABLE_MEMORY_POOLS)
258 endif()
260 #############################################
261 # subdirectories
262 add_subdirectory(external_libraries)
263 add_subdirectory(server)
264 add_subdirectory(lang)
265 add_subdirectory(bindings)
266 add_subdirectory(platform)
267 add_subdirectory(editors)
269 if(CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
270     install(DIRECTORY include/common include/plugin_interface include/server include/lang
271         DESTINATION ${CMAKE_INSTALL_PREFIX}/include/SuperCollider
272         FILES_MATCHING PATTERN "*.h"
273     )
274 endif()
276 if(APPLE)
277         # determines the app name and app install location (scappbundlename, scappdir):
278         include (cmake_modules/MacAppFolder.cmake)
280         set(auxresourcesdir ${scappauxresourcesdir})
282         # Some aux files which go in the app's folder
283         install(FILES README.txt ChangeLog COPYING AUTHORS platform/mac/MOVED_STUFF.txt
284                 DESTINATION ${scappbundlename}
285         )
286 elseif (WIN32)
287         set(auxresourcesdir "SuperCollider")
288 else()
289         set(auxresourcesdir "share/SuperCollider")
290 endif()
292 if(NOT SC_QT)
293         set(SCCLASSLIB_EXCLUDE_REGEX "QtCollider")
294 else()
295         set(SCCLASSLIB_EXCLUDE_REGEX "IGNOREME")
296 endif()
298 if(APPLE)
300         if(SC_SYMLINK_CLASSLIB)
302                 #if there are folders inside SCCLassLibrary abort cmake.
303                 file(GLOB classlibraryfolders "${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}/SCClassLibrary/[^.]*")
304                 foreach(onedirectory ${classlibraryfolders})
305                         message( "${onedirectory}" )
306                         if(NOT IS_SYMLINK "${onedirectory}")
307                                 message(FATAL_ERROR "Symlinking will fail ! SCClassLibrary folder already exists and has directories inside, please delete it first." )
308                         endif()
309                 endforeach(onedirectory)
311                 message(STATUS "Will create symlink of SCClassLibrary to ${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}/SCClassLibrary" )
312                 if(NOT EXISTS "{CMAKE_INSTALL_PREFIX}/${auxresourcesdir}/SCClassLibrary")
313                         install( CODE "EXECUTE_PROCESS(COMMAND mkdir ${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}/SCClassLibrary)" )
314                 endif()
315                 #symlink the folders inside SCCLassLibrary. Check if QtCollider folder should be symlinked or not.
316                 file(GLOB classlibraryfolders RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/SCClassLibrary" "SCClassLibrary/[^.]*")
317                 foreach(onedirectory ${classlibraryfolders})
318                         if(NOT "${onedirectory}" MATCHES "${SCCLASSLIB_EXCLUDE_REGEX}")
319                                 install( CODE
320                                         "EXECUTE_PROCESS(COMMAND ln -shF ${CMAKE_CURRENT_SOURCE_DIR}/SCClassLibrary/${onedirectory} ${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}/SCClassLibrary/${onedirectory} )" )
321                         endif()
322                 endforeach(onedirectory)
323         else()
324                 message(STATUS "Will copy SCCLassLibrary to ${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}")
326                 #if directory contains symlinks, unlink them.
327                 if(EXISTS "${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}/SCClassLibrary")
328                         file(GLOB classlibraryfolders "${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}/SCClassLibrary/[^.]*")
329                         foreach(onedirectory ${classlibraryfolders})
330                                 if(IS_SYMLINK "${onedirectory}")
331                                         message(STATUS "Unlinking ${onedirectory}")
332                                         install( CODE "EXECUTE_PROCESS(COMMAND unlink ${onedirectory} )" )
333                                 endif()
334                         endforeach(onedirectory)
335                 endif()
337                 install(DIRECTORY SCClassLibrary
338                         DESTINATION ${auxresourcesdir}
339                         REGEX ${SCCLASSLIB_EXCLUDE_REGEX} EXCLUDE
340                 )
341         endif()
342 else()
343         install(DIRECTORY SCClassLibrary
344                 DESTINATION ${auxresourcesdir}
345                 REGEX ${SCCLASSLIB_EXCLUDE_REGEX} EXCLUDE
346                 PATTERN "*~" EXCLUDE
347                 PATTERN "*#" EXCLUDE
348         )
349 endif()
351 configure_file(platform/SCVersion.sc.in SCVersion/SCVersion.sc)
352 install(DIRECTORY "${CMAKE_BINARY_DIR}/SCVersion" DESTINATION "${auxresourcesdir}/SCClassLibrary")
354 install(DIRECTORY sounds
355         DESTINATION ${auxresourcesdir}
358 if(APPLE AND ("${standalone}" STREQUAL ""))
359         set(exampledir "${scappbundlename}")
360 else()
361         set(exampledir "${auxresourcesdir}")
362 endif()
364 install(DIRECTORY examples
365         DESTINATION ${exampledir}
366         PATTERN "*~" EXCLUDE
367         PATTERN "*#" EXCLUDE
370 if(INSTALL_OLD_HELP)
371         install(DIRECTORY Help
372                 DESTINATION ${auxresourcesdir}
373         )
374 endif()
376 if(INSTALL_HELP)
377         if(SC_SYMLINK_CLASSLIB AND APPLE)
378                 message(STATUS "Will create symlink of HelpSource to ${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}/HelpSource")
379                 if(EXISTS "${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}/HelpSource")
380                         message(FATAL_ERROR "Symlinking will fail ! HelpSource folder already exists, please delete it first." )
381                 endif()
382                 install( CODE
383                                         "EXECUTE_PROCESS(COMMAND ln -shF ${CMAKE_CURRENT_SOURCE_DIR}/HelpSource ${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}/HelpSource )" )
384         else()
385                 message(STATUS "Will copy HelpSource to ${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}")
386                 if(APPLE)
387                         if(EXISTS "${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}/HelpSource")
388                                 if(IS_SYMLINK "${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}/HelpSource")
389                                         message(STATUS "Unlinking ${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}/HelpSource")
390                                         install( CODE "EXECUTE_PROCESS(COMMAND unlink ${CMAKE_INSTALL_PREFIX}/${auxresourcesdir}/HelpSource )" )
391                                 endif()
392                         endif()
393                 endif()
394                 install(DIRECTORY HelpSource
395                         DESTINATION ${auxresourcesdir}
396                         PATTERN "*~" EXCLUDE
397                         PATTERN "*#" EXCLUDE
398                 )
399         endif()
400 endif()
402 #############################################
404 # build scdoc help files
406 list(APPEND BUILD_CLASSLIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/SCClassLibrary/Common")
407 list(APPEND BUILD_CLASSLIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/SCClassLibrary/Platform")
408 list(APPEND BUILD_CLASSLIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/SCClassLibrary/SCDoc")
409 list(APPEND BUILD_CLASSLIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/SCClassLibrary/DefaultLibrary")
410 list(APPEND BUILD_CLASSLIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/SCClassLibrary/JITLib")
411 list(APPEND BUILD_CLASSLIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/SCClassLibrary/backwards_compatibility")
413 # this folder has an extension to Platform that disables the loadStartupFiles method
414 list(APPEND BUILD_CLASSLIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/platform/disable_startup_files")
416 foreach(arg ${BUILD_CLASSLIBRARIES})
417         set(BUILD_CLASSLIBRARYPATH "${BUILD_CLASSLIBRARYPATH}+${arg}\n")
418 endforeach()
420 configure_file(build_sclang.cfg.in ${CMAKE_CURRENT_BINARY_DIR}/build_sclang.cfg)
422 if(SC_DOC_RENDER)
423         file(GLOB_RECURSE SCDocSources RELATIVE HelpSource .*[^~])
424         file(GLOB_RECURSE SCDocClasses RELATIVE SCClassLibrary/SCDoc *.sc)
426         add_custom_target(doc ALL
427                                         COMMAND ${CMAKE_CURRENT_BINARY_DIR}/lang/sclang${CMAKE_EXECUTABLE_SUFFIX}
428                                                         -l ${CMAKE_CURRENT_BINARY_DIR}/build_sclang.cfg
429                                                         platform/renderAllHelp.scd ${CMAKE_CURRENT_SOURCE_DIR}/HelpSource ${CMAKE_CURRENT_BINARY_DIR}/RenderedHelp
430                                         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
431                                         DEPENDS sclang ${SCDocSources} ${SCDocClasses})
433 endif()
435 set_directory_properties(
436         PROPERTIES
437         ADDITIONAL_MAKE_CLEAN_FILES "RenderedHelp")
439 #############################################
441 # testsuite
443 add_subdirectory(testsuite)
445 #############################################
446 # win32 install support
448 if(WIN32)
449         install(FILES ${FFTW3F_LIBRARY} ${SNDFILE_LIBRARY} ${PTHREADS_LIBRARY} ${PORTAUDIO_LIBRARIES}
450                 DESTINATION "SuperCollider"
451                 PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
452 endif()
454 #############################################
455 # CPack support
457 set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
458 set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
459 set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
461 if(APPLE)
462         set(CPACK_GENERATOR "DragNDrop")
463         set(CPACK_DMG_FORMAT "UDBZ")
464         set(CPACK_DMG_VOLUME_NAME "${scappbundlename}")
465         set(CPACK_SYSTEM_NAME "OSX")
466 #       set(CPACK_PACKAGE_FILE_NAME "${scappbundlename}-${PROJECT_VERSION}")
467         set(CPACK_DMG_DS_STORE "${CMAKE_SOURCE_DIR}/package/ds_store")
468         set(CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/package/background.png")
469         set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/platform/mac/Resources/SCcube.icns")
470 elseif(WIN32)
471         set(CPACK_MONOLITHIC_INSTALL 1)
472 endif()
473 include(CPack)
475 #############################################
476 # hide advanced variables
477 mark_as_advanced(AVAHI_LIBRARIES AVAHI_INCLUDE_DIRS AVAHI_INCLUDE_DIR AVAHI_LIBRARY-COMMON AVAHI_LIBRARY-CLIENT)
478 mark_as_advanced(DL)
479 mark_as_advanced(EMACS_EXECUTABLE)
480 mark_as_advanced(FFTW3F_INCLUDE_DIR FFTW3F_LIBRARY)
481 mark_as_advanced(JACK JACK_INCLUDE_DIR JACK_LIBRARY)
482 mark_as_advanced(MATH_LIBRARY)
483 mark_as_advanced(QT_QMAKE_EXECUTABLE)
484 mark_as_advanced(SNDFILE)