Skip to content

Commit 94249d7

Browse files
committed
Initial port
1 parent 5caa4be commit 94249d7

File tree

36 files changed

+742
-35
lines changed

36 files changed

+742
-35
lines changed

README.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
LÖVE Switch Port
2+
==================
3+
4+
<p align="center"><img src="icon.jpg"></p>
5+
6+
## Usage
7+
8+
### Running game
9+
10+
Put a LÖVE archive named `game.love` in the same folder as the NRO file of the latest release.
11+
Additionally, you can directly drop the contents of the archive in the folder, as long as it contains a `main.lua` file.
12+
13+
## Development
14+
15+
### Build dependencies
16+
17+
For building, you need the devkitA64 from devkitPro setup, along with switch portlibs and libnx.
18+
Documentation to setup that can be found [here](https://switchbrew.org/wiki/Setting_up_Development_Environment).
19+
20+
### Packaging games
21+
22+
To produce self-contained game NRO files, download the latest release, and run the following commands:
23+
24+
```
25+
# Customize $APP_* vars to your liking
26+
27+
mkdir romfs
28+
cp game.love romfs/game.love # Your game here
29+
"$DEVKITPRO/tools/bin/nacptool" --create "$APP_TITLE" "$APP_AUTHOR" "$APP_VERSION" game.nacp
30+
"$DEVKITPRO/tools/bin/elf2nro" love.elf "game.nro" --icon="$APP_ICON" --nacp="game.nacp" --romfsdir="romfs"
31+
```
32+
33+
### Compiling from source
34+
35+
Run one the following command from the project root to build:
36+
37+
```
38+
./build.sh
39+
```
40+
41+
NRO and ELF files will be located in the `dist` folder.
42+
43+
## Known limitations
44+
45+
* VI Layer creation error when changing video modes, use conf.lua to set a resolution
46+
* Message boxes do nothing more than being logged to stdout

_env.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/bin/bash
2+
3+
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
4+
BUILD_DIR="$ROOT_DIR/build"
5+
DIST_DIR="$ROOT_DIR/dist"
6+
7+
APP_NAME="love"
8+
APP_TITLE="LÖVE"
9+
APP_AUTHOR="LÖVE team; port by p-sam"
10+
APP_VERSION="$(git describe --dirty --always --tags)"
11+
APP_ICON="$ROOT_DIR/icon.jpg"

build.sh

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#!/bin/bash
2+
3+
set -eo pipefail
4+
5+
source "$( dirname "${BASH_SOURCE[0]}" )/_env.sh"
6+
7+
if [[ -z "$DEVKITPRO" ]]; then
8+
echo "DEVKITPRO env var missing" 1>&2
9+
exit 1
10+
fi
11+
12+
if [[ -z "$JOBS" ]]; then
13+
JOBS="$(nproc --all)"
14+
fi
15+
16+
echo "** native openal-soft tools **"
17+
18+
mkdir -p "$BUILD_DIR/openal-soft-tools"
19+
cd "$BUILD_DIR/openal-soft-tools"
20+
cmake -G"Unix Makefiles" "$ROOT_DIR/repo/openal-soft/native-tools"
21+
make -j$JOBS
22+
23+
echo "** env **"
24+
25+
source "$DEVKITPRO/switchvars.sh"
26+
CFLAGS="$CFLAGS -I$PORTLIBS_PREFIX/include -D__SWITCH__ -I$DEVKITPRO/libnx/include"
27+
function switch_cmake() {
28+
cmake -G"Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE="$DEVKITPRO/switch.cmake" \
29+
-DNX=1 \
30+
-DCMAKE_BUILD_TYPE=Release \
31+
-DCMAKE_C_FLAGS="$CFLAGS $CPPFLAGS" \
32+
-DCMAKE_CXX_FLAGS="$CFLAGS" \
33+
-DCMAKE_AR="$DEVKITPRO/devkitA64/bin/aarch64-none-elf-gcc-ar" \
34+
"$@"
35+
}
36+
37+
echo "** lua **"
38+
39+
mkdir -p "$BUILD_DIR/lua"
40+
cp -auf "$ROOT_DIR/repo/lua/." "$BUILD_DIR/lua"
41+
cd "$BUILD_DIR/lua"
42+
make -C "$BUILD_DIR/lua" -f "$BUILD_DIR/lua/makefile" -j$JOBS liblua.a
43+
44+
echo "** openal-soft **"
45+
46+
mkdir -p "$BUILD_DIR/openal-soft"
47+
cd "$BUILD_DIR/openal-soft"
48+
switch_cmake "$ROOT_DIR/repo/openal-soft" \
49+
-DSIZEOF_LONG=8 \
50+
-DLIBTYPE=STATIC \
51+
-DALSOFT_NATIVE_TOOLS_PATH="$BUILD_DIR/openal-soft-tools" \
52+
-DALSOFT_DLOPEN:BOOL=OFF \
53+
-DALSOFT_UTILS:BOOL=OFF \
54+
-DALSOFT_EXAMPLES:BOOL=OFF \
55+
-DALSOFT_TESTS:BOOL=OFF \
56+
-DALSOFT_REQUIRE_NEON:BOOL=ON \
57+
-DALSOFT_REQUIRE_SDL2:BOOL=ON \
58+
-DALSOFT_BACKEND_WAVE:BOOL=OFF \
59+
-DALSOFT_BACKEND_SDL2:BOOL=ON
60+
make #-j$JOBS
61+
62+
echo "** physfs **"
63+
64+
mkdir -p "$BUILD_DIR/physfs"
65+
cd "$BUILD_DIR/physfs"
66+
switch_cmake \
67+
-DPHYSFS_BUILD_SHARED=OFF -DPHYSFS_BUILD_TEST=OFF \
68+
"$ROOT_DIR/repo/physfs"
69+
make -j$JOBS
70+
CFLAGS="$CFLAGS -I$ROOT_DIR/repo/physfs/src"
71+
72+
echo "** LÖVE **"
73+
74+
mkdir -p "$BUILD_DIR/love"
75+
cd "$BUILD_DIR/love"
76+
switch_cmake \
77+
-DLOVE_JIT:BOOL=OFF \
78+
-DPHYSFS_LIBRARY="$BUILD_DIR/physfs/libphysfs.a" \
79+
-DOPENAL_LIBRARY="$BUILD_DIR/openal-soft/libopenal.a" \
80+
-DOPENAL_INCLUDE_DIR="$ROOT_DIR/repo/openal-soft/include" \
81+
-DLUA_LIBRARY="$BUILD_DIR/lua/liblua.a" \
82+
-DLUA_INCLUDE_DIR="$ROOT_DIR/repo/lua" \
83+
"$ROOT_DIR/repo/love"
84+
85+
make -j$JOBS
86+
87+
echo "** NRO **"
88+
89+
mkdir -p "$DIST_DIR"
90+
91+
cp -vf "$BUILD_DIR/love/love" "$DIST_DIR/$APP_NAME.elf"
92+
"$DEVKITPRO/tools/bin/nacptool" --create "$APP_TITLE" "$APP_AUTHOR" "$APP_VERSION" "$DIST_DIR/$APP_NAME.nacp"
93+
"$DEVKITPRO/tools/bin/elf2nro" "$DIST_DIR/$APP_NAME.elf" "$DIST_DIR/$APP_NAME.nro" --icon="$APP_ICON" --nacp="$DIST_DIR/$APP_NAME.nacp"
94+
echo "Built $DIST_DIR/$APP_NAME.nro"

icon.jpg

9.1 KB
Loading

repo/love/CMakeLists.txt

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ if(MSVC)
4040
set(LOVE_CONSOLE_EXE_NAME lovec)
4141
endif()
4242

43-
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
43+
if(CMAKE_SIZEOF_VOID_P EQUAL 8 OR SWITCH_LIBNX)
4444
set(LOVE_X64 TRUE)
4545
set(LOVE_TARGET_PLATFORM x64)
4646
else()
@@ -174,7 +174,11 @@ Please see http://bitbucket.org/rude/megasource
174174
find_package(Freetype REQUIRED)
175175
find_package(ModPlug REQUIRED)
176176
find_package(OpenAL REQUIRED)
177+
if(SWITCH_LIBNX)
178+
set(OPENGL_gl_LIBRARY "")
179+
else()
177180
find_package(OpenGL REQUIRED)
181+
endif()
178182
find_package(SDL2 REQUIRED)
179183
find_package(Theora REQUIRED)
180184
find_package(Vorbis REQUIRED)
@@ -319,6 +323,12 @@ if (APPLE)
319323
)
320324
endif()
321325

