if(NOT EXISTS ${GIT_EXECUTABLE}) unset(GIT_EXECUTABLE CACHE) endif() find_package(Git) if(Git_FOUND) set(GIT_EXECUTABLE ${GIT_EXECUTABLE} CACHE INTERNAL "" FORCE) else() message(FATAL_ERROR "Failed to find git.") endif() function(CloneExternalLib name url branch shallow_exclude) set(external_folder "${CMAKE_CURRENT_SOURCE_DIR}") set(external_lib_folder "${external_folder}/${name}") if(EXISTS ${external_lib_folder}) message(STATUS "Removing ${external_lib_folder}...") file(REMOVE_RECURSE ${external_lib_folder}) endif() message(STATUS "Cloning ${name}...") set(branch_param "") set(branch_name_param "") if(NOT ("x${branch}" STREQUAL "x")) set(branch_param "-b") set(branch_name_param "${branch}") endif() set(shallow_exclude_param "") if(NOT ("x${shallow_exclude}" STREQUAL "x")) set(shallow_exclude_param "--shallow-exclude=${shallow_exclude}") endif() execute_process(COMMAND "${GIT_EXECUTABLE}" "clone" ${url} ${branch_param} ${branch_name_param} ${shallow_exclude_param} "${name}" "-n" WORKING_DIRECTORY "${external_folder}") endfunction() function(CheckoutExternalLib name rev) set(external_folder "${CMAKE_CURRENT_SOURCE_DIR}") set(external_lib_folder "${external_folder}/${name}") execute_process(COMMAND "${GIT_EXECUTABLE}" "checkout" "-q" ${rev} WORKING_DIRECTORY ${external_lib_folder} RESULT_VARIABLE checkout_err) set(${ARGV2} ${checkout_err} PARENT_SCOPE) endfunction() function(UpdateExternalLib name url rev) set(external_folder "${CMAKE_CURRENT_SOURCE_DIR}") set(external_lib_folder "${external_folder}/${name}") if(EXISTS "${external_lib_folder}/.git") set(need_clone FALSE) set(cached_rev_file_name "${CMAKE_CURRENT_BINARY_DIR}/KLAYGE_${name}_REV") if(EXISTS "${cached_rev_file_name}") file(STRINGS "${cached_rev_file_name}" cached_rev) else() set(cached_rev "") endif() IF("${cached_rev}" STREQUAL "${rev}") set(need_checkout FALSE) else() message(STATUS "Updating ${name} to revision ${rev}...") execute_process(COMMAND "${GIT_EXECUTABLE}" "fetch" "origin" WORKING_DIRECTORY ${external_lib_folder}) execute_process(COMMAND "${GIT_EXECUTABLE}" "rev-parse" "HEAD" WORKING_DIRECTORY ${external_lib_folder} OUTPUT_VARIABLE head_rev) string(STRIP ${head_rev} head_rev) if (${head_rev} STREQUAL ${rev}) set(need_checkout FALSE) else() set(need_checkout TRUE) endif() file(WRITE "${cached_rev_file_name}" ${rev}) endif() else() set(need_clone TRUE) endif() if(need_clone) CloneExternalLib(${name} ${url} "${ARGV3}" "${ARGV4}") set(need_checkout TRUE) endif() if(need_checkout) message(STATUS "Checking out to revision ${rev}...") CheckoutExternalLib(${name} ${rev} checkout_err) if(checkout_err) message(STATUS "COULD NOT checkout revision ${rev}, reclone the repository.") CloneExternalLib(${name} ${url} "${ARGV3}" "${ARGV4}") message(STATUS "Checking out to revision ${rev}...") CheckoutExternalLib(${name} ${rev}) endif() endif() set(${ARGV5} ${need_checkout} PARENT_SCOPE) endfunction() function(ApplyPatch name patch) set(external_folder "${CMAKE_CURRENT_SOURCE_DIR}") set(external_lib_folder "${external_folder}/${name}") execute_process(COMMAND "${GIT_EXECUTABLE}" "apply" "--check" "--ignore-space-change" "${patch}" WORKING_DIRECTORY ${external_lib_folder} RESULT_VARIABLE checkout_err) if(NOT checkout_err) message(STATUS "Applying ${patch}...") execute_process(COMMAND "${GIT_EXECUTABLE}" "am" "--ignore-space-change" "${patch}" WORKING_DIRECTORY ${external_lib_folder}) endif() endfunction() FOREACH(flag_var CMAKE_C_FLAGS CMAKE_CXX_FLAGS) IF(KLAYGE_COMPILER_MSVC OR KLAYGE_COMPILER_CLANGCL) STRING(REPLACE "/Wall" "/W0" ${flag_var} "${${flag_var}}") STRING(REPLACE "/WX" "/WX-" ${flag_var} "${${flag_var}}") ELSE() STRING(REPLACE "-Wall" "-w" ${flag_var} "${${flag_var}}") STRING(REPLACE "-Werror" "-Wno-error" ${flag_var} "${${flag_var}}") ENDIF() ENDFOREACH() add_subdirectory(zlib) add_subdirectory(Python) add_subdirectory(7z) add_subdirectory(boost) add_subdirectory(fmt) add_subdirectory(NanoRtti) add_subdirectory(ogg) add_subdirectory(rapidjson) add_subdirectory(rapidxml) add_subdirectory(scope-lite) add_subdirectory(vorbis) if(KLAYGE_IS_DEV_PLATFORM) add_subdirectory(assimp) add_subdirectory(cxxopts) add_subdirectory(d3dcompiler) add_subdirectory(FreeImage) add_subdirectory(freetype) add_subdirectory(googletest) add_subdirectory(nanosvg) endif() if(KLAYGE_PLATFORM_ANDROID) add_subdirectory(android_native_app_glue) endif() if(KLAYGE_PLATFORM_WINDOWS) add_subdirectory(dxsdk) add_subdirectory(DirectX-Headers) endif() if(NOT KLAYGE_PLATFORM_WINDOWS_STORE) add_subdirectory(openal-soft) endif() if(KLAYGE_COMPILER_MSVC AND (CMAKE_GENERATOR MATCHES "^Visual Studio") AND KLAYGE_PLATFORM_WINDOWS_DESKTOP AND (KLAYGE_ARCH_NAME STREQUAL "x64")) add_subdirectory(wpftoolkit) endif()