view dep/animia/CMakeLists.txt @ 223:84e0a3c4737a

library: implement menu bar buttons I also went ahead and put the links from Taiga in so I don't have to worry about it later...
author Paper <mrpapersonic@gmail.com>
date Mon, 08 Jan 2024 16:54:16 -0500
parents 53211cb1e7f5
children 8ccf0302afb1
line wrap: on
line source

cmake_minimum_required(VERSION 3.16)
project(animia LANGUAGES CXX)
set(SRC_FILES
	# any non-platform-specific files go here
	src/animia.cc
	src/player.cc
	src/util.cc
	src/strategist.cc
	src/fd.cc
	src/win.cc
)

include(CheckLanguage)

set(LIBRARIES)
set(INCLUDE_DIRS)
set(DEFINES)

if(APPLE)
	list(APPEND DEFINES MACOSX)
	list(APPEND SRC_FILES
		# xnu stuff
		src/fd/xnu.cc
		src/util/osx.cc
	)

	include(CheckIncludeFile)
	check_include_file("CoreFoundation/CoreFoundation.h" HAVE_COREFOUNDATION)
	# If you're building on OS X, you most likely do have this file, but we
	# check anyway.
	if(HAVE_COREFOUNDATION)
		list(APPEND DEFINES HAVE_COREFOUNDATION)
		find_library(OBJC_LIBRARY objc)

		if(NOT OBJC_LIBRARY)
			message(STATUS "Found CoreFoundation/CoreFoundation.h, but not the Objective-C runtime. How?")
		endif()

		list(APPEND SRC_FILES src/win/quartz.cc)

		find_library(FOUNDATION_LIBRARY Foundation)
		find_library(COREGRAPHICS_LIBRARY CoreGraphics)
		find_library(APPKIT_LIBRARY AppKit)
		list(APPEND LIBRARIES ${FOUNDATION_LIBRARY} ${COREGRAPHICS_LIBRARY} ${APPKIT_LIBRARY} ${OBJC_LIBRARY})
	else() # NOT HAVE_COREFOUNDATION
		message(STATUS "You don't have Core Foundation. How? What kind of voodoo magic did you do to cause this?")
		message(WARNING "LaunchServices support will not be compiled.")
	endif() # HAVE_COREFOUNDATION
elseif(WIN32)
	list(APPEND DEFINES WIN32)
	list(APPEND SRC_FILES
		# win32
		src/fd/win32.cc
		src/win/win32.cc
		src/util/win32.cc
	)
else() # NOT WIN32 AND NOT APPLE
	find_library(LIBUTIL_LIBRARY util)
	find_library(LIBKVM_LIBRARY kvm)

	if(LINUX)
		list(APPEND DEFINES LINUX)
		list(APPEND SRC_FILES src/fd/proc.cc)
	elseif(LIBUTIL_LIBRARY) # FreeBSD's libutil
		get_filename_component(LIBUTIL_DIR ${LIBUTIL_LIBRARY} DIRECTORY)

		include(CheckLibraryExists)
		check_library_exists(util kinfo_getfile ${LIBUTIL_DIR} LIBUTIL_GOOD)

		if(LIBUTIL_GOOD)
			list(APPEND LIBRARIES ${LIBUTIL_LIBRARY})
			list(APPEND DEFINES LIBUTIL)
			list(APPEND SRC_FILES src/fd/libutil.cc)
		endif() # LIBUTIL_GOOD
	elseif(LIBKVM_LIBRARY) # OpenBSD kvm
		list(APPEND LIBRARIES ${LIBKVM_LIBRARY})
		list(APPEND DEFINES LIBKVM)
		list(APPEND SRC_FILES src/fd/kvm.cc)

		get_filename_component(LIBKVM_DIR ${LIBKVM_LIBRARY} DIRECTORY)

		include(CheckLibraryExists)
		check_library_exists(kvm kvm_getfiles ${LIBKVM_DIR} LIBKVM_HAS_GETFILES)

		if(LIBKVM_HAS_GETFILES)
			list(APPEND DEFINES HAVE_KVM_GETFILES)
		endif() # LIBKVM_HAS_GETFILES
	endif() # LINUX
endif() # WIN32 AND APPLE

# It's technically possible to have an X server on macOS, so we
# should compile X11 support.
# X11
find_package(X11 COMPONENTS X11 XRes)

if(X11_FOUND)
	# Getting PIDs from windows...
	if (X11_XRes_FOUND)
		list(APPEND DEFINES HAVE_XRES)
	else() # NOT X11_XRes_FOUND
		message(WARNING "libXRes could not be found! Finding PIDs in X11 windows may not work correctly!")
	endif() # X11_XRes_FOUND

	list(APPEND DEFINES X11)
	list(APPEND SRC_FILES src/win/x11.cc)
	list(APPEND INCLUDE_DIRS ${X11_INCLUDE_DIRS})
	list(APPEND LIBRARIES ${X11_LIBRARIES}) # This will include Xres, I think..
else() # NOT X11_FOUND
	# For some systems, i.e. Debian, FindX11 fails to find X11, so we have
	# to use pkg_config as a fallback
	find_package(PkgConfig)
	if(PKG_CONFIG_FOUND)
		pkg_check_modules(X11 x11)
		if(X11_FOUND)
			# Check for XRes the hard way
			find_path(X11_XRes_HEADER "X11/extensions/XRes.h" PATHS ${X11_INCLUDE_DIRS})
			find_library(X11_XRes_LIB XRes PATHS ${X11_LIBRARY_DIRS})

			if(X11_XRes_HEADER AND X11_XRes_LIB)
				# TODO: We should REALLY check for XResQueryClientIds here...
				list(APPEND DEFINES HAVE_XRES)
				list(APPEND LIBRARIES ${X11_XRes_LIB})
			else()
				message(WARNING "libXRes could not be found! Finding PIDs in X11 windows may not work correctly!")
			endif()

			list(APPEND DEFINES X11)
			list(APPEND SRC_FILES src/win/x11.cc)
			list(APPEND INCLUDE_DIRS ${X11_INCLUDE_DIRS})
			list(APPEND LIBRARIES ${X11_LINK_LIBRARIES})
		endif() # X11_FOUND
	endif() # PKG_CONFIG_FOUND
endif() # X11_FOUND

# Wayland.
find_package(PkgConfig)
if(PKG_CONFIG_FOUND)
	pkg_check_modules(WAYLAND wayland-client)
	if(WAYLAND_FOUND)
		enable_language(C)
		list(APPEND DEFINES WAYLAND)
		list(APPEND SRC_FILES
			src/win/wayland.cc
			src/win/wayland/ext-foreign-toplevel-list-v1.c
			src/win/wayland/wlr-foreign-toplevel-management-unstable-v1.c
		)
		list(APPEND INCLUDE_DIRS ${WAYLAND_INCLUDE_DIRS})
		list(APPEND LIBRARIES ${WAYLAND_LINK_LIBRARIES})
	endif() # WAYLAND_FOUND
endif() # PKG_CONFIG_FOUND

add_library(animia SHARED ${SRC_FILES})
set_target_properties(animia PROPERTIES
	PUBLIC_HEADER include/animia.h
	CXX_STANDARD 17
)

target_compile_definitions(animia PRIVATE ${DEFINES})
target_include_directories(animia PUBLIC include PRIVATE ${INCLUDE_DIRS})
target_link_libraries(animia PUBLIC ${LIBRARIES})