diff --git a/.travis.yml b/.travis.yml index d48b372f5b..ac7c952e3a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,6 +29,11 @@ matrix: exclude: - os: osx compiler: gcc + include: + - os: linux + compiler: gcc + env: WITHOUT_LLVM="yes" + git: submodules: false @@ -62,7 +67,11 @@ before_script: - source /opt/qt59/bin/qt59-env.sh - mkdir build - cd build - - cmake .. -DCMAKE_INSTALL_PREFIX=/usr + - if [ -z "$WITHOUT_LLVM" ]; then + cmake .. -DCMAKE_INSTALL_PREFIX=/usr; + else + cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DWITHOUT_LLVM=ON; + fi; - make -j 3 - # AppImage generation - if [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = false ]; then diff --git a/CMakeLists.txt b/CMakeLists.txt index 17fe139fea..a90d956478 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,12 @@ cmake_minimum_required(VERSION 2.8.12) -# uncomment next line if you want to build with GDB stub -# add_definitions(-DWITH_GDB_DEBUGGER) -set(CMAKE_CXX_STANDARD 14) +option(WITH_GDB "WITH_GDB" OFF) +option(WITHOUT_LLVM "WITHOUT_LLVM" OFF) + +if (WITH_GDB) + add_definitions(-DWITH_GDB_DEBUGGER) +endif() + set(ASMJIT_STATIC TRUE) if (NOT CMAKE_BUILD_TYPE) @@ -14,14 +18,6 @@ if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) message( FATAL_ERROR "RPCS3 can only be compiled on 64-bit platforms." ) endif() -if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1) - message( FATAL_ERROR "RPCS3 requires at least gcc-5.1." ) -endif() - -if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 6.1) - message( FATAL_ERROR "RPCS3 can't be compiled with gcc-6.1, see #1691." ) -endif() - find_program(CCACHE_FOUND ccache) if (CCACHE_FOUND) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) @@ -44,6 +40,7 @@ option(VULKAN_PREBUILT "" OFF) # TODO: do real installation, including copying directory structure set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_BINARY_DIR}/bin") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_BINARY_DIR}/bin") + add_subdirectory( Vulkan ) add_subdirectory( rpcs3 ) @@ -62,7 +59,7 @@ endif() # Linux installation -if(CMAKE_SYSTEM_NAME MATCHES "Linux|FreeBSD|OpenBSD") +if(UNIX AND NOT APPLE) # Install the application icon and menu item install(FILES rpcs3/rpcs3.svg DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps) diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index cc68dddfb6..4cd6bc2ebc 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 2.8.12) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake_modules") set(RES_FILES "") +set(CMAKE_CXX_STANDARD 14) # Qt section find_package(Qt5 REQUIRED COMPONENTS Widgets) @@ -27,6 +28,7 @@ endif() include(cotire) project(rpcs3) + # Generate git-version.h at build time. add_custom_target(GitVersion ALL DEPENDS something_that_never_exists) @@ -37,35 +39,38 @@ add_custom_command(OUTPUT something_that_never_exists # Check for a sufficient compiler and set build options include(ConfigureCompiler) - - if(WIN32) add_definitions(-DUNICODE) add_definitions(-D_WIN32_WINNT=0x0601) set(RES_FILES "rpcs3_.rc") - if(NOT MSVC) - set(CMAKE_RC_COMPILER_INIT windres) - enable_language(RC) - set(CMAKE_RC_COMPILE_OBJECT " -O coff -i -o ") - endif() +else() + add_definitions(-DGL_GLEXT_PROTOTYPES) + add_definitions(-DGLX_GLXEXT_PROTOTYPES) endif() if(NOT MSVC) if($ENV{CI}) set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O1") # fix for travis gcc OoM crash. Might be fixed with the move to containers. endif() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -fexceptions") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions") if(WIN32) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--allow-multiple-definition") # Workaround for mingw64 (MSYS2) + set(CMAKE_RC_COMPILER_INIT windres) + enable_language(RC) + set(CMAKE_RC_COMPILE_OBJECT " -O coff -i -o ") + + # Workaround for mingw64 (MSYS2) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--allow-multiple-definition") endif() + add_compile_options(-msse -msse2 -mcx16 -mssse3) + + find_package(GLEW REQUIRED) + find_package(ZLIB REQUIRED) else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:throwingNew /D _CRT_SECURE_NO_DEPRECATE=1 /D _CRT_NON_CONFORMING_SWPRINTFS=1 /D _SCL_SECURE_NO_WARNINGS=1") -endif() - -if(APPLE) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/opt/X11/include") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/opt/X11/include") + + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libc.lib /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /DYNAMICBASE:NO /BASE:0x10000 /FIXED") endif() if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") @@ -79,39 +84,20 @@ else() set(ADDITIONAL_LIBS "") endif() -If(NOT RPCS3_SRC_DIR) +if(NOT RPCS3_SRC_DIR) SET(RPCS3_SRC_DIR ${CMAKE_CURRENT_LIST_DIR}) Message("-- Initializing RPCS3_SRC_DIR=${RPCS3_SRC_DIR}") -Else() +else() Message("-- Using Custom RPCS3_SRC_DIR=${RPCS3_SRC_DIR}") -EndIf() +endif() set(CMAKE_MODULE_PATH "${RPCS3_SRC_DIR}/cmake_modules") -if(NOT WIN32) - add_definitions(-DGL_GLEXT_PROTOTYPES) - add_definitions(-DGLX_GLXEXT_PROTOTYPES) -endif() - -if(NOT MSVC) - if(APPLE) - find_path(GLEW_INCLUDE_DIR GL/glew.h - /usr/include/GL - /usr/openwin/share/include - /usr/openwin/include - /usr/X11R6/include - /usr/include/X11 - /opt/graphics/OpenGL/include - /opt/graphics/OpenGL/contrib/libglew - /usr/local/include - ) - endif() - find_package(GLEW REQUIRED) - find_package(ZLIB REQUIRED) -endif() find_package(OpenGL REQUIRED) find_package(OpenAL REQUIRED) -find_package(LLVM 4.0 CONFIG) +if (NOT WITHOUT_LLVM) + find_package(LLVM 4.0 CONFIG) +endif() if(APPLE) @@ -164,13 +150,15 @@ ${LLVM_INCLUDE_DIRS} "${RPCS3_SRC_DIR}/../3rdparty/stblib" "${RPCS3_SRC_DIR}/../3rdparty/cereal/include" ) + if(WIN32) - include_directories(BEFORE "${RPCS3_SRC_DIR}/../3rdparty/XAudio2_7") # Slimmed down version of minidx9 for XAudio2_7 only + # Slimmed down version of minidx9 for XAudio2_7 only + include_directories(BEFORE "${RPCS3_SRC_DIR}/../3rdparty/XAudio2_7") include_directories(BEFORE "${RPCS3_SRC_DIR}/../3rdparty/minidx12/Include") endif() if(NOT LLVM_FOUND) - Message("LLVM not found! LLVM 4.0 is required. RPCS3 will be compiled without LLVM support.") + Message("LLVM 4.0 not found. RPCS3 will be compiled without LLVM support.") else() add_definitions(${LLVM_DEFINITIONS}) add_definitions(-DLLVM_AVAILABLE) @@ -206,7 +194,7 @@ endif() get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) foreach(dir ${dirs}) - message(STATUS "dir='${dir}'") + message(STATUS "dir='${dir}'") endforeach() file( @@ -229,7 +217,7 @@ if (NOT WIN32 AND "${CMAKE_SYSTEM}" MATCHES "Linux") "${RPCS3_SRC_DIR}/../Vulkan/glslang/hlsl/*.cpp" "${RPCS3_SRC_DIR}/../Vulkan/glslang/SPIRV/*.cpp" ) - + set (RPCS3_SRC ${RPCS3_SRC} ${UNIX_GLSLANG}) endif() @@ -266,11 +254,6 @@ else() add_executable(rpcs3 ${RPCS3_SRC} ${RES_FILES} resources.qrc) endif() -if(MSVC) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libc.lib /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /DYNAMICBASE:NO /BASE:0x10000 /FIXED") -endif() - if(WIN32) target_link_libraries(rpcs3 ws2_32.lib Winmm.lib Psapi.lib VKstatic.1 glslang OSDependent OGLCompiler SPIRV HLSL setupapi.lib hidapi-hid Shlwapi.lib) if(NOT MSVC) @@ -281,12 +264,12 @@ if(WIN32) target_link_libraries(rpcs3 avformat.lib avcodec.lib avutil.lib swresample.lib swscale.lib png16_static ${OPENAL_LIBRARY} ${ADDITIONAL_LIBS}) else() target_link_libraries(rpcs3 ${OPENAL_LIBRARY} ${GLEW_LIBRARY} ${OPENGL_LIBRARIES} hidapi-hidraw udev) - target_link_libraries(rpcs3 -ldl -latomic -lpthread -lvulkan ${ZLIB_LIBRARIES} ${ADDITIONAL_LIBS}) + target_link_libraries(rpcs3 -ldl -lpthread -lvulkan ${ZLIB_LIBRARIES} ${ADDITIONAL_LIBS}) if (USE_SYSTEM_FFMPEG) link_libraries(${FFMPEG_LIBRARY_DIR}) target_link_libraries(rpcs3 libavformat.so libavcodec.so libavutil.so libswresample.so libswscale.so) else() - target_link_libraries(rpcs3 libavformat.a libavcodec.a libavutil.a libswresample.a libswscale.a -ldl) + target_link_libraries(rpcs3 libavformat.a libavcodec.a libavutil.a libswresample.a libswscale.a) endif() if (USE_SYSTEM_LIBPNG) target_link_libraries(rpcs3 ${PNG_LIBRARIES}) @@ -294,12 +277,18 @@ else() target_link_libraries(rpcs3 png16_static) endif() endif() + +# For some reason GCC 7 requires manually linking with -latomic +if (CMAKE_COMPILER_IS_GNUCC AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 7)) + target_link_libraries(rpcs3 -latomic) +endif() + if(LLVM_FOUND) target_link_libraries(rpcs3 ${LLVM_LIBS}) endif() -set_target_properties(rpcs3 PROPERTIES COTIRE_CXX_PREFIX_HEADER_INIT "${RPCS3_SRC_DIR}/stdafx.h") -cotire(rpcs3) - - target_link_libraries(rpcs3 ${RPCS3_QT_LIBS}) + +set_target_properties(rpcs3 PROPERTIES COTIRE_CXX_PREFIX_HEADER_INIT "${RPCS3_SRC_DIR}/stdafx.h") + +cotire(rpcs3) diff --git a/rpcs3/cmake_modules/ConfigureCompiler.cmake b/rpcs3/cmake_modules/ConfigureCompiler.cmake index 42606144c9..ef48bfdcf3 100644 --- a/rpcs3/cmake_modules/ConfigureCompiler.cmake +++ b/rpcs3/cmake_modules/ConfigureCompiler.cmake @@ -1,19 +1,19 @@ +cmake_minimum_required(VERSION 2.8.12) # Check and configure compiler options for RPCS3 if(CMAKE_COMPILER_IS_GNUCXX) - # Get GCC version - execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion - OUTPUT_VARIABLE GCC_VERSION) - string(REGEX MATCHALL "[0-9]+" GCC_VERSION_COMPONENTS ${GCC_VERSION}) - list(GET GCC_VERSION_COMPONENTS 0 GCC_MAJOR) - list(GET GCC_VERSION_COMPONENTS 1 GCC_MINOR) # GCC 4.9 and lower are too old if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9.0) message(FATAL_ERROR "GCC ${CMAKE_CXX_COMPILER_VERSION} is too old.") endif() - + if (CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 6.1) + message( FATAL_ERROR "RPCS3 can't be compiled with gcc-6.1, see #1691." ) + endif() + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1) + message( FATAL_ERROR "RPCS3 requires at least gcc-5.1." ) + endif() # FIXME: do we really need this? # GCC 6.1 is insufficient to compile, because of a regression bug #if(GCC_MAJOR EQUAL "6" AND GCC_MINOR EQUAL "1") @@ -31,11 +31,11 @@ if(CMAKE_COMPILER_IS_GNUCXX) elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") # Clang 3.4 and lower are too old - if(CLANG_VERSION_MAJOR LESS "3" AND CLANG_VERSION_MINOR LESS "4") + #if(CLANG_VERSION_MAJOR LESS "3" AND CLANG_VERSION_MINOR LESS "4") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.4) message(FATAL_ERROR - "Clang ${CLANG_VERSION_MAJOR}.${CLANG_VERSION_MINOR} is too old.") + "Clang ${CMAKE_CXX_COMPILER_VERSION} is too old.") endif() - # Set compiler options here add_compile_options(-ftemplate-depth=1024)