Skip to content

Commit

Permalink
CMake: Improved finding of FMOD, LibOVR; OS X plugin install names
Browse files Browse the repository at this point in the history
  • Loading branch information
skyjake committed Feb 20, 2015
1 parent 3ca7617 commit 1586a28
Show file tree
Hide file tree
Showing 12 changed files with 127 additions and 92 deletions.
2 changes: 1 addition & 1 deletion doomsday/apps/client/CMakeLists.txt
Expand Up @@ -40,7 +40,7 @@ if (UNIX)
file (GLOB ameSrc ${DOC_DIR}/*.ame)
add_custom_command (
OUTPUT ${MAN_PAGE}
COMMAND "${AMETHYST_EXECUTABLE}" -dMAN -dUNIX -odoomsday.6 ${DOC_DIR}/readme.ame
COMMAND "${AMETHYST_COMMAND}" -dMAN -dUNIX -odoomsday.6 ${DOC_DIR}/readme.ame
DEPENDS ${ameSrc}
COMMENT "Compiling manual page..."
)
Expand Down
33 changes: 27 additions & 6 deletions doomsday/apps/plugins/PluginConfig.cmake
Expand Up @@ -18,7 +18,14 @@ macro (deng_add_plugin target)
enable_cxx11 (${target})
set_target_properties (${target} PROPERTIES FOLDER Plugins)
if (APPLE)
set_target_properties (${target} PROPERTIES BUNDLE ON)
set_target_properties (${target} PROPERTIES
BUNDLE ON
MACOSX_BUNDLE_INFO_PLIST ${DENG_SOURCE_DIR}/cmake/MacOSXPluginBundleInfo.plist.in
BUILD_WITH_INSTALL_RPATH ON # staging prevents CMake's own rpath fixing
INSTALL_RPATH "@executable_path/../Frameworks"
)
macx_set_bundle_name ("net.dengine.plugin.${target}")
set (MACOSX_BUNDLE_BUNDLE_EXECUTABLE "${target}.bundle/Contents/MacOS/${target}")
# Stage plugins for symlinking/copying into the client app later.
# This is needed because we want access to these even in a build where the
# plugins are not installed yet -- the staging directory symlinks to the
Expand All @@ -30,16 +37,30 @@ macro (deng_add_plugin target)
"${CMAKE_CURRENT_BINARY_DIR}/${target}.bundle"
"${stage}/${target}.bundle"
)
# Fix the Qt framework install names manually.
deng_bundle_install_names (${target}
SCRIPT_NAME "qtlibs"
LD_PATH "@executable_path/../Frameworks"
QtCore.framework/Versions/5/QtCore
QtNetwork.framework/Versions/5/QtNetwork
VERBATIM
)
# set (_script "postbuild-${target}.cmake")
# file (WRITE ${_script} "
# include (${DENG_SOURCE_DIR}/cmake/Macros.cmake)
# set (CMAKE_INSTALL_NAME_TOOL ${CMAKE_INSTALL_NAME_TOOL})
# fix_bundled_install_names (\"${CMAKE_INSTALL_PREFIX}/${target}.bundle/Contents/MacOS/${target}\"
# )
# ")
# add_custom_command (TARGET ${target} POST_BUILD
# COMMAND ${CMAKE_COMMAND} -P ${_script}
# )
deng_xcode_attribs (${target})
set_target_properties (${target} PROPERTIES
MACOSX_BUNDLE_INFO_PLIST ${DENG_SOURCE_DIR}/cmake/MacOSXPluginBundleInfo.plist.in
)
macx_set_bundle_name ("net.dengine.plugin.${target}")
set (MACOSX_BUNDLE_BUNDLE_EXECUTABLE "${target}.bundle/Contents/MacOS/${target}")
deng_bundle_resources ()
else ()
set_target_properties (${target} VERSION ${DENG_VERSION})
endif ()
install (TARGETS ${target} LIBRARY DESTINATION ${DENG_INSTALL_PLUGIN_DIR})
set (_src)
set (_script)
endmacro (deng_add_plugin)
2 changes: 1 addition & 1 deletion doomsday/apps/plugins/fmod/CMakeLists.txt
Expand Up @@ -7,7 +7,7 @@ include (../PluginConfig.cmake)

find_package (FMOD QUIET)

if (FMOD_FOUND)
if (TARGET fmodex)
# Deploy the FMOD library.
get_property (libPath TARGET fmodex PROPERTY INTERFACE_LINK_LIBRARIES)
if (APPLE)
Expand Down
2 changes: 1 addition & 1 deletion doomsday/apps/server/CMakeLists.txt
Expand Up @@ -252,7 +252,7 @@ if (UNIX)
set (DOC_DIR ${DENG_SOURCE_DIR}/doc/server)
add_custom_command (
OUTPUT ${MAN_PAGE}
COMMAND "${AMETHYST_EXECUTABLE}" -dMAN -dUNIX -odoomsday-server.6 ${DOC_DIR}/server.ame
COMMAND "${AMETHYST_COMMAND}" -dMAN -dUNIX -odoomsday-server.6 ${DOC_DIR}/server.ame
DEPENDS ${DOC_DIR}/server.ame ${DOC_DIR}/manpage.ame
COMMENT "Compiling manual page..."
)
Expand Down
10 changes: 5 additions & 5 deletions doomsday/cmake/FindAmethyst.cmake
@@ -1,11 +1,11 @@
if (NOT DEFINED AMETHYST_EXECUTABLE)
find_program (AMETHYST_EXECUTABLE amethyst
if (NOT DEFINED AMETHYST_COMMAND)
find_program (AMETHYST_COMMAND amethyst
DOC "Amethyst document processor executable"
)
mark_as_advanced (AMETHYST_EXECUTABLE)
message (STATUS "Found Amethyst: ${AMETHYST_EXECUTABLE}")
mark_as_advanced (AMETHYST_COMMAND)
message (STATUS "Found Amethyst: ${AMETHYST_COMMAND}")
endif ()

if (NOT AMETHYST_EXECUTABLE STREQUAL AMETHYST_EXECUTABLE-NOTFOUND)
if (NOT AMETHYST_COMMAND STREQUAL AMETHYST_COMMAND-NOTFOUND)
set (AMETHYST_FOUND YES)
endif ()
4 changes: 2 additions & 2 deletions doomsday/cmake/FindCcache.cmake
@@ -1,6 +1,6 @@
find_program (CCACHE_EXECUTABLE ccache)
find_program (CCACHE_PROGRAM ccache)

if (NOT CCACHE_EXECUTABLE STREQUAL "CCACHE_EXECUTABLE-NOTFOUND")
if (NOT CCACHE_PROGRAM STREQUAL "CCACHE_PROGRAM-NOTFOUND")
set (CCACHE_FOUND YES)
set (CCACHE_OPTION_DEFAULT ON)
else ()
Expand Down
34 changes: 21 additions & 13 deletions doomsday/cmake/FindFMOD.cmake
@@ -1,22 +1,30 @@
set (FMOD_DIR "FMOD Programmers API" CACHE PATH
"Location of the FMOD Programmer's API SDK"
set (FMOD_DIR "" CACHE PATH "Location of the FMOD Programmer's API SDK")

set (_oldPath ${FMOD_FMOD_H})

find_file (FMOD_FMOD_H api/inc/fmod.h
PATHS
"${FMOD_DIR}"
"${FMOD_DIR}/FMOD Programmers API"
NO_DEFAULT_PATH
)
mark_as_advanced (FMOD_FMOD_H)

if (NOT FMOD_FOUND)
get_filename_component (fullPath "${FMOD_DIR}" ABSOLUTE)
if (EXISTS "${fullPath}/api")
set (FMOD_FOUND YES CACHE BOOL "FMOD SDK found")
mark_as_advanced (FMOD_FOUND)
message (STATUS "Found FMOD: ${FMOD_DIR}")
if (NOT _oldPath STREQUAL FMOD_FMOD_H)
if (FMOD_FMOD_H)
message (STATUS "Looking for FMOD Ex - found")
else ()
message (STATUS "Looking for FMOD Ex - not found")
endif ()
endif ()

if (FMOD_FOUND AND NOT TARGET fmodex)
if (NOT FMOD_FMOD_H STREQUAL "FMOD_FMOD_H-NOTFOUND" AND NOT TARGET fmodex)
get_filename_component (fmodInc "${FMOD_FMOD_H}" DIRECTORY)
get_filename_component (fmodApi "${fmodInc}" DIRECTORY)

add_library (fmodex INTERFACE)
target_include_directories (fmodex INTERFACE ${FMOD_DIR}/api/inc)
target_include_directories (fmodex INTERFACE ${fmodInc})
if (APPLE)
target_link_libraries (fmodex INTERFACE
${FMOD_DIR}/api/lib/libfmodex.dylib
)
target_link_libraries (fmodex INTERFACE ${fmodApi}/lib/libfmodex.dylib)
endif ()
endif ()
51 changes: 33 additions & 18 deletions doomsday/cmake/FindOculusVR.cmake
@@ -1,24 +1,39 @@
set (LIBOVR_DIR "LibOVR" CACHE PATH "Location of the LibOVR library (from Oculus SDK)")
set (LIBOVR_DIR "" CACHE PATH "Location of the LibOVR library (in the Oculus SDK)")

if (NOT LIBOVR_FOUND)
get_filename_component (fullPath "${LIBOVR_DIR}" ABSOLUTE)
if (EXISTS "${fullPath}/Include")
set (LIBOVR_FOUND YES CACHE BOOL "LibOVR found")
mark_as_advanced (LIBOVR_FOUND)
message (STATUS "Found LibOVR: ${LIBOVR_DIR}")
set (_oldPath ${LIBOVR_OVR_H})

find_file (LIBOVR_OVR_H Include/OVR.h
PATHS
"${LIBOVR_DIR}"
"${LIBOVR_DIR}/LibOVR"
"${LIBOVR_DIR}/OculusSDK/LibOVR"
NO_DEFAULT_PATH
)
mark_as_advanced (LIBOVR_OVR_H)

if (NOT _oldPath STREQUAL LIBOVR_OVR_H)
if (LIBOVR_OVR_H)
message (STATUS "Looking for LibOVR - found")
else ()
message (STATUS "Looking for LibOVR - not found")
endif ()
endif ()

if (LIBOVR_FOUND AND NOT TARGET LibOVR)
add_library (LibOVR INTERFACE)
target_include_directories (LibOVR INTERFACE "${LIBOVR_DIR}/Include" "${LIBOVR_DIR}/Src")
target_compile_definitions (LibOVR INTERFACE -DDENG_HAVE_OCULUS_API)
if (APPLE)
target_link_libraries (LibOVR INTERFACE
debug "${LIBOVR_DIR}/Lib/Mac/Debug/libovr.a"
optimized "${LIBOVR_DIR}/Lib/Mac/Release/libovr.a"
)
link_framework (LibOVR INTERFACE Cocoa)
link_framework (LibOVR INTERFACE IOKit)
if (NOT LIBOVR_OVR_H STREQUAL "LIBOVR_OVR_H-NOTFOUND")
if (NOT TARGET LibOVR)
get_filename_component (ovrDir "${LIBOVR_OVR_H}" DIRECTORY)
get_filename_component (ovrDir "${ovrDir}" DIRECTORY)

add_library (LibOVR INTERFACE)
target_include_directories (LibOVR INTERFACE "${ovrDir}/Include" "${ovrDir}/Src")
target_compile_definitions (LibOVR INTERFACE -DDENG_HAVE_OCULUS_API)
if (APPLE)
target_link_libraries (LibOVR INTERFACE
debug "${ovrDir}/Lib/Mac/Debug/libovr.a"
optimized "${ovrDir}/Lib/Mac/Release/libovr.a"
)
link_framework (LibOVR INTERFACE Cocoa)
link_framework (LibOVR INTERFACE IOKit)
endif ()
endif ()
endif ()
2 changes: 1 addition & 1 deletion doomsday/cmake/FindQt.cmake
Expand Up @@ -29,6 +29,6 @@ if (NOT DEFINED QT_PREFIX_DIR)

if (APPLE)
qmake_query (QT_BINS "QT_INSTALL_BINS")
set (MACDEPLOYQT_EXECUTABLE "${QT_BINS}/macdeployqt" CACHE PATH "Qt's macdeployqt executable path")
set (MACDEPLOYQT_COMMAND "${QT_BINS}/macdeployqt" CACHE PATH "Qt's macdeployqt executable path")
endif ()
endif ()
75 changes: 33 additions & 42 deletions doomsday/cmake/Macros.cmake
Expand Up @@ -29,6 +29,12 @@ function (sublist outputVariable startIndex length)
set (${outputVariable} ${_sublist} PARENT_SCOPE)
endfunction (sublist)

macro (clean_paths outputVariable text)
string (REGEX REPLACE "${CMAKE_BINARY_DIR}/([A-Za-z0-9]+)"
"\\1" ${outputVariable} ${text}
)
endmacro ()

macro (enable_cxx11 target)
if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
set_property (TARGET ${target} PROPERTY CXX_STANDARD_REQUIRED ON)
Expand Down Expand Up @@ -219,6 +225,7 @@ function (deng_add_package packName)
OUTPUT_VARIABLE msg
OUTPUT_STRIP_TRAILING_WHITESPACE
)
clean_paths (msg ${msg})
message (STATUS "${msg}")
add_custom_target (${packName} ALL DEPENDS ${outName})
set_target_properties (${packName} PROPERTIES
Expand Down Expand Up @@ -365,7 +372,18 @@ function (fix_bundled_install_names binaryFile)
if (NOT EXISTS ${binaryFile})
message (FATAL_ERROR "fix_bundled_install_names: ${binaryFile} not found")
endif ()
if (binaryFile MATCHES ".*\\.bundle")
set (ref "@loader_path/../Frameworks")
else ()
set (ref "@executable_path/../Frameworks")
endif ()
sublist (libs 1 -1 ${ARGV})
# Check for arguments.
list (GET libs 0 first)
if (first STREQUAL "LD_PATH")
list (GET libs 1 ref)
list (REMOVE_AT libs 1 0)
endif ()
list (GET libs -1 last)
if (last STREQUAL "VERBATIM")
set (verbatim ON)
Expand All @@ -376,11 +394,6 @@ function (fix_bundled_install_names binaryFile)
-L ${binaryFile}
OUTPUT_VARIABLE deps
)
if (binaryFile MATCHES ".*\\.bundle")
set (ref "@loader_path")
else ()
set (ref "@executable_path")
endif ()
foreach (fn ${libs})
if (NOT verbatim)
get_filename_component (base "${fn}" NAME)
Expand All @@ -392,18 +405,26 @@ function (fix_bundled_install_names binaryFile)
string (STRIP ${CMAKE_MATCH_1} depPath)
message (STATUS "Changing install name: ${depPath}")
execute_process (COMMAND ${CMAKE_INSTALL_NAME_TOOL}
-change ${depPath} ${ref}/../Frameworks/${base}
${binaryFile}
-change "${depPath}" "${ref}/${base}"
"${binaryFile}"
)
endif ()
endforeach (fn)
endfunction (fix_bundled_install_names)

# Fixes the install names of the listed libraries that have been bundled into
# the target.
macro (deng_bundle_install_names target)
function (deng_bundle_install_names target)
sublist (libs 1 -1 ${ARGV})
set (scriptName "${CMAKE_CURRENT_BINARY_DIR}/postbuild-${target}.cmake")
# Check for arguments.
list (GET libs 0 first)
if (first STREQUAL "SCRIPT_NAME")
list (GET libs 1 _s)
set (_suffix "-${_s}")
list (REMOVE_AT libs 0)
list (REMOVE_AT libs 0)
endif ()
set (scriptName "${CMAKE_CURRENT_BINARY_DIR}/postbuild${_suffix}-${target}.cmake")
# Correct the install names of the dependent libraries.
file (GENERATE OUTPUT "${scriptName}" CONTENT "\
set (CMAKE_MODULE_PATH ${DENG_SOURCE_DIR}/cmake)\n\
Expand All @@ -415,9 +436,7 @@ fix_bundled_install_names (\"${CMAKE_CURRENT_BINARY_DIR}/${target}.bundle/Conten
COMMAND ${CMAKE_COMMAND} -P "${scriptName}"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
set (scriptName)
set (libs)
endmacro (deng_bundle_install_names)
endfunction (deng_bundle_install_names)

# Install the libraries of a dependency.
macro (deng_install_deps target)
Expand Down Expand Up @@ -445,45 +464,17 @@ function (deng_install_deployqt target)
endif ()
get_property (_outName TARGET ${target} PROPERTY OUTPUT_NAME)
if (APPLE) # AND NOT DENG_DEVELOPER) # don't run this on a dev build
if (NOT MACDEPLOYQT_EXECUTABLE)
if (NOT MACDEPLOYQT_COMMAND)
message (FATAL_ERROR "macdeployqt not available")
endif ()
install (CODE "message (STATUS \"Running macdeployqt on ${_outName}.app...\")
execute_process (COMMAND ${MACDEPLOYQT_EXECUTABLE} \"${CMAKE_INSTALL_PREFIX}/${_outName}.app\"
execute_process (COMMAND ${MACDEPLOYQT_COMMAND} \"${CMAKE_INSTALL_PREFIX}/${_outName}.app\"
OUTPUT_QUIET ERROR_QUIET)")
elseif (WIN32)
# run windeployqt
endif ()
endfunction (deng_install_deployqt)

# macro (deng_install_tools app)
# sublist (_tools 1 -1 ${ARGV})
# get_property (_outName TARGET ${app} PROPERTY OUTPUT_NAME)
# set (_dest "${_outName}.app/Contents/MacOS")
# foreach (_tool ${_tools})
# if (TARGET ${_tool})
# get_property (_name TARGET ${_tool} PROPERTY OUTPUT_NAME)
# if (NOT _name)
# set (_name ${_tool})
# endif()
# install (FILES $<TARGET_FILE:${_tool}> DESTINATION ${_dest}
# PERMISSIONS
# OWNER_READ GROUP_READ WORLD_READ
# OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE
# OWNER_WRITE
# )
# install (CODE "
# include (${DENG_SOURCE_DIR}/cmake/Macros.cmake)
# set (CMAKE_INSTALL_NAME_TOOL ${CMAKE_INSTALL_NAME_TOOL})
# fix_bundled_install_names (\"${CMAKE_INSTALL_PREFIX}/${_dest}/${_name}\"
# QtCore.framework/Versions/5/QtCore
# QtNetwork.framework/Versions/5/QtNetwork
# VERBATIM)
# ")
# endif ()
# endforeach (_tool)
# endmacro (deng_install_tools)

function (deng_install_tool target)
install (TARGETS ${target} DESTINATION bin)
# OS X: Also install to the client application bundle.
Expand Down
2 changes: 1 addition & 1 deletion doomsday/sdk/libappfw/CMakeLists.txt
Expand Up @@ -26,7 +26,7 @@ target_link_libraries (libappfw
PUBLIC Deng::libcore Deng::libgui Deng::libshell Qt5::Widgets Qt5::OpenGL
PRIVATE opengl
)
if (LIBOVR_FOUND)
if (TARGET LibOVR)
target_link_libraries (libappfw PRIVATE LibOVR)
endif ()

Expand Down
2 changes: 1 addition & 1 deletion doomsday/tools/shell-text/CMakeLists.txt
Expand Up @@ -30,7 +30,7 @@ if (AMETHYST_FOUND)
set (DOC_DIR ${DENG_SOURCE_DIR}/doc/shell-text)
add_custom_command (
OUTPUT ${MAN_PAGE}
COMMAND "${AMETHYST_EXECUTABLE}" -dMAN -dUNIX -odoomsday-shell-text.6 ${DOC_DIR}/shell-text.ame
COMMAND "${AMETHYST_COMMAND}" -dMAN -dUNIX -odoomsday-shell-text.6 ${DOC_DIR}/shell-text.ame
DEPENDS ${DOC_DIR}/shell-text.ame
COMMENT "Compiling manual page..."
)
Expand Down

0 comments on commit 1586a28

Please sign in to comment.