option(PSEMEK_PACKAGE_MODE "Enable packaging mode" OFF)

if(PSEMEK_PACKAGE_MODE)
	if(WIN32)
		set(PSEMEK_PACKAGE_SUFFIX_RAW win)
	elseif(UNIX AND (NOT APPLE))
		set(PSEMEK_PACKAGE_SUFFIX_RAW linux)
	elseif(UNIX AND APPLE)
		set(PSEMEK_PACKAGE_SUFFIX_RAW mac)
	else()
		message(FATAL "Uknown system for packaging")
	endif()
	set(PSEMEK_PACKAGE_SUFFIX ${PSEMEK_PACKAGE_SUFFIX_RAW} CACHE INTERNAL "Packaging suffix" FORCE)

	set(PSEMEK_PACKAGE_LINK_FLAGS_RAW)
	if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
		list(APPEND PSEMEK_PACKAGE_LINK_FLAGS_RAW "-static-libgcc" "-static-libstdc++")
	endif()
	set(PSEMEK_PACKAGE_LINK_FLAGS ${PSEMEK_PACKAGE_LINK_FLAGS_RAW} CACHE INTERNAL "Packaging CXX flags" FORCE)

	set(PSEMEK_COPY_FILES_RAW)
endif()

function(psemek_add_executable_impl target build link_psemek package)
	if(${build})
		add_executable(${target} ${ARGN})

		if(${link_psemek})
			target_link_libraries(${target} PUBLIC psemek)
		endif()

		if(${package})
			target_link_options(${target} PUBLIC ${PSEMEK_PACKAGE_LINK_FLAGS})

			set_target_properties(${target} PROPERTIES
				BUILD_RPATH "."
			)

			add_custom_command(TARGET ${target} POST_BUILD
				COMMAND ${CMAKE_STRIP} $<TARGET_FILE:${target}>
				COMMAND chrpath -r . $<TARGET_FILE:${target}>
				COMMAND zip ${CMAKE_CURRENT_SOURCE_DIR}/${target}-${PSEMEK_PACKAGE_SUFFIX}.zip -j $<TARGET_FILE:${target}> ${PSEMEK_PACKAGE_COPY_FILES}
			)
		endif()
	endif()
endfunction()

function(psemek_add_executable target)
	if((NOT PSEMEK_PACKAGE_MODE) OR PSEMEK_PACKAGE_TARGET)
		add_executable(${target} ${ARGN})

		target_link_libraries(${target} PUBLIC psemek)

		if(PSEMEK_PACKAGE_MODE)
			target_link_options(${target} PUBLIC ${PSEMEK_PACKAGE_LINK_FLAGS})

			if(UNIX AND (NOT APPLE))
				set_target_properties(${target} PROPERTIES
					BUILD_RPATH "."
				)
			endif()

			add_custom_command(TARGET ${target} POST_BUILD
				COMMAND ${CMAKE_STRIP} $<TARGET_FILE:${target}>
			)

			if(UNIX AND (NOT APPLE))
				add_custom_command(TARGET ${target} POST_BUILD
					COMMAND chrpath -r . $<TARGET_FILE:${target}>
				)
			endif()

			add_custom_command(TARGET ${target} POST_BUILD
				COMMAND zip ${CMAKE_CURRENT_SOURCE_DIR}/${target}-${PSEMEK_PACKAGE_SUFFIX}.zip -j $<TARGET_FILE:${target}> ${PSEMEK_PACKAGE_COPY_FILES}
			)
		endif()
	endif()
endfunction()

function(psemek_add_build_tool target link_psemek)
	if((NOT PSEMEK_PACKAGE_MODE) OR PSEMEK_PACKAGE_HOST)
		add_executable(${target} ${ARGN})

		if(${link_psemek})
			target_link_libraries(${target} PUBLIC psemek)
		endif()

		if(PSEMEK_PACKAGE_MODE)
			install(TARGETS ${target} RUNTIME DESTINATION bin)
		endif()
	else()
		find_file(_LOCATION ${target} PATHS "${PSEMEK_PACKAGE_TOOLS_PATH}/bin")
		message(STATUS "Found ${target}: ${_LOCATION}")
		if(NOT _LOCATION)
			message(FATAL "Could not locate ${target} build tool in ${PSEMEK_PACKAGE_TOOLS_PATH}")
		endif()
		add_executable(${target} IMPORTED GLOBAL)
		set_target_properties(${target} PROPERTIES IMPORTED_LOCATION ${_LOCATION})
	endif()
endfunction()
