aboutsummaryrefslogtreecommitdiffstats
path: root/cmake/EthExecutableHelper.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/EthExecutableHelper.cmake')
-rw-r--r--cmake/EthExecutableHelper.cmake143
1 files changed, 143 insertions, 0 deletions
diff --git a/cmake/EthExecutableHelper.cmake b/cmake/EthExecutableHelper.cmake
new file mode 100644
index 00000000..746ba42e
--- /dev/null
+++ b/cmake/EthExecutableHelper.cmake
@@ -0,0 +1,143 @@
+#
+# this function requires the following variables to be specified:
+# ETH_VERSION
+# PROJECT_NAME
+# PROJECT_VERSION
+# PROJECT_COPYRIGHT_YEAR
+# PROJECT_VENDOR
+# PROJECT_DOMAIN_SECOND
+# PROJECT_DOMAIN_FIRST
+# SRC_LIST
+# HEADERS
+#
+# params:
+# ICON
+#
+
+macro(eth_add_executable EXECUTABLE)
+ set (extra_macro_args ${ARGN})
+ set (options)
+ set (one_value_args ICON)
+ set (multi_value_args UI_RESOURCES WIN_RESOURCES)
+ cmake_parse_arguments (ETH_ADD_EXECUTABLE "${options}" "${one_value_args}" "${multi_value_args}" "${extra_macro_args}")
+
+ if (APPLE)
+
+ add_executable(${EXECUTABLE} MACOSX_BUNDLE ${SRC_LIST} ${HEADERS} ${ETH_ADD_EXECUTABLE_UI_RESOURCES})
+ set(PROJECT_VERSION "${ETH_VERSION}")
+ set(MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME} ${PROJECT_VERSION}")
+ set(MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_NAME} ${PROJECT_VERSION}")
+ set(MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_NAME} ${PROJECT_VERSION}")
+ set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}")
+ set(MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT_YEAR} ${PROJECT_VENDOR}")
+ set(MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_DOMAIN_SECOND}.${PROJECT_DOMAIN_FIRST}")
+ set(MACOSX_BUNDLE_BUNDLE_NAME ${EXECUTABLE})
+ set(MACOSX_BUNDLE_ICON_FILE ${ETH_ADD_EXECUTABLE_ICON})
+ set_target_properties(${EXECUTABLE} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/EthereumMacOSXBundleInfo.plist.in")
+ set_source_files_properties(${EXECUTABLE} PROPERTIES MACOSX_PACKAGE_LOCATION MacOS)
+ set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/${MACOSX_BUNDLE_ICON_FILE}.icns" PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
+
+ else ()
+ add_executable(${EXECUTABLE} ${ETH_ADD_EXECUTABLE_UI_RESOURCES} ${ETH_ADD_EXECUTABLE_WIN_RESOURCES} ${SRC_LIST} ${HEADERS})
+ endif()
+
+endmacro()
+
+macro(eth_simple_add_executable EXECUTABLE)
+ add_executable(${EXECUTABLE} ${SRC_LIST} ${HEADERS})
+
+ # Apple does not support statically linked binaries on OS X. That means
+ # that we can only statically link against our external libraries, but
+ # we cannot statically link against the C++ runtime libraries and other
+ # platform libraries (as is possible on Windows and Alpine Linux) to produce
+ # an entirely transportable binary.
+ #
+ # See https://developer.apple.com/library/mac/qa/qa1118/_index.html for more info.
+ #
+ # GLIBC also appears not to support static linkage too, which probably means that
+ # Debian and Ubuntu will only be able to do partially-statically linked
+ # executables too, just like OS X.
+ #
+ # For OS X, at the time of writing, we are left with the following dynamically
+ # linked dependencies, of which curl and libz might still be fixable:
+ #
+ # /usr/lib/libc++.1.dylib
+ # /usr/lib/libSystem.B.dylib
+ # /usr/lib/libcurl.4.dylib
+ # /usr/lib/libz.1.dylib
+ #
+ if (STATIC_LINKING AND NOT APPLE)
+ set(CMAKE_EXE_LINKER_FLAGS "-static ${CMAKE_EXE_LINKER_FLAGS}")
+ set_target_properties(${EXECUTABLE} PROPERTIES LINK_SEARCH_START_STATIC 1)
+ set_target_properties(${EXECUTABLE} PROPERTIES LINK_SEARCH_END_STATIC 1)
+ endif()
+endmacro()
+
+macro(eth_copy_dll EXECUTABLE DLL)
+ # dlls must be unsubstitud list variable (without ${}) in format
+ # optimized;path_to_dll.dll;debug;path_to_dlld.dll
+ if(DEFINED MSVC)
+ list(GET ${DLL} 1 DLL_RELEASE)
+ list(GET ${DLL} 3 DLL_DEBUG)
+ add_custom_command(TARGET ${EXECUTABLE}
+ PRE_BUILD
+ COMMAND ${CMAKE_COMMAND} ARGS
+ -DDLL_RELEASE="${DLL_RELEASE}"
+ -DDLL_DEBUG="${DLL_DEBUG}"
+ -DCONF="$<CONFIGURATION>"
+ -DDESTINATION="${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}"
+ -P "${ETH_SCRIPTS_DIR}/copydlls.cmake"
+ )
+ endif()
+endmacro()
+
+macro(eth_copy_dlls EXECUTABLE)
+ foreach(dll ${ARGN})
+ eth_copy_dll(${EXECUTABLE} ${dll})
+ endforeach(dll)
+endmacro()
+
+
+macro(eth_install_executable EXECUTABLE)
+
+ if (APPLE)
+
+ # TODO - Why is this different than the branch Linux below, which has the RUNTIME keyword too?
+ install(TARGETS ${EXECUTABLE} DESTINATION bin)
+
+ elseif (DEFINED MSVC)
+
+ set(COMPONENT ${EXECUTABLE})
+
+ install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Debug/"
+ DESTINATION .
+ CONFIGURATIONS Debug
+ COMPONENT ${COMPONENT}
+ )
+
+ install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Release/"
+ DESTINATION .
+ CONFIGURATIONS Release
+ COMPONENT ${COMPONENT}
+ )
+
+ install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/"
+ DESTINATION .
+ CONFIGURATIONS RelWithDebInfo
+ COMPONENT ${COMPONENT}
+ )
+
+ else()
+ install( TARGETS ${EXECUTABLE} RUNTIME DESTINATION bin)
+ endif ()
+
+endmacro()
+
+macro (eth_name KEY VALUE)
+ if (NOT (APPLE OR WIN32))
+ string(TOLOWER ${VALUE} LVALUE )
+ set(${KEY} ${LVALUE})
+ else()
+ set(${KEY} ${VALUE})
+ endif()
+endmacro()