Windows: Package script

This commit is contained in:
Vicki Pfau 2018-01-25 18:46:10 -08:00
parent 8aaa610502
commit d133cabd33
6 changed files with 60 additions and 9 deletions

View File

@ -43,6 +43,10 @@ set(BUILD_GL ON CACHE STRING "Build with OpenGL")
set(BUILD_GLES2 OFF CACHE STRING "Build with OpenGL|ES 2")
set(USE_EPOXY ON CACHE STRING "Build with libepoxy")
set(DISABLE_DEPS OFF CACHE BOOL "Build without dependencies")
if(WIN32)
set(WIN32_UNIX_PATHS OFF CACHE BOOL "Use Unix-like paths")
mark_as_advanced(WIN32_UNIX_PATHS)
endif()
file(GLOB ARM_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/arm/*.c)
file(GLOB ARM_TEST_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/arm/test/*.c)
file(GLOB LR35902_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/lr35902/*.c)
@ -80,7 +84,15 @@ if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type (e.g. Release or Debug)" FORCE)
endif()
include(GNUInstallDirs)
if(NOT WIN32 OR WIN32_UNIX_PATHS)
include(GNUInstallDirs)
else()
set(CMAKE_INSTALL_LIBDIR ".")
set(CMAKE_INSTALL_BINDIR ".")
set(CMAKE_INSTALL_DATADIR ".")
set(CMAKE_INSTALL_DOCDIR ".")
set(CMAKE_INSTALL_INCLUDEDIR "include")
endif()
set(LIBDIR "${CMAKE_INSTALL_LIBDIR}" CACHE PATH "Installed library directory")
mark_as_advanced(LIBDIR)

View File

@ -110,11 +110,11 @@ To build on Windows for development, using MSYS2 is recommended. Follow the inst
For x86 (32 bit) builds:
pacman -Sy mingw-w64-i686-{cmake,ffmpeg,gcc,gdb,imagemagick,libzip,pkg-config,qt5,SDL2}
pacman -Sy mingw-w64-i686-{cmake,ffmpeg,gcc,gdb,imagemagick,libzip,pkg-config,qt5,SDL2,ntdll-git}
For x86_64 (64 bit) builds:
pacman -Sy mingw-w64-x86_64-{cmake,ffmpeg,gcc,gdb,imagemagick,libzip,pkg-config,qt5,SDL2}
pacman -Sy mingw-w64-x86_64-{cmake,ffmpeg,gcc,gdb,imagemagick,libzip,pkg-config,qt5,SDL2,ntdll-git}
Check out the source code by running this command:
@ -128,7 +128,7 @@ Then finally build it by running these commands:
cmake .. -G "MSYS Makefiles"
make
Please note that this build of mGBA for Windows is not suitable for distribution, due to the scattering of DLLs it needs to run, but is perfect for development. However, if distributing such a build is desired (e.g. for testing on machines that don't have the MSYS2 environment installed), a tool called "[Dependency Walker](http://dependencywalker.com)" can be used to see which additional DLL files need to be shipped with the mGBA executable.
Please note that this build of mGBA for Windows is not suitable for distribution, due to the scattering of DLLs it needs to run, but is perfect for development. However, if distributing such a build is desired (e.g. for testing on machines that don't have the MSYS2 environment installed), running `cpack -G ZIP` will prepare a zip file with all of the necessary DLLs.
### Dependencies

View File

@ -222,6 +222,8 @@ endif()
if(NOT DEFINED DATADIR)
if(APPLE)
set(DATADIR Applications/${PROJECT_NAME}.app/Contents/Resources)
elseif(WIN32 AND NOT WIN32_UNIX_PATHS)
set(DATADIR ".")
else()
set(DATADIR ${CMAKE_INSTALL_DATADIR}/${BINARY_NAME})
endif()
@ -319,8 +321,13 @@ if(APPLE)
endif()
install(CODE "execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/tools/deploy-mac.py\" -v ${DEPLOY_OPTIONS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Applications/${PROJECT_NAME}.app\")")
endif()
endif()
if(WIN32 AND CMAKE_MAJOR_VERSION GREATER 2 AND CMAKE_MINOR_VERSION GREATER 7)
# Work around CMake issue #16907
set_target_properties(${BINARY_NAME}-qt PROPERTIES AUTORCC ON SKIP_AUTORCC ON)
elseif(WIN32)
if(CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION EQUAL 8)
# Work around CMake issue #16907
set_target_properties(${BINARY_NAME}-qt PROPERTIES AUTORCC ON SKIP_AUTORCC ON)
endif()
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
find_program(BASH bash)
install(CODE "execute_process(COMMAND \"${BASH}\" \"${CMAKE_SOURCE_DIR}/tools/deploy-win.sh\" \"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.exe\" \"\${CMAKE_INSTALL_PREFIX}\" \"\$ENV{PWD}\" WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\")" COMPONENT ${BINARY_NAME}-qt)
endif()
endif()

View File

@ -95,7 +95,9 @@ endif()
add_executable(${BINARY_NAME}-sdl WIN32 ${PLATFORM_SRC} ${MAIN_SRC})
set_target_properties(${BINARY_NAME}-sdl PROPERTIES COMPILE_DEFINITIONS "${FEATURE_DEFINES};${FUNCTION_DEFINES}")
target_link_libraries(${BINARY_NAME}-sdl ${BINARY_NAME} ${PLATFORM_LIBRARY} ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
set_target_properties(${BINARY_NAME}-sdl PROPERTIES OUTPUT_NAME ${BINARY_NAME})
if(NOT WIN32)
set_target_properties(${BINARY_NAME}-sdl PROPERTIES OUTPUT_NAME ${BINARY_NAME})
endif()
install(TARGETS ${BINARY_NAME}-sdl DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-sdl)
if(UNIX)
install(FILES ${CMAKE_SOURCE_DIR}/doc/mgba.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-sdl)

27
tools/deploy-win.sh Normal file
View File

@ -0,0 +1,27 @@
#!/bin/bash
BINARY=$1
INSTALLPATH="$2"
WORKDIR="$3"
if [ -z "$DESTDIR" ]; then
OUTDIR="$INSTALLPATH"
else
if [ -n $(echo ${INSTALLPATH} | grep "^[A-Z]:") ]; then
INSTALLPATH="${INSTALLPATH:3}"
fi
OUTDIR="$WORKDIR/$DESTDIR/$INSTALLPATH"
fi
IFS=$'\n'
if [ -n $(which ntldd 2>&1 | grep /ntldd) ]; then
DLLS=$(ntldd -R "$BINARY" | grep -i mingw | cut -d">" -f2 | sed -e 's/(0x[0-9a-f]\+)//' -e 's/^ \+//' -e 's/ \+$//' -e 's,\\,/,g')
elif [ -n $(which gdb 2>&1 | grep /gdb) ]; then
DLLS=$(gdb "$BINARY" --command=$(dirname $0)/dlls.gdb | grep -i mingw | cut -d" " -f7- | sed -e 's/^ \+//' -e 's/ \+$//' -e 's,\\,/,g')
else
echo "Please install gdb or ntldd for deploying DLLs"
fi
cp -vu $DLLS "$OUTDIR"
if [ -n $(which windeployqt 2>&1 | grep /windeployqt) ]; then
windeployqt --no-opengl-sw --no-svg --release --dir "$OUTDIR" "$BINARY"
fi

3
tools/dlls.gdb Normal file
View File

@ -0,0 +1,3 @@
start
info sharedlibrary
q