326+
if (SWITCH_LIBNX)
327+
set(LOVE_SRC_COMMON ${LOVE_SRC_COMMON}
328+
src/common/nx.cpp
329+
)
330+
endif()
331+
322332
source_group("common" FILES ${LOVE_SRC_COMMON})
323333

324334
#
@@ -1504,6 +1514,12 @@ if(MSVC)
15041514
${LOVE_LINK_L3P_LUASOCKET_LIBLUASOCKET}
15051515
ws2_32.lib
15061516
)
1517+
elseif(SWITCH_LIBNX)
1518+
set(LOVE_SRC_3P_LUASOCKET_LIBLUASOCKET
1519+
${LOVE_SRC_3P_LUASOCKET_LIBLUASOCKET}
1520+
src/libraries/luasocket/libluasocket/usocket.c
1521+
src/libraries/luasocket/libluasocket/usocket.h
1522+
)
15071523
else()
15081524
set(LOVE_SRC_3P_LUASOCKET_LIBLUASOCKET
15091525
${LOVE_SRC_3P_LUASOCKET_LIBLUASOCKET}
@@ -1610,7 +1626,9 @@ if(APPLE)
16101626
)
16111627
endif()
16121628

1613-
add_library(love_3p_physfs ${LOVE_SRC_3P_PHYSFS})
1629+
if(NOT SWITCH_LIBNX)
1630+
add_library(love_3p_physfs ${LOVE_SRC_3P_PHYSFS})
1631+
endif()
16141632

