Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,7 @@ endif()
include(DaemonNacl)
if (NACL)
add_library(srclibs-nacl-module EXCLUDE_FROM_ALL ${NACLLIST_MODULE})
set_target_properties(srclibs-nacl-module PROPERTIES POSITION_INDEPENDENT_CODE 1 FOLDER "libs")
set_target_properties(srclibs-nacl-module PROPERTIES POSITION_INDEPENDENT_CODE ${GAME_PIE} FOLDER "libs")
set(LIBS_BASE ${LIBS_BASE} srclibs-nacl-module)
else()
add_library(srclibs-nacl-native EXCLUDE_FROM_ALL ${NACLLIST_NATIVE})
Expand All @@ -531,9 +531,11 @@ endif()
if (WIN32)
set(LIBS_BASE ${LIBS_BASE} winmm ws2_32)
elseif (NACL)
find_library(NACL_EXCEPTION nacl_exception)
find_library(NACL_MINIDUMP minidump_generator)
set(LIBS_BASE ${LIBS_BASE} ${NACL_MINIDUMP} ${NACL_EXCEPTION} )
if (NOT USE_NACL_SAIGO)
find_library(NACL_EXCEPTION nacl_exception)
find_library(NACL_MINIDUMP minidump_generator)
set(LIBS_BASE ${LIBS_BASE} ${NACL_MINIDUMP} ${NACL_EXCEPTION})
endif()
else()
find_library(LIBM m)
if (LIBM)
Expand Down Expand Up @@ -634,14 +636,13 @@ if ( USE_STATIC_LIBS )
endif()
endif()


# zlib
if (BUILD_CLIENT OR BUILD_TTY_CLIENT OR BUILD_SERVER OR BUILD_DUMMY_APP OR NACL)
if (BUILD_CLIENT OR BUILD_TTY_CLIENT OR BUILD_SERVER OR BUILD_DUMMY_APP OR (BUILD_CGAME AND NACL AND NOT USE_NACL_SAIGO))
if (NOT NACL)
find_package(ZLIB REQUIRED)
else()
add_library(srclibs-zlib EXCLUDE_FROM_ALL ${ZLIBLIST})
set_target_properties(srclibs-zlib PROPERTIES POSITION_INDEPENDENT_CODE 1 FOLDER "libs")
set_target_properties(srclibs-zlib PROPERTIES POSITION_INDEPENDENT_CODE ${GAME_PIE} FOLDER "libs")
set(ZLIB_INCLUDE_DIRS ${LIB_DIR}/zlib)
set(ZLIB_LIBRARIES srclibs-zlib)
endif()
Expand Down
9 changes: 6 additions & 3 deletions cmake/DaemonFlags.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ else()
try_flag(WARNINGS "-Werror")
endif()

if (NACL)
if (NACL AND NOT USE_NACL_SAIGO)
# PNaCl only supports libc++ as standard library.
set_c_cxx_flag("-stdlib=libc++")
set_c_cxx_flag("--pnacl-allow-exceptions")
Expand Down Expand Up @@ -337,8 +337,11 @@ else()

try_c_cxx_flag(FNO_STRICT_OVERFLOW "-fno-strict-overflow")
try_c_cxx_flag(WSTACK_PROTECTOR "-Wstack-protector")
try_c_cxx_flag(FPIE "-fPIE")
try_linker_flag(LINKER_PIE "-pie")

if (NOT NACL OR (NACL AND GAME_PIE))
try_c_cxx_flag(FPIE "-fPIE")
try_linker_flag(LINKER_PIE "-pie")
endif()

if ("${FLAG_LINKER_PIE}" AND MINGW)
# https://github.com/msys2/MINGW-packages/issues/4100
Expand Down
137 changes: 101 additions & 36 deletions cmake/DaemonGame.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ include(DaemonFlags)

# Function to setup all the Sgame/Cgame libraries
include(CMakeParseArguments)

function(GAMEMODULE)
# ParseArguments setup
set(oneValueArgs NAME)
Expand Down Expand Up @@ -66,50 +67,109 @@ function(GAMEMODULE)
else()
set(VM_GENERATOR ${CMAKE_GENERATOR})
endif()

set(FORK 1 PARENT_SCOPE)
include(ExternalProject)
set(vm nacl-vms)
set(inherited_option_args)

foreach(inherited_option ${NACL_VM_INHERITED_OPTIONS})
set(inherited_option_args ${inherited_option_args}
"-D${inherited_option}=${${inherited_option}}")
endforeach(inherited_option)

