diff --git a/CMakeLists.txt b/CMakeLists.txt index c0f2fbae7..d6ea93bd6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,6 +36,11 @@ set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) set (CMAKE_CXX_STANDARD 11) +if(APPLE) + message(WARNING "CMake is not an officially supported build system for love on Apple platforms.") + message(WARNING "Use the prebuilt .app or the xcode project in platform/xcode/ instead.") +endif() + if(MSVC) set(LOVE_CONSOLE_EXE_NAME lovec) endif() @@ -48,11 +53,15 @@ else() set(LOVE_TARGET_PLATFORM x86) endif() -option(LOVE_JIT "Use LuaJIT" TRUE) +if(APPLE) + option(LOVE_JIT "Use LuaJIT" FALSE) +else() + option(LOVE_JIT "Use LuaJIT" TRUE) +endif() if(LOVE_JIT) if(APPLE) - message(FATAL_ERROR "JIT not supported yet on Mac. Please use -DLOVE_JIT=0.") + message(WARNING "JIT not supported yet on Mac.") endif() message(STATUS "LuaJIT: Enabled") else() @@ -289,6 +298,9 @@ if (APPLE) set(LOVE_SRC_COMMON ${LOVE_SRC_COMMON} src/common/macosx.mm ) + set(LOVE_LINK_LIBRARIES ${LOVE_LINK_LIBRARIES} objc) + set(LOVE_LINK_LIBRARIES ${LOVE_LINK_LIBRARIES} "-framework CoreFoundation") + set(LOVE_LINK_LIBRARIES ${LOVE_LINK_LIBRARIES} "-framework AppKit") endif() source_group("common" FILES ${LOVE_SRC_COMMON}) @@ -1624,6 +1636,7 @@ if(APPLE) set(LOVE_SRC_3P_PHYSFS ${LOVE_SRC_3P_PHYSFS} src/libraries/physfs/physfs_platform_apple.m ) + set(LOVE_LINK_LIBRARIES ${LOVE_LINK_LIBRARIES} "-framework IOKit") endif() add_library(love_3p_physfs ${LOVE_SRC_3P_PHYSFS}) @@ -1744,6 +1757,7 @@ set(LOVE_LIB_SRC ) include_directories( + BEFORE src src/libraries src/libraries/box2D diff --git a/src/modules/audio/openal/Audio.cpp b/src/modules/audio/openal/Audio.cpp index 3f8193f2c..68645e351 100644 --- a/src/modules/audio/openal/Audio.cpp +++ b/src/modules/audio/openal/Audio.cpp @@ -100,11 +100,6 @@ Audio::Audio() , poolThread(nullptr) , distanceModel(DISTANCE_INVERSE_CLAMPED) { -#if defined(LOVE_LINUX) - // Temporarly block signals, as the thread inherits this mask - love::thread::disableSignals(); -#endif - // Before opening new device, check if recording // is requested. if (getRequestRecordingPermission()) @@ -114,29 +109,32 @@ Audio::Audio() requestRecordingPermission(); } - // Passing null for default device. - device = alcOpenDevice(nullptr); + { +#if defined(LOVE_LINUX) + // Temporarly block signals, as the thread inherits this mask + love::thread::ScopedDisableSignals disableSignals; +#endif - if (device == nullptr) - throw love::Exception("Could not open device."); + // Passing null for default device. + device = alcOpenDevice(nullptr); + + if (device == nullptr) + throw love::Exception("Could not open device."); #ifdef ALC_EXT_EFX - ALint attribs[4] = { ALC_MAX_AUXILIARY_SENDS, MAX_SOURCE_EFFECTS, 0, 0 }; + ALint attribs[4] = { ALC_MAX_AUXILIARY_SENDS, MAX_SOURCE_EFFECTS, 0, 0 }; #else - ALint *attribs = nullptr; + ALint *attribs = nullptr; #endif - context = alcCreateContext(device, attribs); + context = alcCreateContext(device, attribs); - if (context == nullptr) - throw love::Exception("Could not create context."); + if (context == nullptr) + throw love::Exception("Could not create context."); - if (!alcMakeContextCurrent(context) || alcGetError(device) != ALC_NO_ERROR) - throw love::Exception("Could not make context current."); - -#if defined(LOVE_LINUX) - love::thread::reenableSignals(); -#endif + if (!alcMakeContextCurrent(context) || alcGetError(device) != ALC_NO_ERROR) + throw love::Exception("Could not make context current."); + } #ifdef ALC_EXT_EFX initializeEFX(); diff --git a/src/modules/system/System.cpp b/src/modules/system/System.cpp index 55980b4a2..800bf5866 100644 --- a/src/modules/system/System.cpp +++ b/src/modules/system/System.cpp @@ -164,7 +164,7 @@ bool System::openURL(const std::string &url) const #endif - return (int) result > 32; + return (ptrdiff_t) result > 32; #endif } diff --git a/src/modules/thread/LuaThread.cpp b/src/modules/thread/LuaThread.cpp index 2a6cb12cc..9ae4ab0bd 100644 --- a/src/modules/thread/LuaThread.cpp +++ b/src/modules/thread/LuaThread.cpp @@ -37,6 +37,7 @@ love::Type LuaThread::type("Thread", &Threadable::type); LuaThread::LuaThread(const std::string &name, love::Data *code) : code(code) , name(name) + , haserror(false) { threadName = name; } @@ -48,6 +49,7 @@ LuaThread::~LuaThread() void LuaThread::threadFunction() { error.clear(); + haserror = false; lua_State *L = luaL_newstate(); luaL_openlibs(L); @@ -71,7 +73,10 @@ void LuaThread::threadFunction() int tracebackidx = lua_gettop(L); if (luaL_loadbuffer(L, (const char *) code->getData(), code->getSize(), name.c_str()) != 0) + { error = luax_tostring(L, -1); + haserror = true; + } else { int pushedargs = (int) args.size(); @@ -82,18 +87,27 @@ void LuaThread::threadFunction() args.clear(); if (lua_pcall(L, pushedargs, 0, tracebackidx) != 0) + { error = luax_tostring(L, -1); + haserror = true; + } } lua_close(L); - if (!error.empty()) + if (haserror) onError(); } bool LuaThread::start(const std::vector &args) { + if (isRunning()) + return false; + this->args = args; + error.clear(); + haserror = false; + return Threadable::start(); } @@ -104,9 +118,6 @@ const std::string &LuaThread::getError() const void LuaThread::onError() { - if (error.empty()) - return; - auto eventmodule = Module::getInstance(Module::M_EVENT); if (!eventmodule) return; diff --git a/src/modules/thread/LuaThread.h b/src/modules/thread/LuaThread.h index e8d625cb7..9e707b784 100644 --- a/src/modules/thread/LuaThread.h +++ b/src/modules/thread/LuaThread.h @@ -46,6 +46,7 @@ public: virtual ~LuaThread(); void threadFunction(); const std::string &getError() const; + bool hasError() const { return haserror; } bool start(const std::vector &args); @@ -56,6 +57,7 @@ private: StrongRef code; std::string name; std::string error; + bool haserror; std::vector args; diff --git a/src/modules/thread/sdl/Thread.cpp b/src/modules/thread/sdl/Thread.cpp index cfc63e31f..71f28e4ac 100644 --- a/src/modules/thread/sdl/Thread.cpp +++ b/src/modules/thread/sdl/Thread.cpp @@ -44,7 +44,7 @@ bool Thread::start() { #if defined(LOVE_LINUX) // Temporarly block signals, as the thread inherits this mask - love::thread::disableSignals(); + love::thread::ScopedDisableSignals disableSignals; #endif Lock l(mutex); @@ -55,9 +55,6 @@ bool Thread::start() thread = SDL_CreateThread(thread_runner, t->getThreadName(), this); running = (thread != nullptr); -#if defined(LOVE_LINUX) - love::thread::reenableSignals(); -#endif return running; } diff --git a/src/modules/thread/threads.h b/src/modules/thread/threads.h index 5f607bade..827ca8586 100644 --- a/src/modules/thread/threads.h +++ b/src/modules/thread/threads.h @@ -132,6 +132,12 @@ Thread *newThread(Threadable *t); #if defined(LOVE_LINUX) void disableSignals(); void reenableSignals(); + +struct ScopedDisableSignals +{ + ScopedDisableSignals() { disableSignals(); } + ~ScopedDisableSignals() { reenableSignals(); } +}; #endif } // thread diff --git a/src/modules/thread/wrap_LuaThread.cpp b/src/modules/thread/wrap_LuaThread.cpp index db29c1a65..fe15befbc 100644 --- a/src/modules/thread/wrap_LuaThread.cpp +++ b/src/modules/thread/wrap_LuaThread.cpp @@ -63,11 +63,10 @@ int w_Thread_wait(lua_State *L) int w_Thread_getError(lua_State *L) { LuaThread *t = luax_checkthread(L, 1); - std::string err = t->getError(); - if (err.empty()) - lua_pushnil(L); + if (t->hasError()) + luax_pushstring(L, t->getError()); else - luax_pushstring(L, err); + lua_pushnil(L); return 1; }