heavily rework lua discovery and linking, needs testing but it's more similar to what we do for other libraries now
authorkoda
Wed, 12 Jun 2013 11:17:54 +0200
changeset 9208 acb2492288e5
parent 9207 16373565692a
child 9209 2c1e00a764bd
heavily rework lua discovery and linking, needs testing but it's more similar to what we do for other libraries now
CMakeLists.txt
cmake_modules/FindLua.cmake
hedgewars/CMakeLists.txt
hedgewars/LuaPas.pas
hedgewars/config.inc.in
hedgewars/uScript.pas
misc/liblua/CMakeLists.txt
--- a/CMakeLists.txt	Wed Jun 12 09:49:46 2013 +0200
+++ b/CMakeLists.txt	Wed Jun 12 11:17:54 2013 +0200
@@ -21,6 +21,12 @@
 #set this to ON when 2.1.0 becomes more widespread (and only for linux)
 option(PHYSFS_SYSTEM "Use system physfs (off)" OFF)
 
+if(WIN32 OR APPLE)
+    option(LUA_SYSTEM "Use system lua (off)" OFF)
+else()
+    option(LUA_SYSTEM "Use system lua (on)" ON)
+endif()
+
 option(BUILD_ENGINE_LIBRARY "Enable hwengine library (off)" OFF)
 option(ANDROID "Enable Android build (off)" OFF)
 
@@ -135,12 +141,21 @@
 include(${CMAKE_MODULE_PATH}/utils.cmake)
 
 #lua discovery
-find_package(Lua)
-if(LUA_FOUND)
-    message(STATUS "Found LUA: ${LUA_DEFAULT}")
+if (${LUA_SYSTEM})
+    if (NOT LUA_LIBRARY OR NOT LUA_INCLUDE_DIR)
+        find_package(Lua)
+    endif()
+
+    if (LUA_LIBRARY AND LUA_INCLUDE_DIR)
+        set(LUA_FOUND TRUE)
+    else()
+        message(FATAL_ERROR "Missing Lua! Rerun cmake with -DLUA_SYSTEM=off to build the internal version")
+    endif()
 else()
     message(STATUS "LUA will be provided by the bundled sources")
     add_subdirectory(misc/liblua)
+    set(lua_output_name "hwlua")
+    list(APPEND pascal_flags "-XLAlua=${lua_output_name}" "-dLUA_INTERNAL")
 endif()
 
 
--- a/cmake_modules/FindLua.cmake	Wed Jun 12 09:49:46 2013 +0200
+++ b/cmake_modules/FindLua.cmake	Wed Jun 12 11:17:54 2013 +0200
@@ -1,37 +1,26 @@
-# Find the Lua library
-# --------------------
-# On Android/Windows/OSX this just defines the name of the library that
-#  will be compiled from our bundled sources
-# On Linux it will try to load the system library and fallback to compiling
-#  the bundled one when nothing is found
-
-set(LUA_FOUND false)
-set(LUA_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/misc/liblua)
+# Find liblua
+#
+# Once done this will define
+#  LUA_FOUND - system has Lua
+#  LUA_INCLUDE_DIR - the Lua include directory
+#  LUA_LIBRARY - The library needed to use Lua
+# Copyright (c) 2013, Vittorio Giovara <vittorio.giovara@gmail.com>
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
 
-if (ANDROID)
-    SET(LUA_DEFAULT "liblua5.1.so")
-else (ANDROID)
-    IF(WIN32)
-        SET(LUA_DEFAULT lua.dll)
-    ELSE(WIN32)
-        IF(APPLE)
-            SET(LUA_DEFAULT lua)
-        ELSE(APPLE)
-            #locate the system's lua library
-            FIND_LIBRARY(LUA_DEFAULT NAMES lua51 lua5.1 lua-5.1 lua PATHS /lib /usr/lib /usr/local/lib /usr/pkg/lib)
-            IF(${LUA_DEFAULT} MATCHES "LUA_DEFAULT-NOTFOUND")
-                set(LUA_DEFAULT lua)
-            ELSE()
-                set(LUA_FOUND true)
-                message(STATUS "LibLua 5.1 found at ${LUA_DEFAULT}")
-                find_path(LUA_INCLUDE_DIR lua.h)
-                #remove the path (fpc doesn't like it - why?)
-                GET_FILENAME_COMPONENT(LUA_DEFAULT ${LUA_DEFAULT} NAME)
-            ENDIF()
-        ENDIF(APPLE)
-    ENDIF(WIN32)
-ENDIF(ANDROID)
+include(FindPackageHandleStandardArgs)
 
