set(CAPSTONE_CMAKE_ARGS
	-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
	-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
	-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
	-DCMAKE_MSVC_RUNTIME_LIBRARY=${CMAKE_MSVC_RUNTIME_LIBRARY}
	-DCAPSTONE_ARCHITECTURE_DEFAULT=ON
	-DCAPSTONE_BUILD_TESTS=OFF
	-DCAPSTONE_BUILD_CSTOOL=OFF
	-DCAPSTONE_INSTALL=OFF
	-DCAPSTONE_BUILD_SHARED=OFF
	-DCMAKE_POSITION_INDEPENDENT_CODE=ON
	-DCAPSTONE_ARCHITECTURE_DEFAULT=OFF
)
if(MSVC)
	if(CMAKE_MSVC_RUNTIME_LIBRARY STREQUAL "MultiThreaded" OR CMAKE_MSVC_RUNTIME_LIBRARY STREQUAL "MultiThreadedDebug")
		set(CAPSTONE_CMAKE_ARGS ${CAPSTONE_CMAKE_ARGS} -DCAPSTONE_BUILD_STATIC_RUNTIME=ON)
	else()
		set(CAPSTONE_CMAKE_ARGS ${CAPSTONE_CMAKE_ARGS} -DCAPSTONE_BUILD_STATIC_RUNTIME=OFF)
	endif()
	# Hack: remove hardcoded /MT and /MTd flags from the Capstone v4 CMakeLists.txt
	# This way, it will respect CMAKE_MSVC_RUNTIME_LIBRARY and CAPSTONE_BUILD_STATIC_RUNTIME
	set(CAPSTONE_CMAKELISTS "${CAPSTONE_DIR}/CMakeLists.txt")
	file(LOCK "${CAPSTONE_CMAKELISTS}.lock" TIMEOUT 10)
	file(READ "${CAPSTONE_CMAKELISTS}" CAPSTONE_CMAKELISTS_CONTENTS)
	string(REPLACE "\"\${CMAKE_CXX_FLAGS_RELEASE} /MT\"" "\"\${CMAKE_CXX_FLAGS_RELEASE}\"" CAPSTONE_CMAKELISTS_CONTENTS "${CAPSTONE_CMAKELISTS_CONTENTS}")
	string(REPLACE "\"\${CMAKE_CXX_FLAGS_DEBUG} /MTd\"" "\"\${CMAKE_CXX_FLAGS_DEBUG}\"" CAPSTONE_CMAKELISTS_CONTENTS "${CAPSTONE_CMAKELISTS_CONTENTS}")
	file(WRITE "${CAPSTONE_CMAKELISTS}" "${CAPSTONE_CMAKELISTS_CONTENTS}")
	file(LOCK "${CAPSTONE_CMAKELISTS}.lock" RELEASE)
else()
	set(CAPSTONE_CMAKE_ARGS ${CAPSTONE_CMAKE_ARGS} -DCAPSTONE_BUILD_STATIC_RUNTIME=OFF)
endif()
set(CAPSTONE_CMAKE_ARGS ${CAPSTONE_CMAKE_ARGS} -DCAPSTONE_ARM_SUPPORT=ON -DCAPSTONE_ARM64_SUPPORT=ON -DCAPSTONE_MIPS_SUPPORT=ON -DCAPSTONE_X86_SUPPORT=ON -DCAPSTONE_PPC_SUPPORT=ON -DCAPSTONE_SPARC_SUPPORT=ON -DCAPSTONE_SYSZ_SUPPORT=ON)
ExternalProject_Add(capstone-engine SOURCE_DIR ${CAPSTONE_DIR} INSTALL_COMMAND "" CMAKE_ARGS ${CAPSTONE_CMAKE_ARGS})

set(KEYSTONE_CMAKE_ARGS
	-DBUILD_LIBS_ONLY=1
	-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
	-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
	-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
	-DCMAKE_MSVC_RUNTIME_LIBRARY=${CMAKE_MSVC_RUNTIME_LIBRARY}
	-DCMAKE_POSITION_INDEPENDENT_CODE=ON
)
if(MSVC)
	string(TOUPPER "LLVM_USE_CRT_${CMAKE_BUILD_TYPE}" LLVM_USE_CRT_VAR)
	if(CMAKE_MSVC_RUNTIME_LIBRARY STREQUAL "MultiThreaded")
		set(KEYSTONE_CMAKE_ARGS ${KEYSTONE_CMAKE_ARGS} -DKEYSTONE_BUILD_STATIC_RUNTIME=ON)
		set(KEYSTONE_CMAKE_ARGS ${KEYSTONE_CMAKE_ARGS} -D${LLVM_USE_CRT_VAR}=MT)
	elseif(CMAKE_MSVC_RUNTIME_LIBRARY STREQUAL "MultiThreadedDebug")
		set(KEYSTONE_CMAKE_ARGS ${KEYSTONE_CMAKE_ARGS} -DKEYSTONE_BUILD_STATIC_RUNTIME=ON)
		set(KEYSTONE_CMAKE_ARGS ${KEYSTONE_CMAKE_ARGS} -D${LLVM_USE_CRT_VAR}=MTd)
	elseif(CMAKE_MSVC_RUNTIME_LIBRARY STREQUAL "MultiThreadedDLL")
		set(KEYSTONE_CMAKE_ARGS ${KEYSTONE_CMAKE_ARGS} -DKEYSTONE_BUILD_STATIC_RUNTIME=OFF)
		set(KEYSTONE_CMAKE_ARGS ${KEYSTONE_CMAKE_ARGS} -D${LLVM_USE_CRT_VAR}=MD)
	elseif(CMAKE_MSVC_RUNTIME_LIBRARY STREQUAL "MultiThreadedDebugDLL")
		set(KEYSTONE_CMAKE_ARGS ${KEYSTONE_CMAKE_ARGS} -DKEYSTONE_BUILD_STATIC_RUNTIME=OFF)
		set(KEYSTONE_CMAKE_ARGS ${KEYSTONE_CMAKE_ARGS} -D${LLVM_USE_CRT_VAR}=MDd)
	else()
		set(KEYSTONE_CMAKE_ARGS ${KEYSTONE_CMAKE_ARGS} -DKEYSTONE_BUILD_STATIC_RUNTIME=OFF)
	endif()
else ()
	set(KEYSTONE_CMAKE_ARGS ${KEYSTONE_CMAKE_ARGS} -DKEYSTONE_BUILD_STATIC_RUNTIME=OFF)
endif()
set(KEYSTONE_LLVM_TARGETS "AArch64 ARM Mips PowerPC Sparc SystemZ X86")
set(KEYSTONE_CMAKE_ARGS ${KEYSTONE_CMAKE_ARGS} -DLLVM_TARGETS_TO_BUILD=${KEYSTONE_LLVM_TARGETS})
ExternalProject_Add(keystone-engine SOURCE_DIR ${KEYSTONE_DIR} INSTALL_COMMAND "" CMAKE_ARGS ${KEYSTONE_CMAKE_ARGS})

add_subdirectory("${LLVM_DIR}")