16151633
#
16161634
# stb_image
@@ -1691,11 +1709,20 @@ set(LOVE_3P
16911709
love_3p_lua53
16921710
love_3p_lz4
16931711
love_3p_noise1234
1694-
love_3p_physfs
16951712
love_3p_wuff
16961713
love_3p_xxhash
16971714
)
16981715

1716+
if(SWITCH_LIBNX)
1717+
if(DEFINED PHYSFS_LIBRARY)
1718+
set(LOVE_3P ${LOVE_3P} ${PHYSFS_LIBRARY})
1719+
else()
1720+
message(FATAL_ERROR "Missing PHYSFS_LIBRARY")
1721+
endif()
1722+
else()
1723+
set(LOVE_3P ${LOVE_3P} love_3p_physfs)
1724+
endif()
1725+
16991726
love_disable_warnings(love_3p_box2d love_3p_enet love_3p_luasocket love_3p_physfs)
17001727

17011728
#
@@ -1749,7 +1776,12 @@ if(MSVC)
17491776
)
17501777
endif()
17511778

1752-
add_library(${LOVE_LIB_NAME} SHARED ${LOVE_LIB_SRC} ${LOVE_RC})
1779+
if(SWITCH_LIBNX)
1780+
add_library(${LOVE_LIB_NAME} STATIC ${LOVE_LIB_SRC} ${LOVE_RC})
1781+
set(LOVE_3P ${LOVE_3P} vorbis vorbisidec ogg bz2 png16 EGL glapi drm_nouveau nx)
1782+
else()
1783+
add_library(${LOVE_LIB_NAME} SHARED ${LOVE_LIB_SRC} ${LOVE_RC})
1784+
endif()
17531785
target_link_libraries(${LOVE_LIB_NAME} ${LOVE_LINK_LIBRARIES} ${LOVE_3P})
17541786

17551787
if(LOVE_EXTRA_DEPENDECIES)

repo/love/src/common/config.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,15 @@
4848
# define LOVE_MACOSX 1
4949
# endif
5050
#endif
51-
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
51+
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__SWITCH__)
5252
// I know it's not linux, but it seems most "linux-only" code is bsd-compatible
5353
# define LOVE_LINUX 1
5454
#endif
5555

56+
#if defined(__SWITCH__)
57+
# define LOVE_NX 1
58+
#endif
59+
5660
// Endianness.
5761
#if defined(__ppc__) || defined(__ppc) || defined(__powerpc__) || defined(__powerpc)
5862
# define LOVE_BIG_ENDIAN 1
@@ -117,7 +121,7 @@
117121
# define NOMINMAX
118122
#endif
119123

120-
#if defined(LOVE_MACOSX) || defined(LOVE_IOS)
124+
#if defined(LOVE_MACOSX) || defined(LOVE_IOS) || defined(LOVE_NX)
121125
# define LOVE_LEGENDARY_APP_ARGV_HACK
122126
#endif
123127

repo/love/src/common/memory.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ bool alignedMalloc(void **mem, size_t size, size_t alignment)
3737
#ifdef LOVE_WINDOWS
3838
*mem = _aligned_malloc(size, alignment);
3939
return *mem != nullptr;
40+
#elif defined(LOVE_NX)
41+
*mem = aligned_alloc(size, alignment);
42+
return *mem != nullptr;
4043
#else
4144
return posix_memalign(mem, alignment, size) == 0;
4245
#endif
@@ -53,7 +56,7 @@ void alignedFree(void *mem)
5356

5457
size_t getPageSize()
5558
{
56-
#ifdef LOVE_WINDOWS
59+
#if defined(LOVE_NX) || defined(LOVE_WINDOWS)
5760
// TODO: Do an actual query.
5861
return 4096;
5962
#else

0 commit comments

Comments
 (0)