-SET(LUA_LIBRARY ${LUA_DEFAULT} CACHE STRING "Lua library to link to; file name without path only!")
+find_path(LUA_INCLUDE_DIR lua.h
+                          PATHS /usr/include /usr/local/include /usr/pkg/include
+                          PATH_SUFFIXES lua5.1)
+find_library(LUA_LIBRARY NAMES lua51 lua5.1 lua-5.1 lua
+                         PATHS /lib /usr/lib /usr/local/lib /usr/pkg/lib)
 
+find_package_handle_standard_args(Lua DEFAULT_MSG LUA_LIBRARY LUA_INCLUDE_DIR)
+mark_as_advanced(LUA_INCLUDE_DIR LUA_LIBRARY)
 
--- a/hedgewars/CMakeLists.txt	Wed Jun 12 09:49:46 2013 +0200
+++ b/hedgewars/CMakeLists.txt	Wed Jun 12 11:17:54 2013 +0200
@@ -172,6 +172,16 @@
     list(APPEND pascal_flags "-dPNG_SCREENSHOTS" "-Fl${PNG_LIBRARY_DIR}" "-k-L${PNG_LIBRARY_DIR}")
 endif()
 
+if(LUA_FOUND AND LUA_SYSTEM)
+    get_filename_component(LUA_LIBRARY_DIR ${LUA_LIBRARY} PATH)
+    get_filename_component(LUA_LIBRARY_NAME ${LUA_LIBRARY} NAME)
+    #NAME_WE would strip the .1 (or .2) next to the ".so"
+    string(REGEX REPLACE "${CMAKE_SHARED_LIBRARY_PREFIX}(.*)${CMAKE_SHARED_LIBRARY_SUFFIX}" "\\1" LUA_LIBRARY_NAME "${LUA_LIBRARY_NAME}")
+    list(APPEND pascal_flags )
+    list(APPEND pascal_flags "-Fl${LUA_LIBRARY_DIR}"
+                             "-k-L${LUA_LIBRARY_DIR}"
+                             "-XLAlua=${LUA_LIBRARY_NAME}")
+endif()
 
 #this command is a workaround to some inlining issues present in older FreePascal versions and fixed in 2.6
 if(FREEPASCAL_VERSION VERSION_LESS "2.6")
--- a/hedgewars/LuaPas.pas	Wed Jun 12 09:49:46 2013 +0200
+++ b/hedgewars/LuaPas.pas	Wed Jun 12 11:17:54 2013 +0200
@@ -14,8 +14,11 @@
 uses uConsts;
 {.$DEFINE LUA_GETHOOK}
 
-{$INCLUDE "config.inc"}
-const LuaLibName = cLuaLibrary;
+const LuaLibName = {$IFDEF LUA_INTERNAL}'libhwlua'{$ELSE}'liblua'{$ENDIF};
+
+{$IFNDEF WIN32}
+    {$linklib lua}
+{$ENDIF}
 
 type
     size_t   = Cardinal;
--- a/hedgewars/config.inc.in	Wed Jun 12 09:49:46 2013 +0200
+++ b/hedgewars/config.inc.in	Wed Jun 12 11:17:54 2013 +0200
@@ -25,5 +25,4 @@
       cVersionString = '${HEDGEWARS_VERSION}';
       cRevisionString = '${HEDGEWARS_REVISION}';
       cHashString = '${HEDGEWARS_HASH}';
-      cLuaLibrary = '${LUA_LIBRARY}';
       cDefaultPathPrefix = '${HEDGEWARS_FULL_DATADIR}/Data';
--- a/hedgewars/uScript.pas	Wed Jun 12 09:49:46 2013 +0200
+++ b/hedgewars/uScript.pas	Wed Jun 12 11:17:54 2013 +0200
@@ -55,10 +55,6 @@
 implementation
 {$IFDEF USE_LUA_SCRIPT}
 
-{$IFNDEF WIN32}
-    {$linklib lua}
-{$ENDIF}
-
 uses LuaPas,
     uConsole,
     uConsts,
--- a/misc/liblua/CMakeLists.txt	Wed Jun 12 09:49:46 2013 +0200
+++ b/misc/liblua/CMakeLists.txt	Wed Jun 12 11:17:54 2013 +0200
@@ -13,13 +13,14 @@
 
 set_target_properties(lua PROPERTIES
                           VERSION "5.1.4"
-                          SOVERSION 1)
+                          SOVERSION 1
+                          OUTPUT_NAME ${lua_output_name}))
 install(TARGETS lua RUNTIME DESTINATION ${target_binary_install_dir}
                     LIBRARY DESTINATION ${target_library_install_dir}
                     ARCHIVE DESTINATION ${target_library_install_dir})
 get_target_property(lua_fullpath lua LOCATION)
 
-set(LUA_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE STRING "" FORCE)
-set(LUA_LIBRARY ${lua_fullpath} CACHE STRING "" FORCE)
+set(LUA_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE STRING "Lua include dir" FORCE)
+set(LUA_LIBRARY ${lua_fullpath} CACHE STRING "Lua library" FORCE)