# Workaround a bug where CMake ExternalProject lists-as-args are cut on first “;”
string(REPLACE ";" "," NACL_TARGETS_STRING "${NACL_TARGETS}")

ExternalProject_Add(${vm}
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${vm}
CMAKE_GENERATOR ${VM_GENERATOR}
CMAKE_ARGS
-DFORK=2
-DCMAKE_TOOLCHAIN_FILE=${Daemon_SOURCE_DIR}/cmake/toolchain-pnacl.cmake
-DDAEMON_DIR=${Daemon_SOURCE_DIR}
-DDEPS_DIR=${DEPS_DIR}
-DBUILD_GAME_NACL=ON
-DNACL_TARGETS_STRING=${NACL_TARGETS_STRING}
-DBUILD_GAME_NATIVE_DLL=OFF
-DBUILD_GAME_NATIVE_EXE=OFF
-DBUILD_CLIENT=OFF
-DBUILD_TTY_CLIENT=OFF
-DBUILD_SERVER=OFF
${inherited_option_args}
INSTALL_COMMAND ""
)
ExternalProject_Add_Step(${vm} forcebuild
COMMAND ${CMAKE_COMMAND} -E remove
${CMAKE_CURRENT_BINARY_DIR}/${vm}-prefix/src/${vm}-stamp/${vm}-configure
COMMENT "Forcing build step for '${vm}'"
DEPENDEES build
ALWAYS 1
)
if (USE_NACL_SAIGO)
unset(NACL_VMS_PROJECTS)

foreach(NACL_TARGET ${NACL_TARGETS})
if (NACL_TARGET STREQUAL "i686")
set(SAIGO_ARCH "i686")
elseif (NACL_TARGET STREQUAL "amd64")
set(SAIGO_ARCH "x86_64")
elseif (NACL_TARGET STREQUAL "armhf")
set(SAIGO_ARCH "arm")
else()
message(FATAL_ERROR "Unknown NaCl architecture ${NACL_TARGET}")
endif()

set(NACL_VMS_PROJECT nacl-vms-${NACL_TARGET})
list(APPEND NACL_VMS_PROJECTS ${NACL_VMS_PROJECT})

ExternalProject_Add(${NACL_VMS_PROJECT}
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT}
CMAKE_GENERATOR ${VM_GENERATOR}
CMAKE_ARGS
-DFORK=2
-DCMAKE_TOOLCHAIN_FILE=${Daemon_SOURCE_DIR}/cmake/toolchain-saigo.cmake
-DDAEMON_DIR=${Daemon_SOURCE_DIR}
-DDEPS_DIR=${DEPS_DIR}
-DBUILD_GAME_NACL=ON
-DUSE_NACL_SAIGO=ON
-DNACL_TARGET=${NACL_TARGET}
-DSAIGO_ARCH=${SAIGO_ARCH}
-DBUILD_GAME_NATIVE_DLL=OFF
-DBUILD_GAME_NATIVE_EXE=OFF
-DBUILD_CLIENT=OFF
-DBUILD_TTY_CLIENT=OFF
-DBUILD_SERVER=OFF
${inherited_option_args}
INSTALL_COMMAND ""
)

# Force the rescan and rebuild of the subproject.
ExternalProject_Add_Step(${NACL_VMS_PROJECT} forcebuild
COMMAND ${CMAKE_COMMAND} -E remove
${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT}-prefix/src/${NACL_VMS_PROJECT}-stamp/${NACL_VMS_PROJECT}-configure
COMMENT "Forcing build step for '${NACL_VMS_PROJECT}'"
DEPENDEES build
ALWAYS 1
)
endforeach()
else()
set(NACL_VMS_PROJECT nacl-vms-pexe)
set(NACL_VMS_PROJECTS ${NACL_VMS_PROJECT})

# Workaround a bug where CMake ExternalProject lists-as-args are cut on first “;”
string(REPLACE ";" "," NACL_TARGETS_STRING "${NACL_TARGETS}")

ExternalProject_Add(${NACL_VMS_PROJECT}
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT}
CMAKE_GENERATOR ${VM_GENERATOR}
CMAKE_ARGS
-DFORK=2
-DCMAKE_TOOLCHAIN_FILE=${Daemon_SOURCE_DIR}/cmake/toolchain-pnacl.cmake
-DDAEMON_DIR=${Daemon_SOURCE_DIR}
-DDEPS_DIR=${DEPS_DIR}
-DBUILD_GAME_NACL=ON
-DNACL_TARGETS_STRING=${NACL_TARGETS_STRING}
-DBUILD_GAME_NATIVE_DLL=OFF
-DBUILD_GAME_NATIVE_EXE=OFF
-DBUILD_CLIENT=OFF
-DBUILD_TTY_CLIENT=OFF
-DBUILD_SERVER=OFF
${inherited_option_args}
INSTALL_COMMAND ""
)

