Skip to content
Snippets Groups Projects
00-Common.cmake 13.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • # -*- cmake -*-
    #
    # Compilation options shared by all Second Life components.
    
    
    #*****************************************************************************
    #   It's important to realize that CMake implicitly concatenates
    #   CMAKE_CXX_FLAGS with (e.g.) CMAKE_CXX_FLAGS_RELEASE for Release builds. So
    #   set switches in CMAKE_CXX_FLAGS that should affect all builds, but in
    #   CMAKE_CXX_FLAGS_RELEASE or CMAKE_CXX_FLAGS_RELWITHDEBINFO for switches
    #   that should affect only that build variant.
    #
    #   Also realize that CMAKE_CXX_FLAGS may already be partially populated on
    #   entry to this file.
    #*****************************************************************************
    
    
    if(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED)
    set(${CMAKE_CURRENT_LIST_FILE}_INCLUDED "YES")
    
    
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DADDRESS_SIZE=${ADDRESS_SIZE}")
    
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DADDRESS_SIZE=${ADDRESS_SIZE}")
    
    set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG -DLL_DEBUG=1")
    set(CMAKE_CXX_FLAGS_RELEASE
        "-DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -DNDEBUG")
    set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
        "-DLL_RELEASE=1 -DNDEBUG -DLL_RELEASE_WITH_DEBUG_INFO=1")
    
    # Configure crash reporting
    set(RELEASE_CRASH_REPORTING OFF CACHE BOOL "Enable use of crash reporting in release builds")
    set(NON_RELEASE_CRASH_REPORTING OFF CACHE BOOL "Enable use of crash reporting in developer builds")
    
    if(RELEASE_CRASH_REPORTING)
      set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DLL_SEND_CRASH_REPORTS=1")
    endif()
    
    if(NON_RELEASE_CRASH_REPORTING)
      set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DLL_SEND_CRASH_REPORTS=1")
      set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DLL_SEND_CRASH_REPORTS=1")
    endif()  
    
    # Don't bother with a MinSizeRel build.
    
    set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Release;Debug" CACHE STRING
        "Supported build types." FORCE)
    
    
    # Platform-specific compilation flags.
    
    if (WINDOWS)
      # Don't build DLLs.
      set(BUILD_SHARED_LIBS OFF)
    
    
      if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
      elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m${ADDRESS_SIZE}")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m${ADDRESS_SIZE}")
      endif ()
    
      set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /EHsc -D_SCL_SECURE_NO_WARNINGS=1")
      set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
          "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /Ob0 /EHsc -D_ITERATOR_DEBUG_LEVEL=0")
    
      if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
        set(CMAKE_CXX_FLAGS_RELEASE
    
            "${CMAKE_CXX_FLAGS_RELEASE} /O2 /Oi /Ot /Gy /Zi /MD /Ob3 /Oy- /Zc:inline /EHsc /fp:fast -D_ITERATOR_DEBUG_LEVEL=0")
    
      elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
        set(CMAKE_CXX_FLAGS_RELEASE
            "${CMAKE_CXX_FLAGS_RELEASE} /clang:-Ofast /clang:-ffast-math /Oi /Ot /Gy /Zi /MD /Ob2 /Oy- /Zc:inline /EHsc /fp:fast -D_ITERATOR_DEBUG_LEVEL=0")
      endif()
    
      if (ADDRESS_SIZE EQUAL 32)
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE")
      endif (ADDRESS_SIZE EQUAL 32)
    
    
      if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR FULL_DEBUG_SYMS OR USE_CRASHPAD)
        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG:FULL")
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG:FULL")
      else ()
        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG:FASTLINK /IGNORE:4099")
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG:FASTLINK /IGNORE:4099")
      endif ()
    
    
      set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /NODEFAULTLIB:LIBCMT")
      set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:LIBCMT /NODEFAULTLIB:LIBCMTD /NODEFAULTLIB:MSVCRT")
      set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /NODEFAULTLIB:LIBCMT")
      set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:LIBCMT /NODEFAULTLIB:LIBCMTD /NODEFAULTLIB:MSVCRT")
      
      if (USE_LTO)
        if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
    
          if(INCREMENTAL_LINK)
            set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LTCG:incremental")
            set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LTCG:incremental")
            set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /LTCG")
          else(INCREMENTAL_LINK)
    
            set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LTCG")
            set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LTCG")
            set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /LTCG")
    
          endif(INCREMENTAL_LINK)
    
          set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /OPT:REF /OPT:ICF /INCREMENTAL:NO")
          set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /OPT:REF /OPT:ICF /INCREMENTAL:NO")
    
          set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL /Gy /Gw")
    
        elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
          if(INCREMENTAL_LINK)
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flto=thin -fwhole-program-vtables /clang:-fforce-emit-vtables")
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto=thin -fwhole-program-vtables /clang:-fforce-emit-vtables")
          else(INCREMENTAL_LINK)
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flto=full -fwhole-program-vtables /clang:-fforce-emit-vtables")
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto=full -fwhole-program-vtables /clang:-fforce-emit-vtables")
          endif(INCREMENTAL_LINK)
          set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /OPT:REF /OPT:ICF")
          set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /OPT:REF /OPT:ICF")
        endif()
      elseif (INCREMENTAL_LINK)
        set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /INCREMENTAL")
        set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /INCREMENTAL")
      else ()
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /OPT:REF /OPT:ICF /INCREMENTAL:NO")
        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /OPT:REF /OPT:ICF /INCREMENTAL:NO")
      endif ()
    
      if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
        # This is a massive hack and makes me sad. clang-cl fails to find its own builtins library :/ x64 only for now.
        set(CLANG_RT_NAMES clang_rt.builtins-x86_64)
        find_library(CLANG_RT NAMES ${CLANG_RT_NAMES} 
                    PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\LLVM\\LLVM]/lib/clang/${CMAKE_CXX_COMPILER_VERSION}/lib/windows 
                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\LLVM\\LLVM]/lib/clang/${CMAKE_CXX_COMPILER_VERSION}/lib/windows)
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /defaultlib:\"${CLANG_RT}\"")
        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /defaultlib:\"${CLANG_RT}\"")
      endif()
    
      set(GLOBAL_CXX_FLAGS 
          "/GS /W3 /c /Zc:forScope /Zc:rvalueCast /Zc:wchar_t- /nologo"
          )
    
      if (USE_AVX2)
        set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /arch:AVX2")
    
        add_definitions(/DAL_AVX2=1 /DAL_AVX=1)
    
      elseif (USE_AVX)
        set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /arch:AVX")
    
      elseif (ADDRESS_SIZE EQUAL 32)
        set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /arch:SSE2")
      endif ()
    
      if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
    
        set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /Zc:externConstexpr /Zc:referenceBinding")
    
      elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
        set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /Qvec /Zc:dllexportInlines- /clang:-mprefer-vector-width=128 -fno-strict-aliasing -Wno-ignored-pragma-intrinsic -Wno-unused-local-typedef")
      endif()
    
      if(FAVOR_AMD AND FAVOR_INTEL)
          message(FATAL_ERROR "Cannot enable FAVOR_AMD and FAVOR_INTEL at the same time")
      elseif(FAVOR_AMD)
          set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /favor:AMD64")
      elseif(FAVOR_INTEL)
          set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /favor:INTEL64")
      endif()
    
      if (NOT VS_DISABLE_FATAL_WARNINGS)
        set(GLOBAL_CXX_FLAGS "${GLOBAL_CXX_FLAGS} /WX")
      endif (NOT VS_DISABLE_FATAL_WARNINGS)
    
      set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${GLOBAL_CXX_FLAGS}" CACHE STRING "C++ compiler debug options" FORCE)
      set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${GLOBAL_CXX_FLAGS}" CACHE STRING "C++ compiler release-with-debug options" FORCE)
      set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${GLOBAL_CXX_FLAGS}" CACHE STRING "C++ compiler release options" FORCE)
    
          /DLL_WINDOWS=1
    
          /DUNICODE
          /DURI_STATIC_BUILD
          /D_UNICODE
          /D_CRT_SECURE_NO_WARNINGS
          /D_CRT_NONSTDC_NO_DEPRECATE
          /D_WINSOCK_DEPRECATED_NO_WARNINGS
          /D_SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
          /DBOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE
    
      if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
        add_definitions(-DBOOST_USE_WINDOWS_H)
    
    
      # configure win32 API for 7 and above compatibility
      set(WINVER "0x0601" CACHE STRING "Win32 API Target version (see http://msdn.microsoft.com/en-us/library/aa383745%28v=VS.85%29.aspx)")
      add_definitions("/DWINVER=${WINVER}" "/D_WIN32_WINNT=${WINVER}")
    
      add_definitions(-D_FORTIFY_SOURCE=2)
    
      set(CMAKE_CXX_FLAGS "-Wno-deprecated -Wno-unused-but-set-variable -Wno-unused-variable ${CMAKE_CXX_FLAGS}")
    
      # gcc 4.3 and above don't like the LL boost and also
    
      # cause warnings due to our use of deprecated headers
    
      add_definitions(-Wno-parentheses)
    
          -fexceptions
          -fno-math-errno
          -fno-strict-aliasing
          -fsigned-char
    
      # force this platform to accept TOS via external browser
      add_definitions(-DEXTERNAL_TOS)
    
    
      add_definitions(-DAPPID=secondlife)
    
      add_compile_options(-fvisibility=hidden)
      # don't catch SIGCHLD in our base application class for the viewer - some of
      # our 3rd party libs may need their *own* SIGCHLD handler to work. Sigh! The
      # viewer doesn't need to catch SIGCHLD anyway.
    
      add_definitions(-DLL_IGNORE_SIGCHLD)
    
        add_compile_options(-march=pentium4)
    
      #add_compile_options(-ftree-vectorize) # THIS CRASHES GCC 3.1-3.2
    
        # this stops us requiring a really recent glibc at runtime
    
        add_compile_options(-fno-stack-protector)
    
        # linking can be very memory-hungry, especially the final viewer link
        set(CMAKE_CXX_LINK_FLAGS "-Wl,--no-keep-memory")
    
    
      set(CMAKE_CXX_FLAGS_DEBUG "-fno-inline ${CMAKE_CXX_FLAGS_DEBUG}")
    endif (LINUX)
    
    
    if (DARWIN)
    
      # Warnings should be fatal -- thanks, Nicky Perian, for spotting reversed default
      set(CLANG_DISABLE_FATAL_WARNINGS OFF)
    
      set(CMAKE_CXX_LINK_FLAGS "-Wl,-headerpad_max_install_names,-search_paths_first")
    
      set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
    
      set(DARWIN_extra_cstar_flags "-Wno-unused-local-typedef -Wno-deprecated-declarations")
    
      # Ensure that CMAKE_CXX_FLAGS has the correct -g debug information format --
      # see Variables.cmake.
      string(REPLACE "-gdwarf-2" "-g${CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT}"
        CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
    
      # The viewer code base can now be successfully compiled with -std=c++14. But
      # turning that on in the generic viewer-build-variables/variables file would
      # potentially require tweaking each of our ~50 third-party library builds.
      # Until we decide to set -std=c++14 in viewer-build-variables/variables, set
      # it locally here: we want to at least prevent inadvertently reintroducing
      # viewer code that would fail with C++14.
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DARWIN_extra_cstar_flags} -std=c++14")
    
      set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  ${DARWIN_extra_cstar_flags}")
    
      # NOTE: it's critical that the optimization flag is put in front.
      # NOTE: it's critical to have both CXX_FLAGS and C_FLAGS covered.
    
    ## Really?? On developer machines too?
    ##set(ENABLE_SIGNING TRUE)
    ##set(SIGNING_IDENTITY "Developer ID Application: Linden Research, Inc.")
    
      if (CMAKE_CXX_COMPILER MATCHES ".*clang")
        set(CMAKE_COMPILER_IS_CLANGXX 1)
      endif (CMAKE_CXX_COMPILER MATCHES ".*clang")
    
      if (CMAKE_COMPILER_IS_GNUCXX)
    
        set(GCC_WARNINGS "-Wall -Wno-sign-compare -Wno-trigraphs")
    
        set(GCC_WARNINGS "-Wall -Wno-sign-compare -Wno-trigraphs")
    
        set(GCC_WARNINGS "${GCC_WARNINGS} -Werror")
    
      set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder -Wno-non-virtual-dtor")
    
    
      set(CMAKE_C_FLAGS "${GCC_WARNINGS} ${CMAKE_C_FLAGS}")
      set(CMAKE_CXX_FLAGS "${GCC_CXX_WARNINGS} ${CMAKE_CXX_FLAGS}")
    
      set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m${ADDRESS_SIZE}")
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m${ADDRESS_SIZE}")
    
      add_definitions(-DLL_USESYSTEMLIBS=1)
    
      if (LINUX AND ADDRESS_SIZE EQUAL 32)
    
      endif (LINUX AND ADDRESS_SIZE EQUAL 32)
    
      set(${ARCH}_linux_INCLUDES
          ELFIO
          atk-1.0
          glib-2.0
          gstreamer-0.10
          gtk-2.0
          pango-1.0
          )
    
    endif(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED)