Browse Source

Make CMakeLists.txt more decoupled from Megasource.

rude 9 years ago
parent
commit
b0effb5570
1 changed files with 134 additions and 68 deletions
  1. 134 68
      CMakeLists.txt

+ 134 - 68
CMakeLists.txt

@@ -27,13 +27,6 @@ cmake_minimum_required(VERSION 2.8)
 
 project(love)
 
-if(NOT MEGA)
-	message(FATAL_ERROR "
-It is currently only possible to build with megasource on Windows.
-Please see http://bitbucket.org/rude/megasource
-")
-endif()
-
 set(LOVE_EXE_NAME love)
 set(LOVE_LIB_NAME liblove)
 
@@ -66,17 +59,112 @@ message(STATUS "Target platform: ${LOVE_TARGET_PLATFORM}")
 
 find_package(OpenGL)
 
-if(${LOVE_JIT})
-	set(MEGA_LUA ${MEGA_LUAJIT_LIB})
-	set(MEGA_EXTRA_INCLUDE ${MEGA_LUAJIT_INCLUDE})
-	set(MEGA_EXTRA_DLLS ${MEGA_LUAJIT_DLL})
-	set(MEGA_EXTRA_DEPENDECIES luajit)
+if(MEGA)
+	# LOVE_MSVC_DLLS contains runtime DLLs that should be bundled with the love
+	# binary (in e.g. the installer). Example: msvcp140.dll.
+	set(LOVE_MSVC_DLLS ${MEGA_MSVC_DLLS})
+
+	# LOVE_INCLUDE_DIRS contains the search directories for #include. It's mostly
+	# not needed for MEGA builds, since almost all the libraries (except LuaJIT)
+	# are CMake targets, causing include paths to be added automatically.
+	set(LOVE_INCLUDE_DIRS)
+
+	# SDL2 links with some DirectX libraries, and we apparently also
+	# pull those libraries in for linkage because we link with SDL2.
+	set(LOVE_LINK_DIRS ${SDL_LINK_DIR})
+
+	set(LOVE_LINK_LIBRARIES
+		${OPENGL_gl_LIBRARY}
+		${MEGA_FREETYPE}
+		${MEGA_LIBOGG}
+		${MEGA_LIBVORBISFILE}
+		${MEGA_LIBVORBIS}
+		${MEGA_LIBTHEORA}
+		${MEGA_MODPLUG}
+		${MEGA_OPENAL}
+		${MEGA_PHYSFS}
+		${MEGA_SDL2MAIN}
+		${MEGA_SDL2}
+		${MEGA_ZLIB}
+	)
+
+	# These DLLs are moved next to the love binary in a post-build step to
+	# love runnable from inside Visual Studio.
+	#
+	# LOVE_MOVE_DLLS can contain CMake targets, in which case the target's
+	# output is assumed to be a DLL, or it can contain paths to actual files.
+	# We detect whether or not each item is a target, and take the appropriate
+	# action.
+	set(LOVE_MOVE_DLLS
+		${MEGA_SDL2}
+		${MEGA_OPENAL}
+	)
+
+	if(LOVE_MPG123)
+		set(LOVE_LINK_LIBRARIES
+			${LOVE_LINK_LIBRARIES}
+			${MEGA_MPEG123}
+		)
+		set(LOVE_MOVE_DLLS
+			${LOVE_MOVE_DLLS}
+			${MEGA_MPEG123}
+		)
+	endif()
+
+	if(LOVE_JIT)
+		set(LOVE_LUA_LIBRARY ${MEGA_LUAJIT_LIB})
+		# LOVE_EXTRA_DLLS are non-runtime DLLs which should be bundled with the
+		# love binary in installers, etc. It's only needed for external
+		# (non-CMake) targets, i.e. LuaJIT.
+		set(LOVE_EXTRA_DLLS ${MEGA_LUAJIT_DLL})
+		set(LOVE_EXTRA_DEPENDECIES luajit)
+
+		set(LOVE_INCLUDE_DIRS
+			${LOVE_INCLUDE_DIRS}
+			${MEGA_LUAJIT_INCLUDE}
+		)
+		set(LOVE_LINK_LIBRARIES
+			${LOVE_LINK_LIBRARIES}
+			${LOVE_LUA_LIBRARY}
+		)
+		set(LOVE_MOVE_DLLS
+			${LOVE_MOVE_DLLS}
+			${MEGA_LUAJIT_DLL}
+		)
+	else()
+		set(LOVE_LUA_LIBRARY ${MEGA_LUA51})
+
+		set(LOVE_LINK_LIBRARIES
+			${LOVE_LINK_LIBRARIES}
+			${LOVE_LUA_LIBRARY}
+		)
+		set(LOVE_MOVE_DLLS
+			${LOVE_MOVE_DLLS}
+			${LOVE_LUA_LIBRARY}
+		)
+		# MEGA_LUA51 is a CMake target, so includes are handled
+		# automatically.
+	endif()
 else()
-	set(MEGA_LUA ${MEGA_LUA51})
-	# MEGA_LUA51 is a CMake target, so includes are handled
-	# automatically.
+	message(FATAL_ERROR "
+It is currently only possible to build with megasource on Windows.
+Please see http://bitbucket.org/rude/megasource
+")
 endif()
 
+###
+### No Megasource-specific stuff beyond this point!
+###
+
+function(disable_warnings ARG_TARGET)
+	get_target_property(OLD_FLAGS ${ARG_TARGET} COMPILE_FLAGS)
+	set(NEW_FLAGS -W0)
+	if(OLD_FLAGS)
+		set(NEW_FLAGS "${OLD_FLAGS} ${NEW_FLAGS}")
+	endif()
+	set_target_properties(${ARG_TARGET} PROPERTIES COMPILE_FLAGS ${NEW_FLAGS})
+endfunction()
+
 #
 # common
 #
@@ -1028,7 +1116,7 @@ set(LOVE_SRC_3P_ENET
 )
 
 add_library(love_3p_enet ${LOVE_SRC_3P_ENET})
-target_link_libraries(love_3p_enet ${MEGA_LUA})
+target_link_libraries(love_3p_enet ${LOVE_LUA_LIBRARY})
 target_include_directories(love_3p_enet PUBLIC src/libraries/enet/libenet/include)
 
 #
@@ -1114,7 +1202,7 @@ set(LOVE_SRC_3P_LUASOCKET
 )
 
 add_library(love_3p_luasocket ${LOVE_SRC_3P_LUASOCKET})
-target_link_libraries(love_3p_luasocket ${MEGA_LUA})
+target_link_libraries(love_3p_luasocket ${LOVE_LUA_LIBRARY})
 
 #
 # Lua 5.3's UTF-8 library
@@ -1127,7 +1215,7 @@ set(LOVE_SRC_3P_LUAUTF8
 )
 
 add_library(love_3p_luautf8 ${LOVE_SRC_3P_LUAUTF8})
-target_link_libraries(love_3p_luautf8 ${MEGA_LUA})
+target_link_libraries(love_3p_luautf8 ${LOVE_LUA_LIBRARY})
 
 #
 # lz4
@@ -1248,40 +1336,10 @@ include_directories(
 	src
 	src/libraries
 	src/modules
-	${MEGA_EXTRA_INCLUDE}
+	${LOVE_INCLUDE_DIRS}
 )
 
-# SDL2 links with some DirectX libraries, and we apparently also
-# pull those libraries in for linkage because we link with SDL2.
-link_directories(${SDL_LINK_DIR})
-
-set(LOVE_MEGA_3P
-	${MEGA_FREETYPE}
-	${MEGA_LIBOGG}
-	${MEGA_LIBVORBISFILE}
-	${MEGA_LIBVORBIS}
-	${MEGA_LIBTHEORA}
-	${MEGA_LUA}
-	${MEGA_MODPLUG}
-	${MEGA_OPENAL}
-	${MEGA_PHYSFS}
-	${MEGA_SDL2MAIN}
-	${MEGA_SDL2}
-	${MEGA_ZLIB}
-)
-
-if(LOVE_MPG123)
-	set(LOVE_MEGA_3P
-		${LOVE_MEGA_3P}
-		${MEGA_MPEG123}
-	)
-endif()
-
-
-set(LOVE_LINK_LIBRARIES
-	${OPENGL_gl_LIBRARY}
-	${LOVE_MEGA_3P}
-)
+link_directories(${LOVE_LINK_DIRS})
 
 set(LOVE_RC)
 
@@ -1300,8 +1358,8 @@ endif()
 add_library(${LOVE_LIB_NAME} SHARED ${LOVE_LIB_SRC} ${LOVE_RC})
 target_link_libraries(${LOVE_LIB_NAME} ${LOVE_LINK_LIBRARIES} ${LOVE_3P})
 
-if(MEGA_EXTRA_DEPENDECIES)
-	add_dependencies(${LOVE_LIB_NAME} ${MEGA_EXTRA_DEPENDECIES})
+if(LOVE_EXTRA_DEPENDECIES)
+	add_dependencies(${LOVE_LIB_NAME} ${LOVE_EXTRA_DEPENDECIES})
 endif()
 
 if(MSVC)
@@ -1320,21 +1378,29 @@ if(MSVC)
 	target_link_libraries(${LOVE_CONSOLE_EXE_NAME} ${LOVE_LIB_NAME})
 endif()
 
+function(post_step_move_dll ARG_POST_TARGET ARG_TARGET_OR_FILE)
+	if(TARGET ${ARG_TARGET_OR_FILE})
+		add_custom_command(TARGET ${ARG_POST_TARGET} POST_BUILD
+			COMMAND ${CMAKE_COMMAND} -E copy
+			$<TARGET_FILE:${ARG_TARGET_OR_FILE}>
+			${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>/$<TARGET_FILE_NAME:${ARG_TARGET_OR_FILE}>)
+	else()
+		get_filename_component(TEMP_FILENAME ${ARG_TARGET_OR_FILE} NAME)
+		add_custom_command(TARGET ${ARG_POST_TARGET} POST_BUILD
+			COMMAND ${CMAKE_COMMAND} -E copy
+			${ARG_TARGET_OR_FILE}
+			${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>/${TEMP_FILENAME})
+	endif()
+endfunction()
 
 # Add post build steps to move the DLLs next to the binary. Otherwise
 # running/debugging the binary will not work from inside VS.
-if(LOVE_MPG123)
-	add_move_dll(love ${MEGA_MPEG123})
+if(LOVE_MOVE_DLLS)
+	foreach(DLL ${LOVE_MOVE_DLLS})
+		post_step_move_dll(love ${DLL})
+	endforeach()
 endif()
 
-add_move_dll(love ${MEGA_SDL2})
-add_move_dll(love ${MEGA_OPENAL})
-
-if(LOVE_JIT)
-	add_move_file(love ${MEGA_LUAJIT_DLL})
-else()
-	add_move_dll(love ${MEGA_LUA51})
-endif()
 
 ###################################
 # Version
@@ -1364,21 +1430,21 @@ message(STATUS "Version: ${LOVE_VERSION_STR}")
 install(TARGETS ${LOVE_EXE_NAME} ${LOVE_CONSOLE_EXE_NAME} ${LOVE_LIB_NAME} RUNTIME DESTINATION .)
 
 # Extra DLLs.
-if(MEGA_EXTRA_DLLS)
-	foreach(DLL ${MEGA_EXTRA_DLLS})
+if(LOVE_EXTRA_DLLS)
+	foreach(DLL ${LOVE_EXTRA_DLLS})
 		get_filename_component(DLL_NAME ${DLL} NAME)
 		message(STATUS "Extra DLL: ${DLL_NAME}")
 	endforeach()
-	install(FILES ${MEGA_EXTRA_DLLS} DESTINATION .)
+	install(FILES ${LOVE_EXTRA_DLLS} DESTINATION .)
 endif()
 
 # Dynamic runtime libs.
-if(MEGA_MSVC_DLLS)
-	foreach(DLL ${MEGA_MSVC_DLLS})
+if(LOVE_MSVC_DLLS)
+	foreach(DLL ${LOVE_MSVC_DLLS})
 		get_filename_component(DLL_NAME ${DLL} NAME)
 		message(STATUS "Runtime DLL: ${DLL_NAME}")
 	endforeach()
-	install(FILES ${MEGA_MSVC_DLLS} DESTINATION .)
+	install(FILES ${LOVE_MSVC_DLLS} DESTINATION .)
 endif()
 
 # Copy a text file from CMAKE_CURRENT_SOURCE_DIR to CMAKE_CURRENT_BINARY_DIR.