Mac build improvements

Move closer to allowing an "out of the box" distributable build for Mac:

* fix the icon for the .app

* link SDL2 statically, a PR has been sent to the original repo here:
  https://github.com/tcbrindle/sdl2-cmake-scripts/pull/9

* link SFML statically

TODO:

For a releasable build on OS X, system libs must be linked
dynamically while third party libs are linked statically or bundled. The
goal is to link them statically.

The two remaining libs that need static linking are PNG and wX.

For PNG a similar approach to the one used for SDL2 using pkg-config
should work fine and be simple to implement.

For wX things are more complicated. The default build of wX does not
include static libs, I will need to submit a PR for Homebrew to change
the default build to include both dynamic and static versions.
This commit is contained in:
Rafael Kitover 2016-10-26 16:58:21 -07:00
parent 6899b97dbc
commit 2d9ec99c11
4 changed files with 97 additions and 26 deletions

2
.gitignore vendored
View File

@ -6,3 +6,5 @@ src/wx/cmdtab.cpp
src/wx/wxvbam.xrs src/wx/wxvbam.xrs
build/ build/
# vim swap files
*.sw?

View File

@ -65,13 +65,6 @@ ELSE()
ADD_DEFINITIONS(-DNDEBUG) ADD_DEFINITIONS(-DNDEBUG)
ENDIF() ENDIF()
# Fill in SDLMAIN_LIBRARY on OS X manually to avoid using SDLMain.m
# OS X users will have to compile and install SDL from source.
if( APPLE AND ENABLE_SDL )
ADD_DEFINITIONS (-DwxMAC_USE_CORE_GRAPHICS )
SET(SDL2MAIN_LIBRARY "-lSDL2main")
endif( APPLE AND ENABLE_SDL )
# Add support for Homebrew, MacPorts and Fink on OS X # Add support for Homebrew, MacPorts and Fink on OS X
# as well as for ObjectiveC code # as well as for ObjectiveC code
IF(APPLE) IF(APPLE)
@ -107,7 +100,7 @@ IF(APPLE)
# and compile as Objective-C++ for ObjectiveC #ifdefs # and compile as Objective-C++ for ObjectiveC #ifdefs
SET(CMAKE_CXX_COMPILE_OBJECT "<CMAKE_CXX_COMPILER> -x objective-c++ <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>") SET(CMAKE_CXX_COMPILE_OBJECT "<CMAKE_CXX_COMPILER> -x objective-c++ <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
ENDIF() ENDIF(APPLE)
# We do not support amd64 asm yet # We do not support amd64 asm yet
IF((ENABLE_ASM_CORE OR ENABLE_ASM_SCALERS OR ENABLE_MMX) IF((ENABLE_ASM_CORE OR ENABLE_ASM_SCALERS OR ENABLE_MMX)
@ -130,16 +123,25 @@ endif( ENABLE_ASM_SCALERS )
# Look for some dependencies using CMake scripts # Look for some dependencies using CMake scripts
FIND_PACKAGE(ZLIB REQUIRED) FIND_PACKAGE(ZLIB REQUIRED)
FIND_PACKAGE ( PNG REQUIRED )
FIND_PACKAGE(OpenGL REQUIRED) FIND_PACKAGE(OpenGL REQUIRED)
# TODO: make static on mac
FIND_PACKAGE(PNG REQUIRED)
IF(APPLE)
SET(SDL2_STATIC ON)
ENDIF(APPLE)
FIND_PACKAGE(SDL2 REQUIRED) FIND_PACKAGE(SDL2 REQUIRED)
ADD_DEFINITIONS(${SDL2_DEFINITIONS})
if( ENABLE_LINK ) if( ENABLE_LINK )
if( WIN32 ) if(WIN32 OR APPLE)
set(SFML_STATIC_LIBRARIES TRUE) set(SFML_STATIC_LIBRARIES TRUE)
endif( WIN32 ) endif(WIN32 OR APPLE)
FIND_PACKAGE ( SFML 2 COMPONENTS network system ) FIND_PACKAGE ( SFML 2 COMPONENTS network system )
endif( ENABLE_LINK ) endif( ENABLE_LINK )
# set the standard libraries all ports use # set the standard libraries all ports use
SET(VBAMCORE_LIBS SET(VBAMCORE_LIBS
vbamcore vbamcore

View File

@ -1,9 +1,22 @@
# This module defines # This module defines
# SDL2_LIBRARY, the name of the library to link against # SDL2_LIBRARY, the name of the library to link against
# SDL2_FOUND, if false, do not try to link to SDL2 # SDL2_FOUND, if false, do not try to link to SDL2
# SDL2_INCLUDE_DIR, where to find SDL.h # SDL2_INCLUDE_DIR, where to find SDL.h
# #
# If you have pkg-config, these extra variables are also defined:
# SDL2_DEFINITIONS, extra CFLAGS
# SDL2_EXTRA_LIBS, extra link libs
# SDL2_LINKER_FLAGS, extra link flags
#
# The latter two are automatically added to SDL2_LIBRARY
#
# To use them, add code such as:
#
# # SET(SDL2_STATIC ON) # if you want to link SDL2 statically
# FIND_PACKAGE(SDL2 REQUIRED)
# ADD_DEFINITIONS(${SDL2_DEFINITIONS})
# TARGET_LINK_LIBRARIES(your-executable-target ${SDL2_LIBRARY} ...)
#
# This module responds to the the flag: # This module responds to the the flag:
# SDL2_BUILDING_LIBRARY # SDL2_BUILDING_LIBRARY
# If this is defined, then no SDL2main will be linked in because # If this is defined, then no SDL2main will be linked in because
@ -12,6 +25,8 @@
# module will attempt to locate and set the the proper link flags # module will attempt to locate and set the the proper link flags
# as part of the returned SDL2_LIBRARY variable. # as part of the returned SDL2_LIBRARY variable.
# #
# If you want to link SDL2 statically, set SDL2_STATIC to ON.
#
# Don't forget to include SDLmain.h and SDLmain.m your project for the # Don't forget to include SDLmain.h and SDLmain.m your project for the
# OS X framework based version. (Other versions link to -lSDL2main which # OS X framework based version. (Other versions link to -lSDL2main which
# this module will try to find on your behalf.) Also for OS X, this # this module will try to find on your behalf.) Also for OS X, this
@ -47,7 +62,7 @@
# SDL2_LIBRARY to override this selection or set the CMake environment # SDL2_LIBRARY to override this selection or set the CMake environment
# CMAKE_INCLUDE_PATH to modify the search paths. # CMAKE_INCLUDE_PATH to modify the search paths.
# #
# Note that the header path has changed from SDL2/SDL.h to just SDL.h # Note that the header path has changed from SDL3/SDL.h to just SDL.h
# This needed to change because "proper" SDL convention # This needed to change because "proper" SDL convention
# is #include "SDL.h", not <SDL2/SDL.h>. This is done for portability # is #include "SDL.h", not <SDL2/SDL.h>. This is done for portability
# reasons because not all systems place things in SDL2/ (see FreeBSD). # reasons because not all systems place things in SDL2/ (see FreeBSD).
@ -86,11 +101,21 @@ FIND_PATH(SDL2_INCLUDE_DIR SDL.h
PATHS ${SDL2_SEARCH_PATHS} PATHS ${SDL2_SEARCH_PATHS}
) )
SET(CURRENT_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
IF(SDL2_STATIC)
IF(WIN32)
SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a)
ELSE(WIN32)
SET(CMAKE_FIND_LIBRARY_SUFFIXES .a)
ENDIF(WIN32)
ENDIF(SDL2_STATIC)
FIND_LIBRARY(SDL2_LIBRARY_TEMP FIND_LIBRARY(SDL2_LIBRARY_TEMP
NAMES SDL2 NAMES SDL2
HINTS HINTS
$ENV{SDL2DIR} $ENV{SDL2DIR}
PATH_SUFFIXES lib64 lib PATH_SUFFIXES lib64 lib lib/x64 lib/x86
PATHS ${SDL2_SEARCH_PATHS} PATHS ${SDL2_SEARCH_PATHS}
) )
@ -104,12 +129,15 @@ IF(NOT SDL2_BUILDING_LIBRARY)
NAMES SDL2main NAMES SDL2main
HINTS HINTS
$ENV{SDL2DIR} $ENV{SDL2DIR}
PATH_SUFFIXES lib64 lib PATH_SUFFIXES lib64 lib lib/x64 lib/x86
PATHS ${SDL2_SEARCH_PATHS} PATHS ${SDL2_SEARCH_PATHS}
) )
ENDIF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework") ENDIF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
ENDIF(NOT SDL2_BUILDING_LIBRARY) ENDIF(NOT SDL2_BUILDING_LIBRARY)
SET(CMAKE_FIND_LIBRARY_SUFFIXES ${CURRENT_FIND_LIBRARY_SUFFIXES})
UNSET(CURRENT_FIND_LIBRARY_SUFFIXES)
# SDL2 may require threads on your system. # SDL2 may require threads on your system.
# The Apple build may not need an explicit flag because one of the # The Apple build may not need an explicit flag because one of the
# frameworks may already provide it. # frameworks may already provide it.
@ -118,11 +146,10 @@ IF(NOT APPLE)
FIND_PACKAGE(Threads) FIND_PACKAGE(Threads)
ENDIF(NOT APPLE) ENDIF(NOT APPLE)
# MinGW needs an additional library, mwindows # MinGW needs an additional link flag, -mwindows
# It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -lmwindows # It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -mwindows
# (Actually on second look, I think it only needs one of the m* libraries.)
IF(MINGW) IF(MINGW)
SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW") SET(MINGW32_LIBRARY mingw32 "-mwindows" CACHE STRING "mwindows for MinGW")
ENDIF(MINGW) ENDIF(MINGW)
IF(SDL2_LIBRARY_TEMP) IF(SDL2_LIBRARY_TEMP)
@ -155,6 +182,37 @@ IF(SDL2_LIBRARY_TEMP)
SET(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP}) SET(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP})
ENDIF(MINGW) ENDIF(MINGW)
# Add some stuff from pkg-config, if available
IF(NOT PKG_CONFIG_EXECUTABLE)
FIND_PACKAGE(PkgConfig QUIET)
ENDIF(NOT PKG_CONFIG_EXECUTABLE)
IF(PKG_CONFIG_EXECUTABLE)
# get any definitions
EXECUTE_PROCESS(COMMAND ${PKG_CONFIG_EXECUTABLE} --cflags-only-other sdl2 OUTPUT_VARIABLE SDL2_DEFINITIONS)
SET(SDL2_DEFINITIONS ${SDL2_DEFINITIONS} CACHE STRING "Extra CFLAGS for SDL2 from pkg-config")
# get any extra stuff needed for linking
IF(NOT SDL2_STATIC)
EXECUTE_PROCESS(COMMAND ${PKG_CONFIG_EXECUTABLE} --libs-only-other sdl2 OUTPUT_VARIABLE SDL2_LINKER_FLAGS_RAW OUTPUT_STRIP_TRAILING_WHITESPACE)
EXECUTE_PROCESS(COMMAND ${PKG_CONFIG_EXECUTABLE} --libs-only-l sdl2 OUTPUT_VARIABLE SDL2_EXTRA_LIBS_RAW OUTPUT_STRIP_TRAILING_WHITESPACE)
ELSE(NOT SDL2_STATIC)
EXECUTE_PROCESS(COMMAND ${PKG_CONFIG_EXECUTABLE} --static --libs-only-other sdl2 OUTPUT_VARIABLE SDL2_LINKER_FLAGS_RAW OUTPUT_STRIP_TRAILING_WHITESPACE)
EXECUTE_PROCESS(COMMAND ${PKG_CONFIG_EXECUTABLE} --static --libs-only-l sdl2 OUTPUT_VARIABLE SDL2_EXTRA_LIBS_RAW OUTPUT_STRIP_TRAILING_WHITESPACE)
ENDIF(NOT SDL2_STATIC)
STRING(REGEX REPLACE "[^ ]+SDL2[^ ]*" "" SDL2_EXTRA_LIBS_RAW2 "${SDL2_EXTRA_LIBS_RAW}")
STRING(REGEX REPLACE " +" ";" SDL2_EXTRA_LIBS "${SDL2_EXTRA_LIBS_RAW2}")
STRING(REGEX REPLACE " +" ";" SDL2_LINKER_FLAGS "${SDL2_LINKER_FLAGS_RAW}")
SET(SDL2_LINKER_FLAGS ${SDL2_LINKER_FLAGS} CACHE STRING "Linker flags for linking SDL2")
SET(SDL2_EXTRA_LIBS ${SDL2_EXTRA_LIBS} CACHE STRING "Extra libraries for linking SDL2")
SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${SDL2_EXTRA_LIBS} ${SDL2_LINKER_FLAGS})
ENDIF(PKG_CONFIG_EXECUTABLE)
# Set the final string here so the GUI reflects the final state. # Set the final string here so the GUI reflects the final state.
SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL2 Library can be found") SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL2 Library can be found")
# Set the temp variable to INTERNAL so it is not seen in the CMake GUI # Set the temp variable to INTERNAL so it is not seen in the CMake GUI
@ -166,4 +224,3 @@ message("</FindSDL2.cmake>")
INCLUDE(FindPackageHandleStandardArgs) INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR) FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR)

