2016-07-15 14:47:21 +00:00
|
|
|
# This is free and unencumbered software released into the public domain.
|
|
|
|
#
|
|
|
|
# Anyone is free to copy, modify, publish, use, compile, sell, or
|
|
|
|
# distribute this software, either in source code form or as a compiled
|
|
|
|
# binary, for any purpose, commercial or non-commercial, and by any
|
|
|
|
# means.
|
|
|
|
#
|
|
|
|
# In jurisdictions that recognize copyright laws, the author or authors
|
|
|
|
# of this software dedicate any and all copyright interest in the
|
|
|
|
# software to the public domain. We make this dedication for the benefit
|
|
|
|
# of the public at large and to the detriment of our heirs and
|
|
|
|
# successors. We intend this dedication to be an overt act of
|
|
|
|
# relinquishment in perpetuity of all present and future rights to this
|
|
|
|
# software under copyright law.
|
|
|
|
#
|
|
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
|
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
|
|
# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
|
|
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
|
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
|
|
# OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
#
|
|
|
|
# For more information, please refer to <http://unlicense.org/>
|
|
|
|
|
2016-07-14 13:05:19 +00:00
|
|
|
cmake_minimum_required(VERSION 2.8.12.2 FATAL_ERROR)
|
|
|
|
|
|
|
|
function (add_shared_git_project SUBMODULE_PATH)
|
|
|
|
if (IS_ABSOLUTE "${SUBMODULE_PATH}")
|
|
|
|
set(submod_path "${SUBMODULE_PATH}")
|
|
|
|
else()
|
|
|
|
set(submod_path "${CMAKE_CURRENT_SOURCE_DIR}/${SUBMODULE_PATH}")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if (NOT EXISTS "${submod_path}")
|
|
|
|
message(FATAL_ERROR "Path \"${submod_path}\" doesn't exist")
|
|
|
|
endif()
|
|
|
|
if (NOT IS_DIRECTORY "${submod_path}")
|
|
|
|
message(FATAL_ERROR "Path \"${submod_path}\" is not a valid directory")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if (NOT EXISTS "${submod_path}/.git")
|
|
|
|
message(FATAL_ERROR ".git not found in \"${submod_path}\". Not a git submodule?")
|
|
|
|
endif()
|
|
|
|
if (IS_DIRECTORY "${submod_path}/.git")
|
|
|
|
message(FATAL_ERROR "\"${submod_path}.git\" is a directory, not a file as expected. Not a git submodule?")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
get_filename_component(proj_name_orig "${submod_path}" NAME)
|
|
|
|
if ("${proj_name_orig}" STREQUAL "")
|
|
|
|
message(FATAL_ERROR "Couldn't make up a name for given project in \"${submod_path}\"")
|
|
|
|
endif()
|
|
|
|
|
2016-07-14 16:30:45 +00:00
|
|
|
string(MAKE_C_IDENTIFIER "${proj_name_orig}" proj_name_c_id)
|
2016-07-14 13:05:19 +00:00
|
|
|
string(TOUPPER ${proj_name_c_id} proj_name)
|
|
|
|
|
|
|
|
get_property(shared_projects_list GLOBAL PROPERTY SHARED_PROJECTS_LIST)
|
|
|
|
list(FIND shared_projects_list ${proj_name} found_index)
|
|
|
|
if (${found_index} GREATER -1)
|
|
|
|
#nothing to do, the variable is already set so the project must have been
|
|
|
|
#included already
|
|
|
|
return()
|
|
|
|
endif()
|
|
|
|
|
|
|
|
#Obtain the path to the working tree
|
|
|
|
# see http://stackoverflow.com/questions/27379818/git-possible-to-use-same-submodule-working-copy-by-multiple-projects
|
|
|
|
# git rev-parse --git-dir --show-toplevel
|
|
|
|
execute_process(
|
|
|
|
COMMAND git rev-parse --show-toplevel
|
|
|
|
WORKING_DIRECTORY "${submod_path}"
|
|
|
|
OUTPUT_VARIABLE matched_gitdir
|
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
|
|
)
|
|
|
|
|
|
|
|
#Make sure we got an absolute path
|
|
|
|
if (IS_ABSOLUTE "${matched_gitdir}")
|
|
|
|
set(reported_submodule_dir "${matched_gitdir}")
|
|
|
|
else()
|
|
|
|
file(RELATIVE_PATH reported_submodule_dir "${CMAKE_CURRENT_SOURCE_DIR}" "${submod_path}/${matched_gitdir}")
|
|
|
|
endif()
|
|
|
|
unset(matched_gitdir)
|
|
|
|
|
|
|
|
#Check if submodule is a subdirectory of the current source dir
|
|
|
|
file(RELATIVE_PATH reported_submodule_rel_path "${CMAKE_CURRENT_SOURCE_DIR}" "${reported_submodule_dir}")
|
|
|
|
string(LENGTH "${reported_submodule_rel_path}" rel_path_len)
|
|
|
|
if (${rel_path_len} GREATER 2)
|
2016-07-14 14:36:29 +00:00
|
|
|
string(SUBSTRING "${reported_submodule_rel_path}" 0 3 first_bit)
|
2016-07-14 13:05:19 +00:00
|
|
|
if ("../" STREQUAL "${first_bit}")
|
|
|
|
set(is_out_of_dirtree ON)
|
|
|
|
else()
|
|
|
|
set(is_out_of_dirtree OFF)
|
|
|
|
endif()
|
|
|
|
unset(first_bit)
|
|
|
|
else()
|
|
|
|
set(is_out_of_dirtree OFF)
|
|
|
|
endif()
|
|
|
|
unset(rel_path_len)
|
|
|
|
|
|
|
|
#Globally mark current submodule as handled
|
|
|
|
set_property(GLOBAL APPEND PROPERTY SHARED_PROJECTS_LIST ${proj_name})
|
|
|
|
|
|
|
|
set(shared_project_binary "${CMAKE_CURRENT_BINARY_DIR}/shared_projects/${proj_name_orig}")
|
|
|
|
if (is_out_of_dirtree)
|
2016-07-14 14:36:29 +00:00
|
|
|
#message(FATAL_ERROR "Would call add_subdirectory(\"${reported_submodule_dir}\" \"${shared_project_binary}\")")
|
2016-07-14 13:05:19 +00:00
|
|
|
add_subdirectory("${reported_submodule_dir}" "${shared_project_binary}")
|
|
|
|
else()
|
2016-07-14 14:36:29 +00:00
|
|
|
#message(FATAL_ERROR "Would call add_subdirectory(\"${reported_submodule_rel_path}\")")
|
2016-07-14 13:05:19 +00:00
|
|
|
add_subdirectory("${reported_submodule_rel_path}")
|
|
|
|
endif()
|
|
|
|
endfunction()
|