# Force the rescan and rebuild of the subproject.
ExternalProject_Add_Step(${NACL_VMS_PROJECT} forcebuild
COMMAND ${CMAKE_COMMAND} -E remove
${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT}-prefix/src/${NACL_VMS_PROJECT}-stamp/${NACL_VMS_PROJECT}-configure
COMMENT "Forcing build step for '${NACL_VMS_PROJECT}'"
DEPENDEES build
ALWAYS 1
)
endif()
endif()
else()
if (FORK EQUAL 2)
# Put the .nexe and .pexe files in the same directory as the engine
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/..)
if(USE_NACL_SAIGO)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
else()
# Put the .nexe and .pexe files in the same directory as the engine
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/..)
endif()
endif()

add_executable(${GAMEMODULE_NAME}-nacl ${PCH_FILE} ${GAMEMODULE_FILES} ${SHAREDLIST_${GAMEMODULE_NAME}} ${SHAREDLIST} ${COMMONLIST})
Expand All @@ -127,9 +187,14 @@ function(GAMEMODULE)
# Revert a workaround for a bug where CMake ExternalProject lists-as-args are cut on first “;”
string(REPLACE "," ";" NACL_TARGETS "${NACL_TARGETS_STRING}")

# Generate NaCl executables for supported architectures.
foreach(NACL_TARGET ${NACL_TARGETS})
pnacl_finalize(${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${GAMEMODULE_NAME} ${NACL_TARGET})
endforeach()
if (USE_NACL_SAIGO)
# Finalize NaCl executables for supported architectures.
saigo_finalize(${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/.. ${GAMEMODULE_NAME} ${NACL_TARGET})
else()
# Generate NaCl executables for supported architectures.
foreach(NACL_TARGET ${NACL_TARGETS})
pnacl_finalize(${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${GAMEMODULE_NAME} ${NACL_TARGET})
endforeach()
endif()
endif()
endfunction()
28 changes: 23 additions & 5 deletions cmake/DaemonNacl.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,31 @@

# Native client

option(USE_NACL_SAIGO "Use Saigo toolchain to build NaCl executables" OFF)

if( NACL )
# Build nexe binary.
# Those defines looks to be meaningless to produce arch-independent pexe,
# but they must be set to anything supported by native builds. this
# requirement looks to be a NaCl bug.
add_definitions( -DNACL_BUILD_ARCH=x86 )
add_definitions( -DNACL_BUILD_SUBARCH=64 )
if(USE_NACL_SAIGO)
# NACL_ARCH is "pnacl" here, NACL_TARGET carries the architecture.
if (NACL_TARGET STREQUAL "amd64")
add_definitions(-DNACL_BUILD_ARCH=x86)
add_definitions(-DNACL_BUILD_SUBARCH=64)
elseif (NACL_TARGET STREQUAL "i686")
add_definitions(-DNACL_BUILD_ARCH=x86)
add_definitions(-DNACL_BUILD_SUBARCH=32)
elseif (NACL_TARGET STREQUAL "armhf")
add_definitions(-DNACL_BUILD_ARCH=arm)
else()
message(FATAL_ERROR "Unsupported architecture ${NACL_TARGET}")
endif()
else()
# Those defines looks to be meaningless to produce arch-independent pexe
# with PNaCl but they must be set to anything supported by native builds.
# This requirement looks to be a PNaCl bug.
# NACL_ARCH is "pnacl" here, NACL_TARGET is not set.
add_definitions( -DNACL_BUILD_ARCH=x86 )
add_definitions( -DNACL_BUILD_SUBARCH=64 )
endif()
else()
# Build native dll or native exe.
if( APPLE )
Expand Down
9 changes: 9 additions & 0 deletions cmake/DaemonPlatform.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,13 @@ else()
message( FATAL_ERROR "Platform not supported" )
endif()

if (NACL AND USE_NACL_SAIGO)
# Saigo clang reports weird errors when building some cgame and sgame arm nexe with PIE.
# Saigo clang crashes when building amd64 cgame with PIE, sgame builds properly though.
set(GAME_PIE 0)
else()
set(GAME_PIE 1)
endif()


include(DaemonArchitecture)
75 changes: 75 additions & 0 deletions cmake/toolchain-saigo.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
set(PLATFORM_PREFIX "${DEPS_DIR}/saigo_newlib/bin")
set(PLATFORM_TRIPLET "${SAIGO_ARCH}-nacl")
set(PLATFORM_EXE_SUFFIX ".nexe")

set(CMAKE_SYSTEM_NAME "Generic")

set(CMAKE_C_COMPILER "${PLATFORM_PREFIX}/${PLATFORM_TRIPLET}-clang")
set(CMAKE_CXX_COMPILER "${PLATFORM_PREFIX}/${PLATFORM_TRIPLET}-clang++")
set(CMAKE_AR "${PLATFORM_PREFIX}/${PLATFORM_TRIPLET}-ar" CACHE FILEPATH "Archiver" FORCE)
set(CMAKE_RANLIB "${PLATFORM_PREFIX}/${PLATFORM_TRIPLET}-ranlib")
set(SAIGO_STRIP "${PLATFORM_PREFIX}/${PLATFORM_TRIPLET}-strip")
set(CMAKE_FIND_ROOT_PATH "${PLATFORM_PREFIX}/../${PLATFORM_TRIPLET}")

# Copy-pasted from the PNaCl toolchain, it's not sure we need it.
set(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES 1)
set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_LIBRARIES 1)
set(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1)
set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1)
set(CMAKE_C_USE_RESPONSE_FILE_FOR_INCLUDES 1)
set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_INCLUDES 1)
set(CMAKE_C_RESPONSE_FILE_LINK_FLAG "@")
set(CMAKE_CXX_RESPONSE_FILE_LINK_FLAG "@")