View File

@ -10,6 +10,10 @@ if( WIN32 )
endif( WIN32 ) endif( WIN32 )
option( ENABLE_OPENAL "Enable OpenAL for the wxWidgets port" ON ) option( ENABLE_OPENAL "Enable OpenAL for the wxWidgets port" ON )
IF(APPLE)
ADD_DEFINITIONS(-DwxMAC_USE_CORE_GRAPHICS)
ENDIF(APPLE)
if( NOT ENABLE_CAIRO ) if( NOT ENABLE_CAIRO )
ADD_DEFINITIONS (-DNO_CAIRO) ADD_DEFINITIONS (-DNO_CAIRO)
endif( NOT ENABLE_CAIRO ) endif( NOT ENABLE_CAIRO )
@ -38,6 +42,10 @@ IF(CMAKE_BUILD_TYPE STREQUAL "Debug")
ENDIF() ENDIF()
ENDIF() ENDIF()
IF(APPLE)
SET(wxWidgets_USE_STATIC ON)
ENDIF(APPLE)
SET(wxWidgets_USE_UNICODE ON) SET(wxWidgets_USE_UNICODE ON)
# adv is for wxAboutBox # adv is for wxAboutBox
# xml, html is for xrc # xml, html is for xrc
@ -189,7 +197,9 @@ ENDIF( WIN32 )
link_directories( ${CMAKE_BINARY_DIR} ) link_directories( ${CMAKE_BINARY_DIR} )
SET(VBAM_ICON ${CMAKE_CURRENT_SOURCE_DIR}/icons/vbam.icns) SET(VBAM_ICON vbam.icns)
SET(VBAM_ICON_PATH ${CMAKE_CURRENT_SOURCE_DIR}/icons/${VBAM_ICON})
ADD_EXECUTABLE ( ADD_EXECUTABLE (
visualboyadvance-m visualboyadvance-m
@ -198,7 +208,7 @@ ADD_EXECUTABLE (
${SRC_WX} ${SRC_WX}
${HDR_WX} ${HDR_WX}
${RES_WX} ${RES_WX}
${VBAM_ICON} ${VBAM_ICON_PATH}
${CM_STUFF} ${CM_STUFF}
) )
@ -221,7 +231,7 @@ if(APPLE)
# this should set ROM file types correctly # this should set ROM file types correctly
SET_PROPERTY(TARGET visualboyadvance-m APPEND PROPERTY MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/wxplist.in) SET_PROPERTY(TARGET visualboyadvance-m APPEND PROPERTY MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/wxplist.in)
SET(MACOSX_BUNDLE_ICON_FILE ${VBAM_ICON}) SET(MACOSX_BUNDLE_ICON_FILE ${VBAM_ICON})
SET_SOURCE_FILES_PROPERTIES(${VBAM_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) SET_SOURCE_FILES_PROPERTIES(${VBAM_ICON_PATH} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
endif(APPLE) endif(APPLE)
SET(WX_EXE_NAME visualboyadvance-m-wx${CMAKE_EXECUTABLE_SUFFIX}) SET(WX_EXE_NAME visualboyadvance-m-wx${CMAKE_EXECUTABLE_SUFFIX})