From 01bf430b1a479146aff85248d5f9211094fd01f8 Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Tue, 19 Jan 2016 10:07:27 -0800 Subject: [PATCH] Get linux64 somewhat working --- .gitignore | 1 - indra/cmake/00-Common.cmake | 26 +-- indra/cmake/Copy3rdPartyLibs.cmake | 9 +- indra/cmake/FMODSTUDIO.cmake | 73 +------ indra/cmake/GLOD.cmake | 2 +- indra/cmake/GStreamer010Plugin.cmake | 21 -- indra/cmake/JsonCpp.cmake | 2 +- indra/cmake/LLCommon.cmake | 1 - indra/cmake/LLPrimitive.cmake | 11 +- indra/cmake/LLWindow.cmake | 12 +- indra/cmake/UI.cmake | 17 +- indra/cmake/Variables.cmake | 21 +- indra/cmake/ViewerMiscLibs.cmake | 4 - indra/cmake/ZLIB.cmake | 15 ++ indra/libpathing/llpathinglib.cpp | 1 - indra/llcommon/CMakeLists.txt | 13 +- indra/llcommon/llthread.h | 2 +- indra/llwindow/llwindowsdl.cpp | 2 +- indra/newview/CMakeLists.txt | 22 +- .../linux_tools/{wrapper.sh.in => wrapper.sh} | 10 +- indra/newview/llfloaterabout.cpp | 4 + indra/newview/llviewerprecompiledheaders.h | 16 -- indra/newview/res-sdl/singularity_icon.BMP | Bin 262198 -> 0 bytes indra/newview/viewer_manifest.py | 195 +++++++----------- indra/plugins/CMakeLists.txt | 2 + 25 files changed, 170 insertions(+), 312 deletions(-) rename indra/newview/linux_tools/{wrapper.sh.in => wrapper.sh} (96%) delete mode 100644 indra/newview/res-sdl/singularity_icon.BMP diff --git a/.gitignore b/.gitignore index 718308dc9..01cad3637 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,6 @@ indra/newview/res-sdl/viewer_icon.* *.orig *.rej *.bak -*~ *.DS_Store /LICENSES/ /edited-files.txt diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index c938df16e..517462941 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -141,7 +141,10 @@ if (LINUX) -pthread ) - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 ") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") + + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2") # 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! @@ -196,16 +199,14 @@ if (LINUX) # End of hacks. - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") - if (NOT STANDALONE) # this stops us requiring a really recent glibc at runtime add_definitions(-fno-stack-protector) endif (NOT STANDALONE) if (${ARCH} STREQUAL "x86_64") - add_definitions(-DLINUX64=1 -pipe) - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fomit-frame-pointer -ffast-math -funroll-loops") - set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -fomit-frame-pointer -ffast-math -funroll-loops") + add_definitions(-pipe) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ffast-math") + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -ffast-math") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -ffast-math") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -ffast-math") else (${ARCH} STREQUAL "x86_64") @@ -220,11 +221,6 @@ if (LINUX) set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}${MARCH_FLAG} -mfpmath=sse,387 -msse2 ${GCC_EXTRA_OPTIMIZATIONS}") endif (${ARCH} STREQUAL "x86_64") elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - if (NOT STANDALONE) - # this stops us requiring a really recent glibc at runtime - add_definitions(-fno-stack-protector) - endif (NOT STANDALONE) - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}${MARCH_FLAG} -fno-inline -msse2") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}${MARCH_FLAG} -fno-inline -msse2") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}${MARCH_FLAG} -msse2") @@ -232,12 +228,6 @@ if (LINUX) set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}${MARCH_FLAG} -msse2") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}${MARCH_FLAG} -msse2") elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") - - if (NOT STANDALONE) - # this stops us requiring a really recent glibc at runtime - add_definitions(-fno-stack-protector) - endif (NOT STANDALONE) - if (NOT STANDALONE) set(MARCH_FLAG " -axsse4.1 -msse2") endif (NOT STANDALONE) @@ -319,9 +309,9 @@ else (STANDALONE) set(${ARCH}_linux_INCLUDES atk-1.0 glib-2.0 + gdk-pixbuf-2.0 gstreamer-0.10 gtk-2.0 - freetype2 pango-1.0 ) endif (STANDALONE) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 3ec8b7847..9b66e0724 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -135,21 +135,18 @@ elseif(LINUX) libapr-1.so.0 libaprutil-1.so.0 libatk-1.0.so - libdb-5.1.so libexpat.so libexpat.so.1 - libfreetype.so.6.6.2 + libfreetype.so.6.12.0 libfreetype.so.6 + libfreetype.so libGLOD.so libgmodule-2.0.so libgobject-2.0.so - libhunspell-1.3.so.0.0.0 libopenal.so - libopenjpeg.so - libuuid.so.16 - libuuid.so.16.0.22 libfontconfig.so.1.8.0 libfontconfig.so.1 + libfontconfig.so ) if (USE_TCMALLOC) diff --git a/indra/cmake/FMODSTUDIO.cmake b/indra/cmake/FMODSTUDIO.cmake index e7ce595ef..8d8e796c1 100644 --- a/indra/cmake/FMODSTUDIO.cmake +++ b/indra/cmake/FMODSTUDIO.cmake @@ -1,66 +1,8 @@ # -*- cmake -*- -include(Linking) - -unset(FMOD_LIBRARY_RELEASE CACHE) -unset(FMOD_LIBRARY_DEBUG CACHE) -unset(FMOD_INCLUDE_DIR CACHE) - -set(FMOD_EXTERNAL_LIB OFF) - -if(STANDALONE OR WINDOWS) - if (NOT FMODSTUDIO_SDK_DIR AND WINDOWS) - #GET_FILENAME_COMPONENT(REG_DIR [HKEY_CURRENT_USER\\Software\\FMOD\ Studio\ API\ Windows] ABSOLUTE) - #set(FMODSTUDIO_SDK_DIR ${REG_DIR} CACHE PATH "Path to the FMOD Studio SDK." FORCE) - endif (NOT FMODSTUDIO_SDK_DIR AND WINDOWS) - if(NOT FMODSTUDIO_SDK_DIR AND STANDALONE) - message(FATAL_ERROR "FMODSTUDIO_SDK_DIR not set!") - endif(NOT FMODSTUDIO_SDK_DIR AND STANDALONE) -endif(STANDALONE OR WINDOWS) - -if(FMODSTUDIO_SDK_DIR) - if(LINUX AND WORD_SIZE EQUAL 32) - set(fmod_lib_paths "${FMODSTUDIO_SDK_DIR}/api/lowlevel/lib/x86" ) - elseif(LINUX) - set(fmod_lib_paths "${FMODSTUDIO_SDK_DIR}/api/lowlevel/lib/x86_64") - else(LINUX AND WORD_SIZE EQUAL 32) - set(fmod_lib_paths "${FMODSTUDIO_SDK_DIR}/api/lowlevel/lib") - endif(LINUX AND WORD_SIZE EQUAL 32) - set(fmod_inc_paths "${FMODSTUDIO_SDK_DIR}/api/lowlevel/inc") - - if(WINDOWS) - set(CMAKE_FIND_LIBRARY_SUFFIXES_OLD ${CMAKE_FIND_LIBRARY_SUFFIXES}) - set(CMAKE_FIND_LIBRARY_SUFFIXES .dll) - endif(WINDOWS) - if(WORD_SIZE EQUAL 64 AND WINDOWS) - find_library(FMOD_LIBRARY_RELEASE fmod64 PATHS ${fmod_lib_paths} NO_DEFAULT_PATH) - find_library(FMOD_LIBRARY_DEBUG fmodL64 PATHS ${fmod_lib_paths} NO_DEFAULT_PATH) - else(WORD_SIZE EQUAL 64 AND WINDOWS)#Check if CMAKE_FIND_LIBRARY_PREFIXES is set to 'lib' for darwin. - find_library(FMOD_LIBRARY_RELEASE fmod PATHS ${fmod_lib_paths} NO_DEFAULT_PATH) - find_library(FMOD_LIBRARY_DEBUG fmodL PATHS ${fmod_lib_paths} NO_DEFAULT_PATH) - endif(WORD_SIZE EQUAL 64 AND WINDOWS) - if(WINDOWS) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_OLD}) - string(REPLACE ".dll" "_vc.lib" FMOD_LINK_LIBRARY_RELEASE ${FMOD_LIBRARY_RELEASE}) - string(REPLACE ".dll" "_vc.lib" FMOD_LINK_LIBRARY_DEBUG ${FMOD_LIBRARY_DEBUG}) - else(WINDOWS) - set(FMOD_LINK_LIBRARY_RELEASE ${FMOD_LIBRARY_RELEASE}) - set(FMOD_LINK_LIBRARY_DEBUG ${FMOD_LIBRARY_DEBUG}) - endif(WINDOWS) - find_path(FMOD_INCLUDE_DIR fmod.hpp ${fmod_inc_paths}) - if(NOT FMOD_LIBRARY_RELEASE OR NOT FMOD_INCLUDE_DIR) - if(STANDALONE) - message(FATAL_ERROR "Provided FMODSTUDIO_SDK_DIR path not found '{$FMODSTUDIO_SDK_DIR}'") - else(STANDALONE) - message(STATUS "Provided FMODSTUDIO_SDK_DIR path not found '${FMODSTUDIO_SDK_DIR}'. Falling back to prebuilts") - endif(STANDALONE) - else(NOT FMOD_LIBRARY_RELEASE OR NOT FMOD_INCLUDE_DIR) - message(STATUS "Using system-provided FMOD Studio Libraries") - set(FMOD_EXTERNAL_LIB ON) - endif(NOT FMOD_LIBRARY_RELEASE OR NOT FMOD_INCLUDE_DIR) -endif (FMODSTUDIO_SDK_DIR) - -if (NOT FMOD_LIBRARY_RELEASE OR NOT FMOD_INCLUDE_DIR) +include(Variables) +if (FMODSTUDIO) + use_prebuilt_binary(fmodstudio) if(WINDOWS) set(lib_suffix .dll) elseif(DARWIN) @@ -92,11 +34,9 @@ if (NOT FMOD_LIBRARY_RELEASE OR NOT FMOD_INCLUDE_DIR) debug ${FMOD_LINK_LIBRARY_DEBUG} optimized ${FMOD_LINK_LIBRARY_RELEASE} ) - - use_prebuilt_binary(fmodstudio) - set(FMOD_INCLUDE_DIR - ${LIBS_PREBUILT_DIR}/include/fmodstudio) -endif(NOT FMOD_LIBRARY_RELEASE OR NOT FMOD_INCLUDE_DIR) + + set(FMOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/fmodstudio) +endif(FMODSTUDIO) if(FMOD_LIBRARY_RELEASE AND FMOD_INCLUDE_DIR) set(FMOD ON) @@ -113,3 +53,4 @@ if (FMOD) message(STATUS "Building with FMOD Studio audio support") set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMODSTUDIO=1") endif (FMOD) + diff --git a/indra/cmake/GLOD.cmake b/indra/cmake/GLOD.cmake index 09260582e..73881e17a 100644 --- a/indra/cmake/GLOD.cmake +++ b/indra/cmake/GLOD.cmake @@ -9,6 +9,6 @@ if (STANDALONE) else (STANDALONE) use_prebuilt_binary(glod) - set(GLOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include) + set(GLOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/glod) set(GLOD_LIBRARIES GLOD) endif (STANDALONE) diff --git a/indra/cmake/GStreamer010Plugin.cmake b/indra/cmake/GStreamer010Plugin.cmake index 11028f6fb..c9b071d1e 100644 --- a/indra/cmake/GStreamer010Plugin.cmake +++ b/indra/cmake/GStreamer010Plugin.cmake @@ -1,30 +1,9 @@ # -*- cmake -*- include(Prebuilt) - -if (STANDALONE) include(FindPkgConfig) - pkg_check_modules(GSTREAMER010 REQUIRED gstreamer-0.10) pkg_check_modules(GSTREAMER010_PLUGINS_BASE REQUIRED gstreamer-plugins-base-0.10) -else (STANDALONE) - - # Possibly libxml and glib should have their own .cmake file instead... - use_prebuilt_binary(glib) # gstreamer needs glib - use_prebuilt_binary(libxml) - use_prebuilt_binary(gstreamer) - set(GSTREAMER010_FOUND ON FORCE BOOL) - set(GSTREAMER010_PLUGINS_BASE_FOUND ON FORCE BOOL) - set(GSTREAMER010_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include/gstreamer-0.10 - ${LIBS_PREBUILT_DIR}/include/glib-2.0 - ${LIBS_PREBUILT_DIR}/include/libxml2 - ${LIBS_PREBUILT_LEGACY_DIR}/include/gstreamer-0.10 - ${LIBS_PREBUILT_LEGACY_DIR}/include/glib-2.0 - ${LIBS_PREBUILT_LEGACY_DIR}/include/libxml2 - ) - -endif (STANDALONE) if (WINDOWS) # We don't need to explicitly link against gstreamer itself, because diff --git a/indra/cmake/JsonCpp.cmake b/indra/cmake/JsonCpp.cmake index 3519ce4b9..4bde364ce 100644 --- a/indra/cmake/JsonCpp.cmake +++ b/indra/cmake/JsonCpp.cmake @@ -18,5 +18,5 @@ else (STANDALONE) elseif (LINUX) set(JSONCPP_LIBRARIES jsoncpp) endif (WINDOWS) - set(JSONCPP_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/jsoncpp) + set(JSONCPP_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/) endif (STANDALONE) diff --git a/indra/cmake/LLCommon.cmake b/indra/cmake/LLCommon.cmake index 6cc325495..ad96be61b 100644 --- a/indra/cmake/LLCommon.cmake +++ b/indra/cmake/LLCommon.cmake @@ -12,7 +12,6 @@ endif (DARWIN) set(LLCOMMON_INCLUDE_DIRS - ${LIBS_OPEN_DIR}/cwdebug ${LIBS_OPEN_DIR}/llcommon ${APRUTIL_INCLUDE_DIR} ${APR_INCLUDE_DIR} diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake index f508d7e9a..ee465dc8b 100644 --- a/indra/cmake/LLPrimitive.cmake +++ b/indra/cmake/LLPrimitive.cmake @@ -21,9 +21,12 @@ if (WINDOWS) ${BOOST_SYSTEM_LIBRARIES} ) else (WINDOWS) - set(LLPRIMITIVE_LIBRARIES - llprimitive - ${COLLADADOM_LIBRARIES} - ) + set(LLPRIMITIVE_LIBRARIES + llprimitive + ${COLLADADOM_LIBRARIES} + ${BOOST_SYSTEM_LIBRARIES} + minizip + xml2 + ) endif (WINDOWS) diff --git a/indra/cmake/LLWindow.cmake b/indra/cmake/LLWindow.cmake index c5de9d269..fee7f288c 100644 --- a/indra/cmake/LLWindow.cmake +++ b/indra/cmake/LLWindow.cmake @@ -14,18 +14,10 @@ if (STANDALONE) ) else (STANDALONE) if (LINUX) - use_prebuilt_binary(mesa) use_prebuilt_binary(SDL) set (SDL_FOUND TRUE) - set (SDL_INCLUDE_DIR - ${LIBS_PREBUILT_DIR}/include - ${LIBS_PREBUILT_LEGACY_DIR}/include - ) - if(WORD_SIZE EQUAL 64) - set (SDL_LIBRARY SDL) - else(WORD_SIZE EQUAL 64) - set (SDL_LIBRARY SDL directfb fusion direct) - endif(WORD_SIZE EQUAL 64) + set (SDL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include) + set (SDL_LIBRARY SDL) endif (LINUX) endif (STANDALONE) diff --git a/indra/cmake/UI.cmake b/indra/cmake/UI.cmake index 065e74da9..f58915934 100644 --- a/indra/cmake/UI.cmake +++ b/indra/cmake/UI.cmake @@ -1,5 +1,6 @@ # -*- cmake -*- include(Prebuilt) +include(FreeType) if (STANDALONE) include(FindPkgConfig) @@ -32,11 +33,10 @@ if (STANDALONE) endforeach(pkg) else (STANDALONE) if (LINUX) - use_prebuilt_binary(glib) # gtk-etc needs glib use_prebuilt_binary(gtk-atk-pango-glib) set(UI_LIBRARIES atk-1.0 - X11 + cairo gdk-x11-2.0 gdk_pixbuf-2.0 Xinerama @@ -48,19 +48,18 @@ else (STANDALONE) gtk-x11-2.0 pango-1.0 pangoft2-1.0 - pangox-1.0 pangoxft-1.0 pangocairo-1.0 + pixman-1 + X11 + ${FREETYPE_LIBRARIES} ) endif (LINUX) include_directories ( - ${LIBS_PREBUILT_DIR}/packages/include - ${LIBS_PREBUILT_DIR}/packages/include/cairo - ${LIBS_PREBUILT_DIR}/packages/include/pixman-1 - ${LIBS_PREBUILT_LEGACY_DIR}/include - ${LIBS_PREBUILT_LEGACY_DIR}/include/cairo - ${LIBS_PREBUILT_LEGACY_DIR}/include/pixman-1 + ${LIBS_PREBUILT_DIR}/include + ${LIBS_PREBUILT_DIR}/include/cairo + ${LIBS_PREBUILT_DIR}/include/pixman-1 ) foreach(include ${${LL_ARCH}_INCLUDES}) include_directories(${LIBS_PREBUILT_DIR}/include/${include}) diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 016fdd10f..ed2f43e01 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -87,17 +87,26 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") # If someone has specified a word size, use that to determine the # architecture. Otherwise, let the architecture specify the word size. if (WORD_SIZE EQUAL 32) + #message(STATUS "WORD_SIZE is 32") set(ARCH i686) + set(AUTOBUILD_PLATFORM_NAME "linux") elseif (WORD_SIZE EQUAL 64) + #message(STATUS "WORD_SIZE is 64") set(ARCH x86_64) + set(AUTOBUILD_PLATFORM_NAME "linux64") else (WORD_SIZE EQUAL 32) - if(CMAKE_SIZEOF_VOID_P MATCHES 4) - set(ARCH i686) - set(WORD_SIZE 32) - else(CMAKE_SIZEOF_VOID_P MATCHES 4) - set(ARCH x86_64) + #message(STATUS "WORD_SIZE is UNDEFINED") + if (CMAKE_SIZEOF_VOID_P EQUAL 8) + message(STATUS "Size of void pointer is detected as 8; ARCH is 64-bit") set(WORD_SIZE 64) - endif(CMAKE_SIZEOF_VOID_P MATCHES 4) + set(AUTOBUILD_PLATFORM_NAME "linux64") + elseif (CMAKE_SIZEOF_VOID_P EQUAL 4) + message(STATUS "Size of void pointer is detected as 4; ARCH is 32-bit") + set(WORD_SIZE 32) + set(AUTOBUILD_PLATFORM_NAME "linux") + else() + message(FATAL_ERROR "Unkown Architecture!") + endif (CMAKE_SIZEOF_VOID_P EQUAL 8) endif (WORD_SIZE EQUAL 32) if (NOT STANDALONE AND MULTIARCH_HACK) diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake index c0a20e183..71bf0bd0b 100644 --- a/indra/cmake/ViewerMiscLibs.cmake +++ b/indra/cmake/ViewerMiscLibs.cmake @@ -4,10 +4,6 @@ include(Prebuilt) if (NOT STANDALONE) use_prebuilt_binary(slvoice) if(LINUX) - use_prebuilt_binary(libuuid) - if (${ARCH} STREQUAL "x86_64") - use_prebuilt_binary(32bitcompatibilitylibs) - endif (${ARCH} STREQUAL "x86_64") use_prebuilt_binary(fontconfig) endif(LINUX) else (NOT STANDALONE) diff --git a/indra/cmake/ZLIB.cmake b/indra/cmake/ZLIB.cmake index 48e5130ad..5b38fc1af 100644 --- a/indra/cmake/ZLIB.cmake +++ b/indra/cmake/ZLIB.cmake @@ -13,6 +13,21 @@ else (STANDALONE) set(ZLIB_LIBRARIES debug zlibd optimized zlib) + elseif (LINUX) + # + # When we have updated static libraries in competition with older + # shared libraries and we want the former to win, we need to do some + # extra work. The *_PRELOAD_ARCHIVES settings are invoked early + # and will pull in the entire archive to the binary giving it + # priority in symbol resolution. Beware of cmake moving the + # achive load itself to another place on the link command line. If + # that happens, you can try something like -Wl,-lz here to hide + # the archive. Also be aware that the linker will not tolerate a + # second whole-archive load of the archive. See viewer's + # CMakeLists.txt for more information. + # + set(ZLIB_PRELOAD_ARCHIVES -Wl,--whole-archive z -Wl,--no-whole-archive) + set(ZLIB_LIBRARIES z) else (WINDOWS) set(ZLIB_LIBRARIES z) endif (WINDOWS) diff --git a/indra/libpathing/llpathinglib.cpp b/indra/libpathing/llpathinglib.cpp index 19c0bff0f..041311de9 100644 --- a/indra/libpathing/llpathinglib.cpp +++ b/indra/libpathing/llpathinglib.cpp @@ -1,4 +1,3 @@ -#include "sys.h" #include "llpathinglib.h" void LLPathingLib::initSystem() diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index c6a187840..78f50e6e3 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -2,7 +2,6 @@ project(llcommon) -include(Cwdebug) include(00-Common) include(LLCommon) include(APR) @@ -251,16 +250,16 @@ set(llcommon_HEADER_FILES set_source_files_properties(${llcommon_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) -list(APPEND llcommon_SOURCE_FILES ${cwdebug_SOURCE_FILES}) list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES}) +if(NOT WORD_SIZE EQUAL 32) + if(NOT WINDOWS) + add_definitions(-fPIC) + endif(NOT WINDOWS) +endif(NOT WORD_SIZE EQUAL 32) + if(LLCOMMON_LINK_SHARED) add_library (llcommon SHARED ${llcommon_SOURCE_FILES}) - if(NOT WORD_SIZE EQUAL 32) - if(NOT WINDOWS) - add_definitions(-fPIC) - endif(NOT WINDOWS) - endif(NOT WORD_SIZE EQUAL 32) if(WINDOWS) # always generate llcommon.pdb, even for "Release" builds set_target_properties(llcommon PROPERTIES LINK_FLAGS "/DEBUG") diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h index 33b6e9809..255f115c9 100644 --- a/indra/llcommon/llthread.h +++ b/indra/llcommon/llthread.h @@ -201,7 +201,7 @@ protected: #include typedef boost::recursive_mutex LLMutexImpl; typedef boost::condition_variable_any LLConditionVariableImpl; -#elif defined(USE_STD_MUTEX) && LL_CPP11 +#elif defined(USE_STD_MUTEX) && defined(LL_CPP11) #include typedef std::recursive_mutex LLMutexImpl; typedef std::condition_variable_any LLConditionVariableImpl; diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 36bcd266b..7ab4b0cbc 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -423,7 +423,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B // Set the application icon. SDL_Surface *bmpsurface; - bmpsurface = Load_BMP_Resource("singularity_icon.BMP"); + bmpsurface = Load_BMP_Resource("viewer_icon.BMP"); if (bmpsurface) { // This attempts to give a black-keyed mask to the icon. diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 0b7ce2453..e34bb1097 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -40,28 +40,22 @@ include(TemplateCheck) include(UI) include(ViewerMiscLibs) include(WinManifest) - - -if (WINDOWS) - set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP) - include(InstallRequiredSystemLibraries) -endif (WINDOWS) +include(ZLIB) include_directories( - ${CMAKE_SOURCE_DIR}/newview ${STATEMACHINE_INCLUDE_DIRS} ${DBUSGLIB_INCLUDE_DIRS} - ${HUNSPELL_INCLUDE_DIR} + ${ZLIB_INCLUDE_DIRS} ${JSONCPP_INCLUDE_DIR} - ${GLOD_INCLUDE_DIRS} + ${GLOD_INCLUDE_DIR} ${LLAUDIO_INCLUDE_DIRS} ${LLCHARACTER_INCLUDE_DIRS} ${LLCOMMON_INCLUDE_DIRS} + ${LLPHYSICSEXTENSIONS_INCLUDE_DIRS} ${LLIMAGE_INCLUDE_DIRS} ${LLINVENTORY_INCLUDE_DIRS} ${LLMATH_INCLUDE_DIRS} ${LLMESSAGE_INCLUDE_DIRS} - ${LLPHYSICSEXTENSIONS_INCLUDE_DIRS} ${LLPLUGIN_INCLUDE_DIRS} ${LLPRIMITIVE_INCLUDE_DIRS} ${LLRENDER_INCLUDE_DIRS} @@ -69,6 +63,8 @@ include_directories( ${LLVFS_INCLUDE_DIRS} ${LLWINDOW_INCLUDE_DIRS} ${LLXML_INCLUDE_DIRS} + ${HUNSPELL_INCLUDE_DIR} + ${LLAPPEARANCE_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR} ) @@ -1613,6 +1609,8 @@ endif (WINDOWS) # To work around this, higher level modules should be listed before the modules # that they depend upon. -brad target_link_libraries(${VIEWER_BINARY_NAME} + ${PNG_PRELOAD_ARCHIVES} + ${ZLIB_PRELOAD_ARCHIVES} ${GOOGLE_PERFTOOLS_LIBRARIES} ${LLAUDIO_LIBRARIES} ${LLAUDIO_VORBIS_LIBRARIES} @@ -1665,8 +1663,7 @@ if (LINUX) # These are the generated targets that are copied to package/ set(COPY_INPUT_DEPENDENCIES ${VIEWER_BINARY_NAME} - linux-crash-logger - AlchemyPlugin + SLPlugin media_plugin_gstreamer010 llcommon ) @@ -1691,7 +1688,6 @@ if (LINUX) --standalone=${STANDALONE} --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched DEPENDS - secondlife-stripped ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ${COPY_INPUT_DEPENDENCIES} ) diff --git a/indra/newview/linux_tools/wrapper.sh.in b/indra/newview/linux_tools/wrapper.sh similarity index 96% rename from indra/newview/linux_tools/wrapper.sh.in rename to indra/newview/linux_tools/wrapper.sh index 60c92485d..43b135a15 100755 --- a/indra/newview/linux_tools/wrapper.sh.in +++ b/indra/newview/linux_tools/wrapper.sh @@ -142,7 +142,7 @@ if [ -n "$LL_TCMALLOC" ]; then fi fi -export VIEWER_BINARY='@VIEWER_BRANDING_ID@-do-not-run-directly' +export VIEWER_BINARY='do-not-directly-run-singularity-bin' BINARY_TYPE=$(expr match "$(file -b bin/$VIEWER_BINARY)" '\(.*executable\)' | sed -e 's/ / /g') if [ "${BINARY_TYPE}" == "ELF 32-bit LSB executable" ]; then SL_ENV+='LD_LIBRARY_PATH="`pwd`/lib:$LD_LIBRARY_PATH"' @@ -151,15 +151,9 @@ else fi export SL_CMD='$LL_WRAPPER bin/$VIEWER_BINARY' -if [ -n "$AITESTPLUGIN" ]; then - SL_CMD="$LL_WRAPPER bin/SLPlugin" - SL_OPT="TESTPLUGIN" -else - SL_OPT="`cat gridargs.dat` $@" -fi # Run the program. -eval ${SL_ENV} ${SL_CMD} ${SL_OPT} || LL_RUN_ERR=runerr +eval ${SL_ENV} ${SL_CMD} || LL_RUN_ERR=runerr # Handle any resulting errors if [ "$LL_RUN_ERR" = "runerr" ]; then diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 14823bf31..9d006d2e0 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -70,7 +70,9 @@ #include "lldxhardware.h" #endif +#if !LL_LINUX #include "cef/llceflib.h" +#endif extern LLMemoryInfo gSysMemory; extern U32 gPacketsIn; @@ -286,10 +288,12 @@ LLFloaterAbout::LLFloaterAbout() support.append( gAudiop ? gAudiop->getDriverName(want_fullname) : "(none)" ); support.append("\n"); +#if !LL_LINUX // TODO: Implement media plugin version query support.append("LLCEFLib/CEF Version: "); support.append(LLCEFLIB_VERSION); support.append("\n"); +#endif if (gPacketsIn > 0) { diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h index 187e71a72..6039d5ec3 100644 --- a/indra/newview/llviewerprecompiledheaders.h +++ b/indra/newview/llviewerprecompiledheaders.h @@ -41,22 +41,6 @@ #include "linden_common.h" -// We may want to take the windows.h include out, but it used to be in -// linden_common.h, and hence in all the libraries. This is better. JC -#if LL_WINDOWS - // Limit Windows API to small and manageable set. - // If you get undefined symbols, find the appropriate - // Windows header file and include that in your .cpp file. - #define WIN32_LEAN_AND_MEAN - #include - #include -#endif - -// Work around stupid Microsoft STL warning -#ifdef LL_WINDOWS -#pragma warning (disable : 4702) // warning C4702: unreachable code -#endif - #include #include #include diff --git a/indra/newview/res-sdl/singularity_icon.BMP b/indra/newview/res-sdl/singularity_icon.BMP deleted file mode 100644 index 7e27d0eca426515ee8730954a66e2874c0bb8b02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262198 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 BBW?fy diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 19b1046ee..0c63924b2 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -865,17 +865,19 @@ class LinuxManifest(ViewerManifest): def construct(self): import shutil shutil.rmtree("./packaged/app_settings/shaders", ignore_errors=True); - super(LinuxManifest, self).construct() self.path("licenses-linux.txt","licenses.txt") - self.path("res/"+self.icon_name(),self.icon_name()) + pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') + relpkgdir = os.path.join(pkgdir, "lib", "release") + debpkgdir = os.path.join(pkgdir, "lib", "debug") + if self.prefix("linux_tools", dst=""): self.path("client-readme.txt","README-linux.txt") self.path("client-readme-voice.txt","README-linux-voice.txt") self.path("client-readme-joystick.txt","README-linux-joystick.txt") - self.path("wrapper.sh",self.wrapper_name()) + self.path("wrapper.sh","singularity") if self.prefix(src="", dst="etc"): self.path("handle_secondlifeprotocol.sh") self.path("register_secondlifeprotocol.sh") @@ -886,16 +888,10 @@ class LinuxManifest(ViewerManifest): self.end_prefix("linux_tools") # Create an appropriate gridargs.dat for this package, denoting required grid. - self.put_in_file(self.flags_list(), 'gridargs.dat') - - ## Singu note: we'll go strip crazy later on - #if self.buildtype().lower()=='release': - # self.path("secondlife-stripped","bin/"+self.binary_name()) - #else: - # self.path("secondlife-bin","bin/"+self.binary_name()) - self.path("secondlife-bin","bin/"+self.binary_name()) + # self.put_in_file(self.flags_list(), 'gridargs.dat') if self.prefix(src="", dst="bin"): + self.path("secondlife-bin","do-not-directly-run-singularity-bin") self.path2basename("../llplugin/slplugin", "SLPlugin") self.end_prefix("bin") @@ -904,6 +900,16 @@ class LinuxManifest(ViewerManifest): # recurse self.end_prefix("res-sdl") + # Get the icons based on the channel type + icon_path = self.icon_path() + print "DEBUG: icon_path '%s'" % icon_path + if self.prefix(src=icon_path, dst="") : + self.path("viewer_256.png","viewer_icon.png") + if self.prefix(src="",dst="res-sdl") : + self.path("viewer_256.BMP","viewer_icon.BMP") + self.end_prefix("res-sdl") + self.end_prefix(icon_path) + # plugins if self.prefix(src="", dst="bin/llplugin"): self.path2basename("../plugins/filepicker", "libbasic_plugin_filepicker.so") @@ -913,123 +919,92 @@ class LinuxManifest(ViewerManifest): self.path("featuretable_linux.txt") - def wrapper_name(self): - return self.viewer_branding_id() - def binary_name(self): - return self.viewer_branding_id() + '-do-not-run-directly' - - def icon_name(self): - return self.viewer_branding_id() + "_icon.png" def package_finish(self): - if 'installer_name' in self.args: - installer_name = self.args['installer_name'] - else: - installer_name_components = [self.installer_prefix(), self.args.get('arch')] - installer_name_components.extend(self.args['version']) - installer_name = "_".join(installer_name_components) - if self.default_channel(): - if not self.default_grid(): - installer_name += '_' + self.args['grid'].upper() - else: - installer_name += '_' + self.channel_oneword().upper() + installer_name = self.installer_base_name() self.strip_binaries() # Fix access permissions self.run_command(""" - find '%(dst)s' -type d -print0 | xargs -0 --no-run-if-empty chmod 755; - find '%(dst)s' -type f -perm 0700 -print0 | xargs -0 --no-run-if-empty chmod 0755; - find '%(dst)s' -type f -perm 0500 -print0 | xargs -0 --no-run-if-empty chmod 0755; - find '%(dst)s' -type f -perm 0600 -print0 | xargs -0 --no-run-if-empty chmod 0644; - find '%(dst)s' -type f -perm 0400 -print0 | xargs -0 --no-run-if-empty chmod 0644; + find %(dst)s -type d | xargs --no-run-if-empty chmod 755; + find %(dst)s -type f -perm 0700 | xargs --no-run-if-empty chmod 0755; + find %(dst)s -type f -perm 0500 | xargs --no-run-if-empty chmod 0555; + find %(dst)s -type f -perm 0600 | xargs --no-run-if-empty chmod 0644; + find %(dst)s -type f -perm 0400 | xargs --no-run-if-empty chmod 0444; true""" % {'dst':self.get_dst_prefix() }) - self.package_file = installer_name + '.tar.bz2' + self.package_file = installer_name + '.tar.xz' # temporarily move directory tree so that it has the right # name in the tarfile - self.run_command("mv '%(dst)s' '%(inst)s'" % { + self.run_command("mv %(dst)s %(inst)s" % { 'dst': self.get_dst_prefix(), 'inst': self.build_path_of(installer_name)}) try: - # --numeric-owner hides the username of the builder for - # security etc. - self.run_command("tar -C '%(dir)s' --numeric-owner -cjf " - "'%(inst_path)s.tar.bz2' %(inst_name)s" % { - 'dir': self.get_build_prefix(), - 'inst_name': installer_name, - 'inst_path':self.build_path_of(installer_name)}) - print '' + # only create tarball if it's a release build. + if self.args['buildtype'].lower() == 'release': + # --numeric-owner hides the username of the builder for + # security etc. + self.run_command('tar -C %(dir)s --numeric-owner -cJf ' + '%(inst_path)s.tar.xz %(inst_name)s' % { + 'dir': self.get_build_prefix(), + 'inst_name': installer_name, + 'inst_path':self.build_path_of(installer_name)}) + else: + print "Skipping %s.tar.xz for non-Release build (%s)" % \ + (installer_name, self.args['buildtype']) finally: - self.run_command("mv '%(inst)s' '%(dst)s'" % { + self.run_command("mv %(inst)s %(dst)s" % { 'dst': self.get_dst_prefix(), 'inst': self.build_path_of(installer_name)}) def strip_binaries(self): - if self.args['buildtype'].lower() in ['release', 'releasesse2']: + if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer(): print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" - # makes some small assumptions about our packaged dir structure - self.run_command("find %(d)r/bin %(d)r/lib* -type f | xargs -d '\n' --no-run-if-empty strip --strip-unneeded" % {'d': self.get_dst_prefix()} ) - self.run_command("find %(d)r/bin %(d)r/lib* -type f -not -name \\*.so | xargs -d '\n' --no-run-if-empty strip -s" % {'d': self.get_dst_prefix()} ) + self.run_command(r"find %(d)r/bin %(d)r/lib %(d)r/lib32 %(d)r/lib64 -type f \! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure + class Linux_i686_Manifest(LinuxManifest): def construct(self): super(Linux_i686_Manifest, self).construct() + pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') + relpkgdir = os.path.join(pkgdir, "lib", "release") + debpkgdir = os.path.join(pkgdir, "lib", "debug") + # llcommon if not self.path("../llcommon/libllcommon.so", "lib/libllcommon.so"): print "Skipping llcommon.so (assuming llcommon was linked statically)" - if (not self.standalone()) and self.prefix(src="../packages/lib/release", alt_build="../packages/libraries/i686-linux/lib/release", dst="lib"): + if (not self.standalone()) and self.prefix(src=relpkgdir, dst="lib"): self.path("libapr-1.so*") self.path("libaprutil-1.so*") - self.path("libdb*.so") self.path("libexpat.so*") - self.path("libglod.so") - self.path("libuuid.so*") + self.path("libGLOD.so") self.path("libSDL-1.2.so*") - self.path("libdirectfb-1.*.so*") - self.path("libfusion-1.*.so*") - self.path("libdirect-1.*.so*") - - self.path("libminizip.so.1.2.3", "libminizip.so"); - self.path("libhunspell-*.so.*") # OpenAL self.path("libalut.so") self.path("libopenal.so.1") - self.path("libcollada14dom.so.2.2", "libcollada14dom.so") - self.path("libcrypto.so*") - self.path("libssl.so*") self.path("libtcmalloc_minimal.so.0") self.path("libtcmalloc_minimal.so.0.2.2") - - # Boost - self.path("libboost_context-mt.so.*") - self.path("libboost_filesystem-mt.so.*") - self.path("libboost_program_options-mt.so.*") - self.path("libboost_regex-mt.so.*") - self.path("libboost_signals-mt.so.*") - self.path("libboost_system-mt.so.*") - self.path("libboost_thread-mt.so.*") - self.end_prefix("lib") - if (not self.standalone()) and self.prefix(src='', alt_build="../packages/lib/release", dst="lib"): - self.add_extra_libraries() - self.end_prefix() - # Vivox runtimes - if self.prefix(src="../packages/lib/release", dst="bin"): + if self.prefix(src=relpkgdir, dst="bin"): self.path("SLVoice") self.end_prefix("bin") - if self.prefix(src="../packages/lib/release", dst="lib"): + if self.prefix(src=relpkgdir, dst="lib"): self.path("libortp.so") + self.path("libsndfile.so.1") + self.path("libvivoxoal.so.1") self.path("libvivoxsdk.so") + self.path("libvivoxplatform.so") self.end_prefix("lib") + class Linux_x86_64_Manifest(LinuxManifest): def construct(self): super(Linux_x86_64_Manifest, self).construct() @@ -1038,64 +1013,49 @@ class Linux_x86_64_Manifest(LinuxManifest): if not self.path("../llcommon/libllcommon.so", "lib64/libllcommon.so"): print "Skipping llcommon.so (assuming llcommon was linked statically)" - if (not self.standalone()) and self.prefix(src="../packages/lib/release", alt_build="../packages/libraries/x86_64-linux/lib/release", dst="lib64"): + pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') + relpkgdir = os.path.join(pkgdir, "lib", "release") + debpkgdir = os.path.join(pkgdir, "lib", "debug") + + if (not self.standalone()) and self.prefix(relpkgdir, dst="lib64"): self.path("libapr-1.so*") self.path("libaprutil-1.so*") - - self.path("libdb-*.so*") - self.path("libexpat.so*") - self.path("libglod.so") - self.path("libssl.so*") - self.path("libuuid.so*") + self.path("libGLOD.so") self.path("libSDL-1.2.so*") - self.path("libminizip.so.1.2.3", "libminizip.so"); self.path("libhunspell-1.3.so*") - # OpenAL self.path("libalut.so*") self.path("libopenal.so*") + self.path("libfreetype.so*") - self.path("libcollada14dom.so.2.2", "libcollada14dom.so") - self.path("libcrypto.so.*") - self.path("libjpeg.so*") - self.path("libpng*.so*") - self.path("libz.so*") - - # Boost - self.path("libboost_context-mt.so.*") - self.path("libboost_filesystem-mt.so.*") - self.path("libboost_program_options-mt.so.*") - self.path("libboost_regex-mt.so.*") - self.path("libboost_signals-mt.so.*") - self.path("libboost_system-mt.so.*") - self.path("libboost_thread-mt.so.*") + try: + self.path("libtcmalloc.so*") #formerly called google perf tools + pass + except: + print "tcmalloc files not found, skipping" + pass + try: + self.path("libfmod.so*") + pass + except: + print "Skipping libfmod.so - not found" + pass self.end_prefix("lib64") - if (not self.standalone()) and self.prefix(src='', alt_build="../packages/lib/release", dst="lib64"): - self.add_extra_libraries() - self.end_prefix() - # Vivox runtimes - if self.prefix(src="../packages/lib/release", dst="bin"): + if self.prefix(src=relpkgdir, dst="bin"): self.path("SLVoice") self.end_prefix("bin") - if self.prefix(src="../packages/lib/release", dst="lib32"): - #self.path("libalut.so") + if self.prefix(src=relpkgdir, dst="lib32"): self.path("libortp.so") + self.path("libsndfile.so.1") + self.path("libvivoxoal.so.1") self.path("libvivoxsdk.so") + self.path("libvivoxplatform.so") self.end_prefix("lib32") - # 32bit libs needed for voice - if self.prefix(src="../packages/lib/release/32bit-compat", alt_build="../packages/libraries/x86_64-linux/lib/release/32bit-compat", dst="lib32"): - # Vivox libs - self.path("libalut.so") - self.path("libidn.so.11") - self.path("libopenal.so.1") - # self.path("libortp.so") - self.path("libuuid.so.1") - self.end_prefix("lib32") ################################################################ @@ -1121,3 +1081,4 @@ def symlinkf(src, dst): if __name__ == "__main__": main() + diff --git a/indra/plugins/CMakeLists.txt b/indra/plugins/CMakeLists.txt index d7da04544..3ff2a5357 100644 --- a/indra/plugins/CMakeLists.txt +++ b/indra/plugins/CMakeLists.txt @@ -3,7 +3,9 @@ add_subdirectory(base_basic) add_subdirectory(base_media) add_subdirectory(filepicker) +if (NOT LINUX) add_subdirectory(cef) +endif (NOT LINUX) if (LINUX) add_subdirectory(gstreamer010)