# Copy-pasted from the PNaCl toolchain, it's not sure we need it.
# These commands can fail on windows if there is a space at the beginning
set(CMAKE_C_CREATE_STATIC_LIBRARY "<CMAKE_AR> rc <TARGET> <LINK_FLAGS> <OBJECTS>")
set(CMAKE_CXX_CREATE_STATIC_LIBRARY "<CMAKE_AR> rc <TARGET> <LINK_FLAGS> <OBJECTS>")

set(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
set(CMAKE_CXX_COMPILE_OBJECT "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")

set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")

# Copy-pasted from the PNaCl toolchain, it's not sure we need it.
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)

set(NACL ON)

set(CMAKE_C_FLAGS "")
set(CMAKE_CXX_FLAGS "")

function(saigo_finalize dir module arch)
set(SUBPROJECT_NEXE ${dir}/nacl-vms-${arch}/${module}.nexe)
set(NEXE ${dir}/${module}-${arch}.nexe)
set(STRIPPED_NEXE ${dir}/${module}-${arch}-stripped.nexe)

add_custom_command(
OUTPUT ${NEXE}
COMMENT "Copying ${module} (${arch})"
DEPENDS ${SUBPROJECT_NEXE}
COMMAND
${CMAKE_COMMAND}
-E copy
${SUBPROJECT_NEXE}
${NEXE}
)

add_custom_command(
OUTPUT ${STRIPPED_NEXE}
COMMENT "Stripping ${module} (${arch})"
DEPENDS ${NEXE}
COMMAND
"${SAIGO_STRIP}"
-s
${NEXE}
-o ${STRIPPED_NEXE}
)

add_custom_target(${module}-${arch} ALL DEPENDS ${STRIPPED_NEXE})
add_dependencies(${module}-${arch} ${module}-nacl)
endfunction()
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ extern "C" {

#include <sys/types.h>
#include <time.h>
#include <stdint.h>

#include "native_client/src/trusted/service_runtime/include/bits/nacl_syscalls.h"
#include "native_client/src/trusted/service_runtime/nacl_config.h"
Expand Down
4 changes: 4 additions & 0 deletions src/common/System.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <sys/random.h>
#endif
#ifdef __native_client__
#if !defined(__saigo__)
#include <nacl/nacl_exception.h>
#include <nacl/nacl_minidump.h>
#endif
#include <nacl/nacl_random.h>
#else
#include <dlfcn.h>
Expand Down Expand Up @@ -335,8 +337,10 @@ static void CrashHandler(const void* data, size_t n)

void SetupCrashHandler()
{
#if !defined(__saigo__)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this removed? It's the only debugging mechanism we have for NaCl.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably because I didn't make it work.

nacl_minidump_register_crash_handler();
nacl_minidump_set_callback(CrashHandler);
#endif
}
#else
NORETURN static void CrashHandler(int sig)
Expand Down