summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorpalange <palange@lindenlab.com>2009-11-02 12:12:32 -0800
committerpalange <palange@lindenlab.com>2009-11-02 12:12:32 -0800
commitcf0c0e182441e442db78ded1a7139818502ae066 (patch)
tree614ceaf88fdfea9e2d42c1c4137642793d505b5d /indra
parent53c972a521cbb92c6c9390c41b250a41dc22cd5a (diff)
Added build time script to help deploy shared libs for an arbitrary executable.
indra/cmake/DeploySharedLibs.cmake is the script. LLSharedLibs.cmake contains a macro to ease adding DeployShaerdLibs to a targets build. Example usage to the mac-crash-reporter. Multiplatform and more to come soon. Reviewed by brad.
Diffstat (limited to 'indra')
-rw-r--r--indra/cmake/DeploySharedLibs.cmake67
-rw-r--r--indra/cmake/LLSharedLibs.cmake31
-rw-r--r--indra/mac_crash_logger/CMakeLists.txt5
3 files changed, 103 insertions, 0 deletions
diff --git a/indra/cmake/DeploySharedLibs.cmake b/indra/cmake/DeploySharedLibs.cmake
new file mode 100644
index 0000000000..a7e772bd75
--- /dev/null
+++ b/indra/cmake/DeploySharedLibs.cmake
@@ -0,0 +1,67 @@
+# DeploySharedLibs.cmake
+# This is a script to be run at build time! Its not part of the cmake configuration!
+# See indra/cmake/LLSharedLibs.cmake for a macro that simplifies adding a command to a target to run this script.
+
+# This script requires a few cmake variable to be set on the command line:
+# BIN_NAME= The full path the the binary to search for dependecies.
+# SEARCH_DIRS= The full paths to dirs to search for dependencies.
+# DST_PATH= The full path where the dependecies will be copied.
+include(GetPrerequisites)
+message("Getting recursive dependencies for file: ${BIN_NAME}")
+set(EXCLUDE_SYSTEM 1)
+set(RECURSE 1)
+get_filename_component(EXE_PATH ${BIN_NAME} PATH)
+
+get_prerequisites( ${BIN_NAME} RESULTS ${EXCLUDE_SYSTEM} ${RECURSE} "${EXE_PATH}" "${SEARCH_DIRS}" )
+
+foreach(DEP ${RESULTS})
+ Message("Processing dependency: ${DEP}")
+ get_filename_component(DEP_FILE ${DEP} NAME)
+ set(DEP_FILES ${DEP_FILES} ${DEP_FILE})
+endforeach(DEP)
+
+if(DEP_FILES)
+ list(REMOVE_DUPLICATES DEP_FILES)
+endif(DEP_FILES)
+
+foreach(DEP_FILE ${DEP_FILES})
+ if(FOUND_FILES)
+ list(FIND FOUND_FILES ${DEP_FILE} FOUND)
+ else(FOUND_FILES)
+ set(FOUND -1)
+ endif(FOUND_FILES)
+
+ if(FOUND EQUAL -1)
+ find_path(DEP_PATH ${DEP_FILE} PATHS ${SEARCH_DIRS} NO_DEFAULT_PATH)
+ if(DEP_PATH)
+ set(FOUND_FILES ${FOUND_FILES} "${DEP_PATH}/${DEP_FILE}")
+ set(DEP_PATH NOTFOUND) #reset DEP_PATH for the next find_path call.
+ else(DEP_PATH)
+ set(MISSING_FILES ${MISSING_FILES} ${DEP_FILE})
+ endif(DEP_PATH)
+ endif(FOUND EQUAL -1)
+endforeach(DEP_FILE)
+
+if(MISSING_FILES)
+ message("Missing:")
+ foreach(FILE ${MISSING_FILES})
+ message(" ${FILE}")
+ endforeach(FILE)
+ message("Searched in:")
+ foreach(SEARCH_DIR ${SEARCH_DIRS})
+ message(" ${SEARCH_DIR}")
+ endforeach(SEARCH_DIR)
+ message(FATAL_ERROR "Failed")
+endif(MISSING_FILES)
+
+if(FOUND_FILES)
+ foreach(FILE ${FOUND_FILES})
+ get_filename_component(DST_FILE ${FILE} NAME)
+ set(DST_FILE "${DST_PATH}/${DST_FILE}")
+ message("Copying ${FILE} to ${DST_FILE}")
+ execute_process(
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE} ${DST_FILE}
+ )
+ endforeach(FILE ${FOUND_FILES})
+endif(FOUND_FILES)
+message("Success!")
diff --git a/indra/cmake/LLSharedLibs.cmake b/indra/cmake/LLSharedLibs.cmake
new file mode 100644
index 0000000000..3be22ab401
--- /dev/null
+++ b/indra/cmake/LLSharedLibs.cmake
@@ -0,0 +1,31 @@
+# ll_deploy_sharedlibs_command
+# target_exe: the cmake target of the executable for which the shared libs will be deployed.
+# search_dirs: a list of dirs to search for the dependencies
+# dst_path: path to copy deps to, relative to the output location of the target_exe
+macro(ll_deploy_sharedlibs_command target_exe search_dirs dst_path)
+ get_target_property(OUTPUT_LOCATION ${target_exe} LOCATION)
+
+ if(DARWIN)
+ get_target_property(IS_BUNDLE ${target_exe} MACOSX_BUNDLE)
+ if(IS_BUNDLE)
+ get_filename_component(TARGET_FILE ${OUTPUT_LOCATION} NAME)
+ set(OUTPUT_PATH ${OUTPUT_LOCATION}.app/Contents/MacOS)
+ set(OUTPUT_LOCATION ${OUTPUT_PATH}/${TARGET_FILE})
+ endif(IS_BUNDLE)
+ else(APPLE)
+ message(FATAL_ERROR "Only darwin currently supported!")
+ endif(DARWIN)
+
+ add_custom_command(
+ TARGET ${target_exe} POST_BUILD
+ COMMAND ${CMAKE_COMMAND}
+ ARGS
+ "-DBIN_NAME=\"${OUTPUT_LOCATION}\""
+ "-DSEARCH_DIRS=\"${search_dirs}\""
+ "-DDST_PATH=\"${OUTPUT_PATH}/${dst_path}\""
+ "-P"
+ "${CMAKE_SOURCE_DIR}/cmake/DeploySharedLibs.cmake"
+ )
+
+endmacro(ll_deploy_sharedlibs_command)
+
diff --git a/indra/mac_crash_logger/CMakeLists.txt b/indra/mac_crash_logger/CMakeLists.txt
index daf3e10857..1d6494fecf 100644
--- a/indra/mac_crash_logger/CMakeLists.txt
+++ b/indra/mac_crash_logger/CMakeLists.txt
@@ -10,6 +10,7 @@ include(LLMessage)
include(LLVFS)
include(LLXML)
include(Linking)
+include(LLSharedLibs)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
@@ -74,3 +75,7 @@ add_custom_command(
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-crash-logger.app/Contents/Resources/CrashReporter.nib
)
+ll_deploy_sharedlibs_command(
+ mac-crash-logger
+ "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR};${ARCH_PREBUILT_DIRS}"
+ "../Resources")