include(ExternalProject)
include(GNUInstallDirs)
include(ProcessorCount)

ProcessorCount(CPUS)

set(RE2_INSTALL_DIR       ${CMAKE_CURRENT_BINARY_DIR}/re2)
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.23.0" AND CMAKE_INSTALL_LIBDIR MATCHES "/${CMAKE_LIBRARY_ARCHITECTURE}$")
	string(REGEX REPLACE "/${CMAKE_LIBRARY_ARCHITECTURE}$" "/" RE2_INSTALL_LIBDIR ${RE2_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR})
else()
	set(RE2_INSTALL_LIBDIR ${RE2_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR})
endif()
set(RE2_INCLUDE_DIR       ${RE2_INSTALL_DIR}/include)
set(RE2_INSTALLED_LIBRARY ${RE2_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}re2${CMAKE_STATIC_LIBRARY_SUFFIX})
set(RE2_LIBRARY           ${RE2_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}pog_re2${CMAKE_STATIC_LIBRARY_SUFFIX})

if(MSVC)
	set(RE2_BUILD_COMMAND ${CMAKE_COMMAND} --build . --config $<CONFIG> -- -m)
	set(RE2_INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config $<CONFIG>)
else()
	set(RE2_BUILD_COMMAND ${CMAKE_COMMAND} --build . -- -j${CPUS})
	set(RE2_INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install)
endif()

ExternalProject_Add(
	re2-dep
	PREFIX "re2"
	SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/re2"
	CMAKE_ARGS
		-DCMAKE_INSTALL_PREFIX=${RE2_INSTALL_DIR}
		-DCMAKE_POSITION_INDEPENDENT_CODE=${POG_PIC}
		-DCMAKE_BUILD_TYPE=Release
		-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
		-DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}
		-DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
		-DRE2_BUILD_TESTING=OFF
	BUILD_COMMAND
		${RE2_BUILD_COMMAND}
	INSTALL_COMMAND
		${RE2_INSTALL_COMMAND}
)

ExternalProject_Add_Step(
	re2-dep rename
	DEPENDEES install
	COMMAND ${CMAKE_COMMAND} -E rename ${RE2_INSTALLED_LIBRARY} ${RE2_LIBRARY}
)

add_library(re2::re2 STATIC IMPORTED GLOBAL)
set_target_properties(re2::re2 PROPERTIES
	INTERFACE_INCLUDE_DIRECTORIES "${RE2_INCLUDE_DIR}"
	IMPORTED_LOCATION "${RE2_LIBRARY}"
)
target_link_libraries(re2::re2 INTERFACE Threads::Threads)
add_dependencies(re2::re2 re2-dep)

install(
	FILES ${RE2_LIBRARY}
	DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}
)
install(
	DIRECTORY ${RE2_INCLUDE_DIR}/re2/
	DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/pog/re2
)
