diff --git a/AppImage.cmake b/AppImage.cmake new file mode 100644 index 00000000..9986e037 --- /dev/null +++ b/AppImage.cmake @@ -0,0 +1,62 @@ +find_program(APPIMAGETOOL_PATH appimagetool OPTIONAL) + +if (NOT APPIMAGETOOL_PATH) + function(generate_appimage TARGET DESKTOP ICON) + message("appimagetool was not found. Skipping AppImage generation") + endfunction() +else() + function(generate_appimage TARGET NAME DESKTOP ICON) + cmake_path(GET ICON FILENAME ICON_FILENAME) + cmake_path(GET DESKTOP FILENAME DESKTOP_FILENAME) + cmake_path(GET ICON STEM ICON_FILENAME_NOEXT) + + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/appdir/usr/bin/${NAME} + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/appdir/usr/bin + COMMAND ${CMAKE_COMMAND} -E copy $ ${CMAKE_CURRENT_BINARY_DIR}/appdir/usr/bin/${NAME} + DEPENDS ${TARGET}) + + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/appdir/usr/share/icons/hicolor/256x256/apps/${ICON_FILENAME} + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/appdir/usr/share/icons/hicolor/256x256 + COMMAND ${CMAKE_COMMAND} -E copy ${ICON} ${CMAKE_CURRENT_BINARY_DIR}/appdir/usr/share/icons/hicolor/256x256/apps/${ICON_FILENAME} + DEPENDS ${ICON}) + + configure_file(${DESKTOP} ${CMAKE_CURRENT_BINARY_DIR}/appdir/usr/share/applications/${DESKTOP_FILENAME}) + + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/appdir/.DirIcon + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/appdir + COMMAND ${CMAKE_COMMAND} -E copy usr/share/icons/hicolor/256x256/apps/${ICON_FILENAME} .DirIcon + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/appdir + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/appdir/usr/share/icons/hicolor/256x256/apps/${ICON_FILENAME}) + + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/appdir/AppRun + COMMAND ${CMAKE_COMMAND} -E create_symlink usr/bin/${NAME} AppRun + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/appdir + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/appdir/usr/bin/${NAME}) + + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/appdir/${ICON_FILENAME} + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/appdir + COMMAND ${CMAKE_COMMAND} -E copy usr/share/icons/hicolor/256x256/apps/${ICON_FILENAME} ${ICON_FILENAME} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/appdir + DEPENDS ${ICON}) + + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/appdir/${DESKTOP_FILENAME} + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/appdir + COMMAND ${CMAKE_COMMAND} -E create_symlink usr/share/applications/${DESKTOP_FILENAME} ${DESKTOP_FILENAME} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/appdir + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/appdir/usr/share/applications/${DESKTOP_FILENAME}) + + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.AppImage + COMMAND ${APPIMAGETOOL_PATH} ${CMAKE_CURRENT_BINARY_DIR}/appdir ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.AppImage + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/appdir/usr/bin/${NAME} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/appdir/usr/share/icons/hicolor/256x256/apps/${ICON_FILENAME} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/appdir/usr/share/applications/${DESKTOP_FILENAME} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/appdir/.DirIcon + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/appdir/AppRun + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/appdir/${ICON_FILENAME} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/appdir/${DESKTOP_FILENAME} + ) + + add_custom_target(${TARGET}_AppImage + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.AppImage) + endfunction() +endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index 67e666ef..0c46a71d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,8 @@ elseif (UNIX) find_package(OpenSSL REQUIRED) target_link_libraries(${PROJECT_NAME} PRIVATE ZLIB::ZLIB OpenSSL::SSL OpenSSL::Crypto CURL::libcurl) + include(AppImage.cmake) + generate_appimage(${PROJECT_NAME} "beammp-launcher" ${CMAKE_CURRENT_SOURCE_DIR}/beammp-launcher.desktop ${CMAKE_CURRENT_SOURCE_DIR}/beammp.png) else(WIN32) #MINGW add_definitions("-D_WIN32_WINNT=0x0600") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Os -s --static") diff --git a/beammp-launcher.desktop b/beammp-launcher.desktop new file mode 100644 index 00000000..9c6c0788 --- /dev/null +++ b/beammp-launcher.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=BeamMP Launcher +Icon=@ICON_FILENAME_NOEXT@ +TryExec=@NAME@ +Exec=@NAME@ +Categories=Game +Terminal=true diff --git a/beammp.png b/beammp.png new file mode 100644 index 00000000..b0efa927 Binary files /dev/null and b/beammp.png differ diff --git a/src/Startup.cpp b/src/Startup.cpp index abc3a8fa..414e3627 100644 --- a/src/Startup.cpp +++ b/src/Startup.cpp @@ -183,6 +183,10 @@ void CheckName() { std::wstring DN = GetEN(), CDir = Utils::ToWString(options.executable_name), FN = CDir.substr(CDir.find_last_of('\\') + 1); #elif defined(__linux__) std::string DN = GetEN(), CDir = options.executable_name, FN = CDir.substr(CDir.find_last_of('/') + 1); + if (DN.find_last_of(".AppImage") != std::string::npos) { + warn("Looks like launcher is an AppImage. Skipping name check"); + return; + } #endif if (FN != DN) { if (fs::exists(DN))