From 1a64ba0fe5ed276b253d97d39ff6af2b0c850b19 Mon Sep 17 00:00:00 2001 From: ThePhD Date: Fri, 19 Jan 2018 15:03:22 -0500 Subject: [PATCH] Improve the docs, set up LuaJIT, and try to figure out why we can't build a DLL as an external projcet target with LuaJIT... --- .travis.yml | 44 ++- CMakeLists.txt | 59 ++- appveyor.yml | 8 +- cmake/Modules/LuaBuild.cmake | 21 +- cmake/Modules/LuaJITBuild.cmake | 348 +++++++++++++----- cmake/Modules/LuaVanillaBuild.cmake | 22 +- cmake/sol2-config.cmake.in | 10 +- docs/source/tutorial/all-the-things.rst | 304 ++++----------- docs/source/tutorial/getting-started.rst | 2 +- examples/CMakeLists.txt | 7 +- .../tutorials/quick_n_dirty/make_tables.cpp | 12 +- scripts/preparation.linux.sh | 2 +- scripts/run.linux.sh | 3 +- sol/optional_implementation.hpp | 10 +- sol/simple_usertype_metatable.hpp | 4 +- sol/stack_check.hpp | 2 +- sol/stack_get.hpp | 2 +- 17 files changed, 453 insertions(+), 407 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7dad9b94..6d168ed2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,69 +47,111 @@ matrix: - env: - LUA_VERSION=5.3.4 GCC_VERSION=4.9 + platform=x64 CI=true - env: - LUA_VERSION=5.3.4 GCC_VERSION=5 CI=true + platform=x64 - env: - LUA_VERSION=5.3.4 GCC_VERSION=6 + platform=x64 CI=true - env: - LUA_VERSION=5.3.4 GCC_VERSION=7 + platform=x64 CI=true # LLVM 3.6.x -> 5.0.x - env: - LUA_VERSION=5.3.4 LLVM_VERSION=3.6.2 + platform=x64 CI=true ALLOW_FAILURE=true - env: - LUA_VERSION=5.3.4 LLVM_VERSION=3.7.1 + platform=x64 CI=true ALLOW_FAILURE=true - env: - LUA_VERSION=5.3.4 LLVM_VERSION=3.8.1 + platform=x64 CI=true ALLOW_FAILURE=true - env: - LUA_VERSION=5.3.4 LLVM_VERSION=3.9.1 + platform=x64 CI=true ALLOW_FAILURE=true - env: - LUA_VERSION=5.3.4 LLVM_VERSION=4.0.1 + platform=x64 CI=true ALLOW_FAILURE=true - env: - LUA_VERSION=5.3.4 LLVM_VERSION=5.0.1 + platform=x64 CI=true ALLOW_FAILURE=true - # Lua Versions 5.2.4, 5.1.5, and maybe LuaJIT (as well as x86) + # Lua Versions 5.2.4, 5.1.5, and LuaJIT (as well as x86) - env: - LUA_VERSION=5.2.4 GCC_VERSION=7 + platform=x64 CI=true - env: - LUA_VERSION=5.1.5 GCC_VERSION=7 + platform=x64 + CI=true + + - env: + - LUA_VERSION=luajit-2.0.4 + GCC_VERSION=7 + platform=x64 + CI=true + + - env: + - LUA_VERSION=luajit-2.0.5 + GCC_VERSION=7 + platform=x64 + CI=true + + - env: + - LUA_VERSION=luajit-2.1.0-beta3 + GCC_VERSION=7 + platform=x64 + CI=true + + - env: + - LUA_VERSION=luajit-2.0.5 + GCC_VERSION=7 + platform=x86 + CI=true + + - env: + - LUA_VERSION=luajit-2.1.0-beta3 + GCC_VERSION=7 + platform=x86 CI=true notifications: diff --git a/CMakeLists.txt b/CMakeLists.txt index 0505ca19..366bc2b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,16 +60,15 @@ if (MSVC) endif() else() add_compile_options(-Wno-unknown-warning -Wno-unknown-warning-option -Wall -Wextra -Wpedantic -pedantic -pedantic-errors) - #if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - # set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lc++") - # add_compile_options("$<$,CXX>:-stdlib=libc++>") - #endif() endif() if (CI) - if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") - include_directories("$ENV{CLANG_PREFIX}/include/c++/v1") - endif() + #if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + # set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lc++") + # add_compile_options("$<$,CXX>:-stdlib=libc++>") + # LIST(APPEND CMAKE_LIBRARY_PATH_FLAG "$$ENV{CLANG_PREFIX}/lib") + # include_directories("$ENV{CLANG_PREFIX}/include/c++/v1") + #endif() endif() # # # General project output locations @@ -110,7 +109,7 @@ CMAKE_DEPENDENT_OPTION(TESTS_SINGLE "Enable build of tests using the generated s CMAKE_DEPENDENT_OPTION(EXAMPLES_SINGLE "Enable build of examples using the generated single headers" OFF "SINGLE;EXAMPLES" OFF) CMAKE_DEPENDENT_OPTION(TESTS_EXAMPLES "Enable build of examples as tests" ON - "TESTS;EXAMPLES" OFF) + "EXAMPLES" OFF) # # # sol2 Library @@ -161,6 +160,8 @@ source_group(headers FILES ${SOL2_SINGLE_HEADER_SOURCES}) # Find Python3 for single header / forward header generation find_package(PythonInterp 3) set(SOL2_SINGLE_HEADER_FOUND FALSE) +set(SOL2_SINGLE_FOUND FALSE) +set(SOL2_DOCS_FOUND FALSE) if (PYTHONINTERP_FOUND) if (SINGLE) set(SOL2_SINGLE_FOUND TRUE) @@ -185,20 +186,16 @@ if (PYTHONINTERP_FOUND) endif() else() if (SINGLE) - set(SOL2_SINGLE_FOUND FALSE) - message(STATUS "single_header cannot be generated as python 3 has not been found.") - endif() - if (DOCS) - set(SOL2_DOCS_FOUND FALSE) + message(STATUS "sol2 single_header cannot be generated as python 3 has not been found.") endif() endif() if (CI) - message(STATUS "Contiguous Integration is on") + message(STATUS "sol2 Contiguous Integration is on") endif() # # # Tests, Examples and other CI suites that come with sol2 -if (TESTS OR TESTS_SINGLE OR EXAMPLES OR TESTS_EXAMPLES) +if (TESTS OR TESTS_SINGLE OR TESTS_EXAMPLES OR EXAMPLES OR EXAMPLES_SINGLE) # # # Libraries # Here, we pull in all the necessary libraries for building examples and tests # Find threading library @@ -227,28 +224,30 @@ if (TESTS OR TESTS_SINGLE OR EXAMPLES OR TESTS_EXAMPLES) endif() if (NOT LUA_FOUND) - message(FATAL_ERROR "Lua ${LUA_VERSION} not found and could not be targeted for building.") + message(FATAL_ERROR "sol2 Lua \"${LUA_VERSION}\" not found and could not be targeted for building.") + endif() + + # # Enable test harness for regular, example or single tests + if (TESTS OR TESTS_SINGLE OR TESTS_EXAMPLES) + # enable ctest + message(STATUS "sol2 testing enabled") + enable_testing() + endif() + + # # # Examples + # # Enable examples to be built against the library + if (EXAMPLES OR TESTS_EXAMPLES OR EXAMPLES_SINGLE) + # NOTE: will also add to tests if TESTS is defined + message(STATUS "sol2 adding examples...") + add_subdirectory(examples "${CMAKE_BINARY_DIR}/examples") endif() # # # Tests - # # Enable test harness for regular or single tests - if (TESTS OR TESTS_SINGLE OR TESTS_EXAMPLES) - # enable ctest - message(STATUS "Testing enabled...") - enable_testing() - endif() # # Add tests here if (TESTS OR TESTS_SINGLE) # add subdir to get going - message(STATUS "Adding sol2 tests...") + message(STATUS "sol2 adding tests...") add_subdirectory(tests "${CMAKE_BINARY_DIR}/tests") endif() - # # # Examples - # # Enable examples to be built against the library - if (EXAMPLES OR TESTS_EXAMPLES) - # NOTE: will also add to tests if TESTS is defined - message(STATUS "Adding sol2 examples...") - add_subdirectory(examples "${CMAKE_BINARY_DIR}/examples") - endif() endif() diff --git a/appveyor.yml b/appveyor.yml index e409c9d4..968313db 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -49,9 +49,15 @@ environment: # LLVM_VERSION: 4.0.0 - LUA_VERSION: 5.3.4 MINGW_VERSION: 6.3.0 + - LUA_VERSION: luajit-2.0.5 + MINGW_VERSION: 6.3.0 + - LUA_VERSION: luajit-2.1.0-beta3 + MINGW_VERSION: 6.3.0 - LUA_VERSION: 5.3.4 - LUA_VERSION: 5.2.4 - LUA_VERSION: 5.1.5 + #- LUA_VERSION: luajit-2.0.5 + #- LUA_VERSION: luajit-2.1.0-beta3 matrix: allow_failures: @@ -72,8 +78,6 @@ matrix: - platform: x86 LLVM_VERSION: 4.0.0 # Get rid of x86 builds - - platform: x86 - image: Visual Studio 2015 - platform: x86 LUA_VERSION: 5.2.4 - platform: x86 diff --git a/cmake/Modules/LuaBuild.cmake b/cmake/Modules/LuaBuild.cmake index b903b688..06903701 100644 --- a/cmake/Modules/LuaBuild.cmake +++ b/cmake/Modules/LuaBuild.cmake @@ -25,11 +25,11 @@ string(TOLOWER ${LUA_VERSION} LUA_BUILD_NORMALIZED_LUA_VERSION) if (LUA_BUILD_NORMALIZED_LUA_VERSION MATCHES "luajit") set(LUA_BUILD_LIBNAME ${LUA_VERSION}) -elseif (LUAJIT_BUILD) +elseif (BUILD_LUAJIT) set(LUA_BUILD_LIBNAME luajit-${LUA_VERSION}) elseif (LUA_BUILD_NORMALIZED_LUA_VERSION MATCHES "lua") set(LUA_BUILD_LIBNAME ${LUA_VERSION}) -elseif (LUA_BUILD) +elseif (BUILD_LUA) set(LUA_BUILD_LIBNAME lua-${LUA_VERSION}) else() set(LUA_BUILD_LIBNAME lua-${LUA_VERSION}) @@ -50,20 +50,19 @@ endif() # # # Options -set(LUA_INCLUDE_DIR "${LUA_BUILD_INSTALL_DIR}/include" CACHE PATH "Directory with lua include files") -set(LUA_LIB_DIR "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}" CACHE PATH "Directory with lua library files") -set(LUA_BIN_DIR "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" CACHE PATH "Directory with lua executable and dynamic library files") option(BUILD_LUA_AS_DLL ${LUA_BUILD_BUILD_DLL_DEFAULT} "Build Lua or LuaJIT as a Shared/Dynamic Link Library") STRING(TOLOWER ${LUA_BUILD_LIBNAME} LUA_BUILD_NORMALIZED_LIBNAME) -if (LUA_BUILD_NORMALIZED_LIBNAME MATCHES "luajit") - set(LUA_LIBRARY luajit - CACHE STRING - ${LUA_BUILD_LIBRARY_DESCRIPTION}) +if (NOT LUA_LIBRARY_NAME) + if (LUA_BUILD_NORMALIZED_LIBNAME MATCHES "luajit") + set(LUA_LIBRARY luajit) + else() + set(LUA_LIBRARY ${LUA_BUILD_LIBNAME}) + endif() else() - set(LUA_LIBRARY ${LUA_BUILD_LIBNAME} + set(LUA_LIBRARY_NAME ${LUA_LIBRARY_NAME} CACHE STRING - ${LUA_BUILD_LIBRARY_DESCRIPTION}) + ${LUA_BUILD_LIBRARY_DESCRIPTION}) endif() # # Dependent Variables # If we're building a DLL, then set the library type to SHARED diff --git a/cmake/Modules/LuaJITBuild.cmake b/cmake/Modules/LuaJITBuild.cmake index a22c3cb2..48bf5b9b 100644 --- a/cmake/Modules/LuaJITBuild.cmake +++ b/cmake/Modules/LuaJITBuild.cmake @@ -23,67 +23,75 @@ # import necessary standard modules include(ExternalProject) +# protect from multiple inclusion +if(lua_jit_build_included) + return() +endif(lua_jit_build_included) +set(lua_jit_build_included true) + # Latest iterations for specific sub-versions of LuaJIT set(LUA_JIT_2.0_LATEST_VERSION 2.0.5) +set(LUA_JIT_${LUA_JIT_2.0_LATEST_VERSION}_COMMIT c88602f080dcafea6ba222a2f7cc1ea0e41ef3cc) set(LUA_JIT_2.1_LATEST_VERSION 2.1.0-beta3) +set(LUA_JIT_${LUA_JIT_2.1_LATEST_VERSION}_COMMIT 80aaaeee99d7f7b06c9e75ed3a457c49d86fc4db) # MD5 hashes taken off of LuaJIT's website # must be updated whenever a new version appears -set(LUA_JIT_MD5_2.1.0-beta3 eae40bc29d06ee5e3078f9444fcea39b) -set(LUA_JIT_MD5_2.1.0-beta3 58d0480e1af0811e7ecee45498d62e2d) -set(LUA_JIT_MD5_2.1.0-beta2 fa14598d0d775a7ffefb138a606e0d7b) -set(LUA_JIT_MD5_2.1.0-beta2 b5d943c0174ca217736e2ddc2d9721c3) -set(LUA_JIT_MD5_2.1.0-beta1 5a5bf71666e77cf6e7a1ae851127b834) -set(LUA_JIT_MD5_2.1.0-beta1 4b5c2c9aef0e7c0b622b09e7c84d566b) -set(LUA_JIT_MD5_2.0.5 48353202cbcacab84ee41a5a70ea0a2c) -set(LUA_JIT_MD5_2.0.5 f7cf52a049d74aee4e624bdc1160b80d) -set(LUA_JIT_MD5_2.0.4 dd9c38307f2223a504cbfb96e477eca0) -set(LUA_JIT_MD5_2.0.4 ed1f0caf3d390171f423f6f1b5c57aac) -set(LUA_JIT_MD5_2.0.3 f14e9104be513913810cd59c8c658dc0) -set(LUA_JIT_MD5_2.0.3 6c0f6958d5e1f67734fb1ff514ec4c84) -set(LUA_JIT_MD5_2.0.2 112dfb82548b03377fbefbba2e0e3a5b) -set(LUA_JIT_MD5_2.0.2 a57c7d1b8eaf46559303dcfd56404045) -set(LUA_JIT_MD5_2.0.1 85e406e8829602988eb1233a82e29f1f) -set(LUA_JIT_MD5_2.0.1 cf4aee0e40b220054ee3cffbe0cd6ed5) -set(LUA_JIT_MD5_2.0.0 97a2b87cc0490784f54b64cfb3b8f5ad) -set(LUA_JIT_MD5_2.0.0 467f4f531f7e08ee252f5030ecada7ed) -set(LUA_JIT_MD5_2.0.0-beta11 824aa2684a11e3cc3abe87350a7b6139) -set(LUA_JIT_MD5_2.0.0-beta11 8629401437048e477c94bd791b0a823a) -set(LUA_JIT_MD5_2.0.0-beta10 ed66689b96f7ad7bfeffe0b4ff2d63d4) -set(LUA_JIT_MD5_2.0.0-beta10 f6bbd472726b761b29438c4a06b5ab3c) -set(LUA_JIT_MD5_2.0.0-beta9 e7e03e67e2550817358bc28b44270c6d) -set(LUA_JIT_MD5_2.0.0-beta9 3f9ca0309f26e789c6c3246c83696f84) -set(LUA_JIT_MD5_2.0.0-beta8 f0748a73ae268d49b1d01f56c4fe3e61) -set(LUA_JIT_MD5_2.0.0-beta8 fb096a90c9e799c8922f32095ef3d93c) -set(LUA_JIT_MD5_2.0.0-beta7 b845dec15dd9eba2fd17d865601a52e5) -set(LUA_JIT_MD5_2.0.0-beta7 e10fc2b19de52d8770cdf24f1791dd77) -set(LUA_JIT_MD5_2.0.0-beta6 bfcbe2a11162cfa84d5a1693b442c8bf) -set(LUA_JIT_MD5_2.0.0-beta6 f64945c5ecaf3ea71a829fdbb5cb196c) -set(LUA_JIT_MD5_2.0.0-beta5 7e0dfa03a140148149a1021d4ffd5c57) -set(LUA_JIT_MD5_2.0.0-beta5 be8087fcb576c30ffbb6368ebc284498) -set(LUA_JIT_MD5_2.0.0-beta4 5c5a9305b3e06765e1dae138e1a95c3a) -set(LUA_JIT_MD5_2.0.0-beta4 d0b241be6207fa7d97b6afc41368e05f) -set(LUA_JIT_MD5_2.0.0-beta3 313b6f164e93e1bbac7bf87abb58d4a1) -set(LUA_JIT_MD5_2.0.0-beta3 bea9c7bcd5084f98830e31956f276ff6) -set(LUA_JIT_MD5_2.0.0-beta2 2ebcc38fa1d9756dc2e341f191701120) -set(LUA_JIT_MD5_2.0.0-beta2 94086f99f647d46a8360adeb11851d66) -set(LUA_JIT_MD5_2.0.0-beta1 9ed7646d03580a1cec4abeb74ca44843) -set(LUA_JIT_MD5_2.0.0-beta1 19d5bac616fa739343c7158d9d99a3f3) -set(LUA_JIT_MD5_1.1.8 ad0e319483fa235e3979537a748631e9) -set(LUA_JIT_MD5_1.1.8 92870c80f504c34c9b7547cd6c5562d0) -set(LUA_JIT_MD5_1.1.7 3aed0795f7c8725d3613269cd56f8e5a) -set(LUA_JIT_MD5_1.1.7 40a8dbc214306bb4b9849fcf026c4ee0) -set(LUA_JIT_MD5_1.1.6 1a1320e09d0cd5b793014556fb7d64c9) -set(LUA_JIT_MD5_1.1.6 350d7b9230637056fbd6158b95e8fa11) -set(LUA_JIT_MD5_1.1.5 b99d244ba4fc1979946ae1025368fc5c) -set(LUA_JIT_MD5_1.1.5 d3ffbae3bfcd5914b02dc00b1118a59d) -set(LUA_JIT_MD5_1.1.4 9fe29cfb8126bc9c4302701c06965f1c) -set(LUA_JIT_MD5_1.1.4 30d318e3287000ecf4c93b29e8783183) -set(LUA_JIT_MD5_1.1.3 f5db1a147ed3d34677ad1ef310c56da7) -set(LUA_JIT_MD5_1.1.3 5949e7bce9d97c37c282e1cbe85aa378) -set(LUA_JIT_MD5_1.1.2 4ae25ce7e3f301d1fcf0b713016edab0) -set(LUA_JIT_MD5_1.1.0 16d880a98a1ff6608ac1039c802233db) -set(LUA_JIT_MD5_1.0.3 d0a63d5394cca549889bd820a05b32d2) +set(LUA_JIT_MD5_2.1.0-beta3.tar.gz eae40bc29d06ee5e3078f9444fcea39b) +set(LUA_JIT_MD5_2.1.0-beta3.zip 58d0480e1af0811e7ecee45498d62e2d) +set(LUA_JIT_MD5_2.1.0-beta2.tar.gz fa14598d0d775a7ffefb138a606e0d7b) +set(LUA_JIT_MD5_2.1.0-beta2.zip b5d943c0174ca217736e2ddc2d9721c3) +set(LUA_JIT_MD5_2.1.0-beta1.tar.gz 5a5bf71666e77cf6e7a1ae851127b834) +set(LUA_JIT_MD5_2.1.0-beta1.zip 4b5c2c9aef0e7c0b622b09e7c84d566b) +set(LUA_JIT_MD5_2.0.5.tar.gz 48353202cbcacab84ee41a5a70ea0a2c) +set(LUA_JIT_MD5_2.0.5.zip f7cf52a049d74aee4e624bdc1160b80d) +set(LUA_JIT_MD5_2.0.4.tar.gz dd9c38307f2223a504cbfb96e477eca0) +set(LUA_JIT_MD5_2.0.4.zip ed1f0caf3d390171f423f6f1b5c57aac) +set(LUA_JIT_MD5_2.0.3.tar.gz f14e9104be513913810cd59c8c658dc0) +set(LUA_JIT_MD5_2.0.3.zip 6c0f6958d5e1f67734fb1ff514ec4c84) +set(LUA_JIT_MD5_2.0.2.tar.gz 112dfb82548b03377fbefbba2e0e3a5b) +set(LUA_JIT_MD5_2.0.2.zip a57c7d1b8eaf46559303dcfd56404045) +set(LUA_JIT_MD5_2.0.1.tar.gz 85e406e8829602988eb1233a82e29f1f) +set(LUA_JIT_MD5_2.0.1.zip cf4aee0e40b220054ee3cffbe0cd6ed5) +set(LUA_JIT_MD5_2.0.0.tar.gz 97a2b87cc0490784f54b64cfb3b8f5ad) +set(LUA_JIT_MD5_2.0.0.zip 467f4f531f7e08ee252f5030ecada7ed) +set(LUA_JIT_MD5_2.0.0-beta11.tar.gz 824aa2684a11e3cc3abe87350a7b6139) +set(LUA_JIT_MD5_2.0.0-beta11.zip 8629401437048e477c94bd791b0a823a) +set(LUA_JIT_MD5_2.0.0-beta10.tar.gz ed66689b96f7ad7bfeffe0b4ff2d63d4) +set(LUA_JIT_MD5_2.0.0-beta10.zip f6bbd472726b761b29438c4a06b5ab3c) +set(LUA_JIT_MD5_2.0.0-beta9.tar.gz e7e03e67e2550817358bc28b44270c6d) +set(LUA_JIT_MD5_2.0.0-beta9.zip 3f9ca0309f26e789c6c3246c83696f84) +set(LUA_JIT_MD5_2.0.0-beta8.tar.gz f0748a73ae268d49b1d01f56c4fe3e61) +set(LUA_JIT_MD5_2.0.0-beta8.zip fb096a90c9e799c8922f32095ef3d93c) +set(LUA_JIT_MD5_2.0.0-beta7.tar.gz b845dec15dd9eba2fd17d865601a52e5) +set(LUA_JIT_MD5_2.0.0-beta7.zip e10fc2b19de52d8770cdf24f1791dd77) +set(LUA_JIT_MD5_2.0.0-beta6.tar.gz bfcbe2a11162cfa84d5a1693b442c8bf) +set(LUA_JIT_MD5_2.0.0-beta6.zip f64945c5ecaf3ea71a829fdbb5cb196c) +set(LUA_JIT_MD5_2.0.0-beta5.tar.gz 7e0dfa03a140148149a1021d4ffd5c57) +set(LUA_JIT_MD5_2.0.0-beta5.zip be8087fcb576c30ffbb6368ebc284498) +set(LUA_JIT_MD5_2.0.0-beta4.tar.gz 5c5a9305b3e06765e1dae138e1a95c3a) +set(LUA_JIT_MD5_2.0.0-beta4.zip d0b241be6207fa7d97b6afc41368e05f) +set(LUA_JIT_MD5_2.0.0-beta3.tar.gz 313b6f164e93e1bbac7bf87abb58d4a1) +set(LUA_JIT_MD5_2.0.0-beta3.zip bea9c7bcd5084f98830e31956f276ff6) +set(LUA_JIT_MD5_2.0.0-beta2.tar.gz 2ebcc38fa1d9756dc2e341f191701120) +set(LUA_JIT_MD5_2.0.0-beta2.zip 94086f99f647d46a8360adeb11851d66) +set(LUA_JIT_MD5_2.0.0-beta1.tar.gz 9ed7646d03580a1cec4abeb74ca44843) +set(LUA_JIT_MD5_2.0.0-beta1.zip 19d5bac616fa739343c7158d9d99a3f3) +set(LUA_JIT_MD5_1.1.8.tar.gz ad0e319483fa235e3979537a748631e9) +set(LUA_JIT_MD5_1.1.8.zip 92870c80f504c34c9b7547cd6c5562d0) +set(LUA_JIT_MD5_1.1.7.tar.gz 3aed0795f7c8725d3613269cd56f8e5a) +set(LUA_JIT_MD5_1.1.7.zip 40a8dbc214306bb4b9849fcf026c4ee0) +set(LUA_JIT_MD5_1.1.6.tar.gz 1a1320e09d0cd5b793014556fb7d64c9) +set(LUA_JIT_MD5_1.1.6.zip 350d7b9230637056fbd6158b95e8fa11) +set(LUA_JIT_MD5_1.1.5.tar.gz b99d244ba4fc1979946ae1025368fc5c) +set(LUA_JIT_MD5_1.1.5.zip d3ffbae3bfcd5914b02dc00b1118a59d) +set(LUA_JIT_MD5_1.1.4.tar.gz 9fe29cfb8126bc9c4302701c06965f1c) +set(LUA_JIT_MD5_1.1.4.zip 30d318e3287000ecf4c93b29e8783183) +set(LUA_JIT_MD5_1.1.3.tar.gz f5db1a147ed3d34677ad1ef310c56da7) +set(LUA_JIT_MD5_1.1.3.zip 5949e7bce9d97c37c282e1cbe85aa378) +set(LUA_JIT_MD5_1.1.2.tar.gz 4ae25ce7e3f301d1fcf0b713016edab0) +set(LUA_JIT_MD5_1.1.0.tar.gz 16d880a98a1ff6608ac1039c802233db) +set(LUA_JIT_MD5_1.0.3.tar.gz d0a63d5394cca549889bd820a05b32d2) # Clean up some variables string(TOLOWER ${LUA_VERSION} LUA_JIT_NORMALIZED_LUA_VERSION) @@ -103,16 +111,24 @@ elseif (LUA_JIT_NORMALIZED_LUA_VERSION MATCHES "([0-9]+\\.[0-9]+)") # Just pick a default version and roll with it set(LUA_JIT_VERSION ${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.0) endif() +elseif (LUA_JIT_NORMALIZED_LUA_VERSION MATCHES "latest") + set(LUA_JIT_VERSION ${LUA_JIT_2.1_LATEST_VERSION}) else() - message(FATAL "Cannot deduce LuaJIT version from ${LUA_VERSION}") + MESSAGE(FATAL "Cannot deduce LuaJIT version from ${LUA_VERSION}") endif() -message(STATUS "Selecting LuaJIT ${LUA_JIT_VERSION}") +MESSAGE(STATUS "Selecting LuaJIT ${LUA_JIT_VERSION} from '${LUA_VERSION}' and building a ${LUA_BUILD_LIBRARY_TYPE} library...") # Get hashes for the build # LuaJIT unfortunately does not give us SHA1 hashes as well # set(LUA_JIT_SHA1 ${LUA_JIT_SHA1_${LUA_JIT_VERSION}}) -set(LUA_JIT_MD5 ${LUA_JIT_MD5_${LUA_JIT_VERSION}}) +if (WIN32) + set(LUA_JIT_MD5 ${LUA_JIT_MD5_${LUA_JIT_VERSION}.zip}) + set(LUA_JIT_DOWNLOAD_URI http://luajit.org/download/LuaJIT-${LUA_JIT_VERSION}.zip) +else() + set(LUA_JIT_MD5 ${LUA_JIT_MD5_${LUA_JIT_VERSION}.tar.gz}) + set(LUA_JIT_DOWNLOAD_URI http://luajit.org/download/LuaJIT-${LUA_JIT_VERSION}.tar.gz) +endif() if (LUA_JIT_MD5) set(LUA_JIT_DOWNLOAD_MD5_COMMAND URL_MD5 ${LUA_JIT_MD5}) @@ -125,61 +141,207 @@ else () set(LUA_JIT_DOWNLOAD_SHA1_COMMAND "") endif() +set(LUA_JIT_SOURCE_DIR "${LUA_BUILD_TOPLEVEL}/src") +set(LUA_JIT_INSTALL_DIR "${LUA_BUILD_TOPLEVEL}/install") +file(MAKE_DIRECTORY ${LUA_JIT_SOURCE_DIR}) +file(MAKE_DIRECTORY ${LUA_JIT_INSTALL_DIR}) + +set(LUA_JIT_LIB_FILENAME "${CMAKE_STATIC_LIBRARY_PREFIX}${LUA_BUILD_LIBNAME}${CMAKE_STATIC_LIBRARY_SUFFIX}") +set(LUA_JIT_IMP_LIB_FILENAME "${CMAKE_IMPORT_LIBRARY_PREFIX}${LUA_BUILD_LIBNAME}${CMAKE_IMPORT_LIBRARY_SUFFIX}") +set(LUA_JIT_LIB_EXP_FILENAME "${LUA_BUILD_LIBNAME}.exp") +set(LUA_JIT_DLL_FILENAME "${CMAKE_SHARED_LIBRARY_PREFIX}${LUA_BUILD_LIBNAME}${CMAKE_SHARED_LIBRARY_SUFFIX}") +set(LUA_JIT_EXE_FILENAME "${LUA_BUILD_LIBNAME}${CMAKE_EXECUTABLE_SUFFIX}") + +set(LUA_JIT_LIB_FILE "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${LUA_JIT_LIB_FILENAME}") +set(LUA_JIT_IMP_LIB_FILE "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${LUA_JIT_IMP_LIB_FILENAME}") +set(LUA_JIT_LIB_EXP_FILE "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${LUA_JIT_LIB_EXP_FILENAME}") +set(LUA_JIT_DLL_FILE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${LUA_JIT_DLL_FILENAME}") + # # # Do the build if (MSVC) # Visual C++ is predicated off running msvcbuild.bat # which requires a Visual Studio Command Prompt - + if (BUILD_LUA_AS_DLL) + set(LUA_JIT_BUILD_COMMAND cd src && msvcbuild.bat) + else() + set(LUA_JIT_BUILD_COMMAND cd src && msvcbuild.bat static) + endif() + set(LUA_JIT_PREBUILT_LIB "lua51.lib") + set(LUA_JIT_PREBUILT_IMP_LIB "lua51.lib") + set(LUA_JIT_PREBUILT_DLL "lua51.dll") + set(LUA_JIT_PREBUILT_EXP "lua51.exp") else () + # get the make command we need for this system + find_program(MAKE_PROGRAM NAMES make mingw32-make mingw64-make) + if (MAKE_PROGRAM MATCHES "MAKE_PROGRAM-NOTFOUND") + MESSAGE(FATAL_ERROR "Cannot find 'make' program or similar needed to build LuaJIT ${LUA_VERSION} (perhaps place it in the PATH environment variable if it is not already?)") + endif() + # we can simply reuse the makefile here # so define it as an external project and then just have the proper # build/install/test commands - - set(LUA_JIT_BUILD_COMMAND make) - set(LUA_JIT_INSTALL_COMMAND make install PREFIX=${LUA_LIB_DIR}) - set(LUA_JIT_TEST_COMMAND make test) - set(LUA_JIT_LIB_FILE "${LUA_LIB_DIR}/${LUA_LIBRARY}") - set(LUA_JIT_DLL_FILE "${LUA_BIN_DIR}/${LUA_DYNAMIC_LIBRARY}") + # make sure to apply -pagezero_size 10000 -image_base 100000000 + set(LUA_JIT_MAKE_BUILD_MODIFICATIONS "LUAJIT_T=${LUA_JIT_EXE_FILENAME}") + list(APPEND LUA_JIT_MAKE_BUILD_MODIFICATIONS "LUAJIT_A=${LUA_JIT_LIB_FILENAME}") if (BUILD_LUA_AS_DLL) - set(LUA_JIT_BYPRODUCTS ${LUA_JIT_LIB_FILE} ${LUA_JIT_DLL_FILE}) + list(APPEND LUA_JIT_MAKE_BUILD_MODIFICATIONS "LUAJIT_SO=${LUA_JIT_DLL_FILENAME}" "TARGET_SONAME=${LUA_JIT_DLL_FILENAME}" "TARGET_DYLIBNAME=${LUA_JIT_DLL_FILENAME}" "TARGET_DLLNAME=${LUA_JIT_DLL_FILENAME}") + list(APPEND LUA_JIT_MAKE_BUILD_MODIFICATIONS "BUILDMODE=dynamic") else() - set(LUA_JIT_BYPRODUCTS ${LUA_JIT_LIB_FILE}) + list(APPEND LUA_JIT_MAKE_BUILD_MODIFICATIONS "BUILDMODE=static") endif() + set(LUA_JIT_PREBUILT_DLL ${LUA_JIT_DLL_FILENAME}) + set(LUA_JIT_PREBUILT_LIB ${LUA_JIT_LIB_FILENAME}) + set(LUA_JIT_PREBUILT_IMP_LIB ${LUA_JIT_IMP_LIB_FILENAME}) + + if (WIN32) + list(APPEND LUA_JIT_MAKE_BUILD_MODIFICATIONS "HOST_SYS=Windows" "TARGET_SYS=Windows") + endif() + + set(LUA_JIT_BUILD_COMMAND BUILD_COMMAND "${MAKE_PROGRAM}" ${LUA_JIT_MAKE_BUILD_MODIFICATIONS}) +endif() + +set(lualib luajitlib_${LUA_JIT_VERSION}) + +file(TO_NATIVE_PATH "${LUA_JIT_SOURCE_DIR}/${LUA_JIT_PREBUILT_LIB}" LUA_JIT_SOURCE_LUA_LIB) +file(TO_NATIVE_PATH "${LUA_JIT_LIB_FILE}" LUA_JIT_DESTINATION_LUA_LIB) +file(TO_NATIVE_PATH "${LUA_JIT_SOURCE_DIR}/${LUA_JIT_PREBUILT_IMP_LIB}" LUA_JIT_SOURCE_LUA_IMP_LIB) +file(TO_NATIVE_PATH "${LUA_JIT_IMP_LIB_FILE}" LUA_JIT_DESTINATION_LUA_IMP_LIB) +file(TO_NATIVE_PATH "${LUA_JIT_SOURCE_DIR}/${LUA_JIT_PREBUILT_DLL}" LUA_JIT_SOURCE_LUA_DLL) +file(TO_NATIVE_PATH "${LUA_JIT_DLL_FILE}" LUA_JIT_DESTINATION_LUA_DLL) +file(TO_NATIVE_PATH "${LUA_JIT_SOURCE_DIR}/${LUA_JIT_PREBUILT_EXP}" LUA_JIT_SOURCE_LUA_LIB_EXP) +file(TO_NATIVE_PATH "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${LUA_JIT_LIB_EXP_FILENAME}" LUA_JIT_DESTINATION_LUA_LIB_EXP) + +if (WIN32 AND NOT MSVC) + string(COMPARE EQUAL ${LUA_JIT_VERSION} ${LUA_JIT_2.0_LATEST_VERSION} lua_jit_same_version_20) + string(COMPARE EQUAL ${LUA_JIT_VERSION} ${LUA_JIT_2.1_LATEST_VERSION} lua_jit_same_version_21) + if (lua_jit_same_version_20 OR lua_jit_same_version_21) + #set (LUA_JIT_GIT_COMMIT ${LUA_JIT_${LUA_JIT_VERSION}_COMMIT}) + #set(LUA_JIT_GIT_TAG GIT_TAG ${LUA_JIT_GIT_COMMIT}) + endif() +elseif(LUA_JIT_NORMALIZED_LUA_VERSION MATCHES "latest") + set(LUA_JIT_PULL_LATEST TRUE) +endif() + +if (LUA_JIT_GIT_COMMIT OR LUA_JIT_PULL_LATEST) + if (LUA_JIT_PULL_LATEST) + MESSAGE(STATUS "Latest LuaJIT has been requested: pulling from git...") + elseif (LUA_JIT_GIT_COMMIT) + MESSAGE(STATUS "LuaJIT '${LUA_VERSION}' requested has broken static library builds: using git '${LUA_JIT_GIT_COMMIT}'...") + endif() ExternalProject_Add(LUA_JIT BUILD_IN_SOURCE TRUE BUILD_ALWAYS TRUE # LuaJIT does not offer a TLS/SSL port - # TLS_VERIFY TRUE - PREFIX ${LUA_BUILD_TOPLEVEL} - SOURCE_DIR ${LUA_BUILD_TOPLEVEL} - DOWNLOAD_DIR ${LUA_BUILD_TOPLEVEL} + # TLS_VERIFY TRUE + PREFIX "${LUA_BUILD_TOPLEVEL}" + SOURCE_DIR "${LUA_BUILD_TOPLEVEL}" + DOWNLOAD_DIR "${LUA_BUILD_TOPLEVEL}" TMP_DIR "${LUA_BUILD_TOPLEVEL}-tmp" STAMP_DIR "${LUA_BUILD_TOPLEVEL}-stamp" INSTALL_DIR "${LUA_BUILD_INSTALL_DIR}" - URL http://luajit.org/download/LuaJIT-${LUA_JIT_VERSION}.tar.gz + GIT_REPOSITORY https://github.com/LuaJIT/LuaJIT.git + GIT_REMOTE_NAME origin + ${LUA_JIT_GIT_TAG} + GIT_SHALLOW TRUE + CONFIGURE_COMMAND "" + ${LUA_JIT_BUILD_COMMAND} + INSTALL_COMMAND "" + TEST_COMMAND "" + BUILD_BYPRODUCTS "${LUA_JIT_DESTINATION_LUA_LIB}" "${LUA_JIT_DESTINATION_LUA_LIB_EXP}" + "${LUA_JIT_DESTINATION_LUA_DLL}" "${LUA_JIT_DESTINATION_LUA_IMP_LIB}") +else() + ExternalProject_Add(LUA_JIT + BUILD_IN_SOURCE TRUE + BUILD_ALWAYS TRUE + # LuaJIT does not offer a TLS/SSL port + # TLS_VERIFY TRUE + PREFIX "${LUA_BUILD_TOPLEVEL}" + SOURCE_DIR "${LUA_BUILD_TOPLEVEL}" + DOWNLOAD_DIR "${LUA_BUILD_TOPLEVEL}" + TMP_DIR "${LUA_BUILD_TOPLEVEL}-tmp" + STAMP_DIR "${LUA_BUILD_TOPLEVEL}-stamp" + INSTALL_DIR "${LUA_BUILD_INSTALL_DIR}" + URL "${LUA_JIT_DOWNLOAD_URI}" ${LUA_JIT_DOWNLOAD_MD5_COMMAND} ${LUA_JIT_DOWNLOAD_SHA1_COMMAND} CONFIGURE_COMMAND "" - BUILD_COMMAND ${LUA_JIT_BUILD_COMMAND} - INSTALL_COMMAND ${LUA_JIT_INSTALL_COMMAND} - TEST_COMMAND ${LUA_JIT_TEST_COMMAND} - BUILD_BYPRODUCTS ${LUA_JIT_BYPRODUCTS}) - - # TODO: SHARED not fully supported yet, stock makefiles do not build - # dynamic libs on linux out of the box... - add_library(lualib_${LUA_JIT_VERSION} ${LUA_BUILD_LIBRARY_TYPE} IMPORTED) - set_target_properties(lualib_${LUA_JIT_VERSION} - PROPERTIES - LANGUAGE C - LINKER_LANGUAGE C - INCLUDE_DIRECTORIES ${LUA_INCLUDE_DIR} - IMPORTED_LOCATION ${LUA_JIT_LIB_FILE} - IMPORTED_SONAME ${LUA_JIT_DLL_FILE}) - - # make sure the library we export really does depend on Lua - add_dependencies(lualib_${LUA_JIT_VERSION} LUA_JIT) - - # set externally-visible target indicator - set(LUA_LIBRARIES lualib_${LUA_JIT_VERSION}) + ${LUA_JIT_BUILD_COMMAND} + INSTALL_COMMAND "" + TEST_COMMAND "" + BUILD_BYPRODUCTS "${LUA_JIT_DESTINATION_LUA_LIB}" "${LUA_JIT_DESTINATION_LUA_LIB_EXP}" + "${LUA_JIT_DESTINATION_LUA_DLL}" "${LUA_JIT_DESTINATION_LUA_IMP_LIB}") endif() + +# # Post-Build moving steps for necessary items +# Add post-step to move library afterwards +if (MSVC) + ExternalProject_Add_Step(LUA_JIT + postbuild.exp + DEPENDEES build + COMMENT "Libray - Moving \"${LUA_JIT_SOURCE_LUA_LIB_EXP}\" to \"${LUA_JIT_DESTINATION_LUA_LIB_EXP}\"..." + COMMAND "${CMAKE_COMMAND}" -E copy "${LUA_JIT_SOURCE_LUA_LIB_EXP}" "${LUA_JIT_DESTINATION_LUA_LIB_EXP}" && echo "Successfully moved!") +endif() +if (BUILD_LUA_AS_DLL) + if (MSVC) + MESSAGE(STATUS ${LUA_JIT_SOURCE_LUA_IMP_LIB}) + MESSAGE(STATUS ${LUA_JIT_DESTINATION_LUA_IMP_LIB}) + ExternalProject_Add_Step(LUA_JIT + postbuild.import.lib + DEPENDEES build + COMMENT "Libray - Moving \"${LUA_JIT_SOURCE_LUA_IMP_LIB}\" to \"${LUA_JIT_DESTINATION_LUA_IMP_LIB}\"..." + COMMAND "${CMAKE_COMMAND}" -E copy "${LUA_JIT_SOURCE_LUA_IMP_LIB}" "${LUA_JIT_DESTINATION_LUA_IMP_LIB}" + COMMAND echo "Successfully moved!") + endif() + MESSAGE(STATUS ${LUA_JIT_SOURCE_LUA_DLL}) + MESSAGE(STATUS ${LUA_JIT_DESTINATION_LUA_DLL}) + MESSAGE(STATUS ${LUA_JIT_DLL_FILE}) + ExternalProject_Add_Step(LUA_JIT + postbuild.dll + DEPENDEES build + COMMENT "Dynamic Library - Moving \"${LUA_JIT_SOURCE_LUA_DLL}\" to \"${LUA_JIT_DESTINATION_LUA_DLL}\"..." + COMMAND "${CMAKE_COMMAND}" -E copy "${LUA_JIT_SOURCE_LUA_DLL}" "${LUA_JIT_DESTINATION_LUA_DLL}" && echo "Successfully moved!") +else() + ExternalProject_Add_Step(LUA_JIT + postbuild.lib + DEPENDEES build + COMMENT "Library - Moving \"${LUA_JIT_SOURCE_LUA_LIB}\" to \"${LUA_JIT_DESTINATION_LUA_LIB}\"..." + COMMAND "${CMAKE_COMMAND}" -E copy "${LUA_JIT_SOURCE_LUA_LIB}" "${LUA_JIT_DESTINATION_LUA_LIB}" && echo "Successfully moved!") +endif() +# # TODO: +# Add additional post-build step to move all necessary headers/lua files +# for now, we just point directly to the `src` directory... + +add_library(${lualib} ${LUA_BUILD_LIBRARY_TYPE} IMPORTED) +# make sure the library we export really does depend on Lua JIT's external project +add_dependencies(${lualib} LUA_JIT) +if (BUILD_LUA_AS_DLL) + if (MSVC) + set_target_properties(${lualib} + PROPERTIES + IMPORTED_IMPLIB "${LUA_JIT_IMP_LIB_FILE}") + endif() + MESSAGE(STATUS "${LUA_JIT_DLL_FILE}") + MESSAGE(STATUS "${LUA_JIT_DESTINATION_LUA_DLL}") + set_target_properties(${lualib} + PROPERTIES + #IMPORTED_SONAME "${LUA_BUILD_LIBNAME}" + IMPORTED_LOCATION "${LUA_JIT_DLL_FILE}") +else () + set_target_properties(${lualib} + PROPERTIES + IMPORTED_LOCATION "${LUA_JIT_LIB_FILE}") +endif() +set_target_properties(${lualib} + PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES C + INTERFACE_INCLUDE_DIRECTORIES "${LUA_JIT_SOURCE_DIR}") +if (XCODE) + target_compile_options(${lualib} + PUBLIC -pagezero_size 10000 -image_base 100000000) +endif () + +# set externally-visible target indicator +set(LUA_LIBRARIES ${lualib}) +set(LUAJIT_FOUND TRUE) +set(LUA_FOUND TRUE) diff --git a/cmake/Modules/LuaVanillaBuild.cmake b/cmake/Modules/LuaVanillaBuild.cmake index 1c505415..03961578 100644 --- a/cmake/Modules/LuaVanillaBuild.cmake +++ b/cmake/Modules/LuaVanillaBuild.cmake @@ -23,6 +23,12 @@ # import necessary standard modules include(ExternalProject) +if(lua_build_included) + return() +endif(lua_build_included) +set(lua_build_included true) + + # Latest versions for specific sub-versions of Lua set(LUA_VANILLA_5.1_LATEST_VERSION 5.1.5) @@ -201,17 +207,10 @@ else() set(LUA_VANILLA_GENERATE_LUA_HPP false) endif() -if (BUILD_LUA_AS_DLL) - set(LUA_VANILLA_LUAC_SOURCES ${LUA_VANILLA_LUAC_SOURCES} ${LUA_VANILLA_LIB_SOURCES}) -endif() - set(LUA_VANILLA_SOURCE_DIR "${LUA_BUILD_TOPLEVEL}/src") prepend(LUA_VANILLA_LIB_SOURCES "${LUA_VANILLA_SOURCE_DIR}/" ${LUA_VANILLA_LIB_SOURCES}) prepend(LUA_VANILLA_LUA_SOURCES "${LUA_VANILLA_SOURCE_DIR}/" ${LUA_VANILLA_LUA_SOURCES}) prepend(LUA_VANILLA_LUAC_SOURCES "${LUA_VANILLA_SOURCE_DIR}/" ${LUA_VANILLA_LUAC_SOURCES}) -STRING(REGEX REPLACE "\\.c" ${LUA_BUILD_OBJECT_FILE_SUFFIX} LUA_VANILLA_LIB_OBJECTS ${LUA_VANILLA_LIB_SOURCES}) -STRING(REGEX REPLACE "\\.c" ${LUA_BUILD_OBJECT_FILE_SUFFIX} LUA_VANILLA_LUA_OBJECTS ${LUA_VANILLA_LUA_SOURCES}) -STRING(REGEX REPLACE "\\.c" ${LUA_BUILD_OBJECT_FILE_SUFFIX} LUA_VANILLA_LUAC_OBJECTS ${LUA_VANILLA_LUAC_SOURCES}) # download, just for the sake of download + extract # have to use 2 different commands just to have an empty command @@ -260,7 +259,7 @@ extern \"C\" { # after download, before build DEPENDEES download DEPENDERS build - BYPRODUCTS "${LUA_VANILLA_TARGET_LUA_HPP}" + BYPRODUCTS "${LUA_VANILLA_DESTINATION_LUA_HPP}" COMMENT "Moving \"${LUA_VANILLA_SOURCE_LUA_HPP}\" to \"${LUA_VANILLA_DESTINATION_LUA_HPP}\"..." COMMAND "${CMAKE_COMMAND}" -E copy "${LUA_VANILLA_SOURCE_LUA_HPP}" "${LUA_VANILLA_DESTINATION_LUA_HPP}") endif() @@ -288,9 +287,6 @@ set_target_properties(${liblua} C_EXTENSIONS TRUE POSITION_INDEPENDENT_CODE TRUE INCLUDE_DIRECTORIES ${LUA_VANILLA_SOURCE_DIR} - RUNTIME_OUTPUT_DIRECTORY ${LUA_BIN_DIR} - LIBRARY_OUTPUT_DIRECTORY ${LUA_BIN_DIR} - ARCHIVE_OUTPUT_DIRECTORY ${LUA_LIB_DIR} OUTPUT_NAME ${LUA_BUILD_LIBNAME} RUNTIME_OUTPUT_NAME ${LUA_BUILD_LIBNAME} LIBRARY_OUTPUT_NAME ${LUA_BUILD_LIBNAME} @@ -363,6 +359,10 @@ endif() # LuaC Compiler add_executable(${luacompiler} ${LUA_VANILLA_LUAC_SOURCES}) +if (BUILD_LUA_AS_DLL) + # TODO: figure out how to make DLL internal symbols for lua public so we don't have to do this + target_sources(${luacompiler} PRIVATE ${LUA_VANILLA_LIB_SOURCES}) +endif() set_target_properties(${luacompiler} PROPERTIES LANGUAGE C diff --git a/cmake/sol2-config.cmake.in b/cmake/sol2-config.cmake.in index 66a3c11e..667629fb 100644 --- a/cmake/sol2-config.cmake.in +++ b/cmake/sol2-config.cmake.in @@ -24,9 +24,15 @@ include("${CMAKE_CURRENT_LIST_DIR}/sol2-targets.cmake") -get_target_property( - SOL_INCLUDE_DIRS +MESSAGE(STATUS ${CMAKE_CURRENT_LIST_DIR}) + +get_target_property(SOL_INCLUDE_DIRS sol2 INTERFACE_INCLUDE_DIRECTORIES) +get_target_property(SOL_SINGLE_INCLUDE_DIRS + sol2_single INTERFACE_INCLUDE_DIRECTORIES) + set_and_check(SOL2_INCLUDE_DIRS "${SOL2_INCLUDE_DIRS}") +set_and_check(SOL2_INCLUDE_DIRS "${SOL2_SINGLE_INCLUDE_DIRS}") set(SOL2_LIBRARIES sol2) +set(SOL2_LIBRARIES_SINGLE sol2_single) diff --git a/docs/source/tutorial/all-the-things.rst b/docs/source/tutorial/all-the-things.rst index 60503d00..80914299 100644 --- a/docs/source/tutorial/all-the-things.rst +++ b/docs/source/tutorial/all-the-things.rst @@ -3,17 +3,26 @@ tutorial: quick 'n' dirty These are all the things. Use your browser's search to find things you want. -You'll need to ``#include ``/``#include "sol.hpp"`` somewhere in your code. Sol is header-only, so you don't need to compile anything. - .. note:: - After you learn the basics of sol, it is usually advised that if you think something can work, you should TRY IT. It will probably work! - + After you learn the basics of sol, it is usually advised that if you think something can work, you should TRY IT. It will probably work! .. note:: All of the code below is available at the `sol2 tutorial examples`_. +asserts / prerequisites +----------------------- + +You'll need to ``#include ``/``#include "sol.hpp"`` somewhere in your code. Sol is header-only, so you don't need to compile anything. However, **Lua must be compiled and available**. See the :doc:`getting started tutorial` for more details. + +The implementation for ``assert.hpp`` with ``c_assert`` looks like so: + +.. literalinclude:: ../../../examples/assert.hpp + :linenos: + +This is the assert used in the quick code below. + opening a state --------------- @@ -23,8 +32,8 @@ opening a state .. _sol-state-on-lua-state: -using sol2 on a lua_State* --------------------------- +using sol2 on a lua_State\* +--------------------------- For your system/game that already has Lua or uses an in-house or pre-rolled Lua system (LuaBridge, kaguya, Luwra, etc.), but you'd still like sol2 and nice things: @@ -32,6 +41,7 @@ For your system/game that already has Lua or uses an in-house or pre-rolled Lua .. literalinclude:: ../../../examples/tutorials/quick_n_dirty/opening_state_on_raw_lua.cpp :linenos: +.. _running-lua-code: running lua code ---------------- @@ -44,9 +54,23 @@ To run Lua code but have an error handler in case things go wrong: .. literalinclude:: ../../../examples/tutorials/quick_n_dirty/running_lua_code.cpp :linenos: - :lines: 28- + :lines: 28-40 +running lua code (low-level) +---------------------------- + +You can use the individual load and function call operator to load, check, and then subsequently run and check code. + +.. warning:: + + This is ONLY if you need some sort of fine-grained control: for 99% of cases, :ref:`running lua code` is preferred and avoids pitfalls in not understanding the difference between script/load and needing to run a chunk after loading it. + + +.. literalinclude:: ../../../examples/tutorials/quick_n_dirty/running_lua_code_low_level.cpp + :linenos: + :lines: 1-10, 16-41 + set and get variables --------------------- @@ -90,85 +114,32 @@ Note that if its a :doc:`userdata/usertype<../api/usertype>` for a C++ type, the tables ------ -:doc:`sol::state<../api/state>` is a table too. +Tables can be manipulated using accessor-syntax. Note that :doc:`sol::state<../api/state>` is a table and all the methods shown here work with ``sol::state``, too. -.. code-block:: cpp +.. literalinclude:: ../../../examples/tutorials/quick_n_dirty/tables_and_nesting.cpp + :linenos: + :lines: 1-34 - sol::state lua; - - // Raw string literal for easy multiline - lua.script( R"( - abc = { [0] = 24 } - def = { - ghi = { - bark = 50, - woof = abc - } - } - )" - ); - - sol::table abc = lua["abc"]; - sol::table def = lua["def"]; - sol::table ghi = lua["def"]["ghi"]; - - int bark1 = def["ghi"]["bark"]; - int bark2 = lua["def"]["ghi"]["bark"]; - // bark1 == bark2 == 50 - - int abcval1 = abc[0]; - int abcval2 = ghi["woof"][0]; - // abcval1 == abcval2 == 24 - -If you're going deep, be safe: - -.. code-block:: cpp - - sol::state lua; - - sol::optional will_not_error = lua["abc"]["DOESNOTEXIST"]["ghi"]; - // will_not_error == sol::nullopt - int also_will_not_error = lua["abc"]["def"]["ghi"]["jklm"].get_or(25); - // is 25 - - // if you don't go safe, - // will throw (or do at_panic if no exceptions) - int aaaahhh = lua["boom"]["the_dynamite"]; +If you're going deep, be safe: +.. literalinclude:: ../../../examples/tutorials/quick_n_dirty/tables_and_nesting.cpp + :linenos: + :lines: 35- make tables ----------- -Make some: +There are many ways to make a table. Here's an easy way for simple ones: -.. code-block:: cpp +.. literalinclude:: ../../../examples/tutorials/quick_n_dirty/make_tables.cpp + :linenos: + :lines: 1-21 - sol::state lua; +Equivalent Lua code, and check that they're equivalent: - lua["abc"] = lua.create_table_with( - 0, 24 - ); - - lua.create_named_table("def", - "ghi", lua.create_table_with( - "bark", 50, - // can reference other existing stuff too - "woof", lua["abc"] - ) - ); - -Equivalent Lua code: - -.. code-block:: lua - - abc = { [0] = 24 } - def = { - ghi = { - bark = 50, - woof = abc - } - } - +.. literalinclude:: ../../../examples/tutorials/quick_n_dirty/make_tables.cpp + :linenos: + :lines: 22- You can put anything you want in tables as values or keys, including strings, numbers, functions, other tables. @@ -178,190 +149,53 @@ Note that this idea that things can be nested is important and will help later w functions --------- -They're great. Use them: +They're easy to use, from Lua and from C++: -.. code-block:: cpp - - sol::state lua; +.. literalinclude:: ../../../examples/tutorials/quick_n_dirty/functions_easy.cpp + :linenos: + :lines: 1- - lua.script("function f (a, b, c, d) return 1 end"); - lua.script("function g (a, b) return a + b end"); - - // sol::function is often easier: - // takes a variable number/types of arguments... - sol::function fx = lua["f"]; - // fixed signature std::function<...> - // can be used to tie a sol::function down - std::function stdfx = fx; - - int is_one = stdfx(1, 34.5, 3, "bark"); - int is_also_one = fx(1, "boop", 3, "bark"); - - // call through operator[] - int is_three = lua["g"](1, 2); - // is_three == 3 - double is_4_8 = lua["g"](2.4, 2.4); - // is_4_8 == 4.8 - -If you need to protect against errors and parser problems and you're not ready to deal with Lua's `longjmp` problems (if you compiled with C), use :doc:`sol::protected_function<../api/protected_function>`. +If you need to protect against errors and parser problems and you're not ready to deal with Lua's ``longjmp`` problems (if you compiled with C), use :doc:`sol::protected_function<../api/protected_function>`. You can bind member variables as functions too, as well as all KINDS of function-like things: -.. code-block:: cpp - - void some_function () { - std::cout << "some function!" << std::endl; - } - - void some_other_function () { - std::cout << "some other function!" << std::endl; - } - - struct some_class { - int variable = 30; - - double member_function () { - return 24.5; - } - }; - - sol::state lua; - lua.open_libraries(sol::lib::base); - - // put an instance of "some_class" into lua - // (we'll go into more detail about this later - // just know here that it works and is - // put into lua as a userdata - lua.set("sc", some_class()); - - // binds a plain function - lua["f1"] = some_function; - lua.set_function("f2", &some_other_function); - - // binds just the member function - lua["m1"] = &some_class::member_function; - - // binds the class to the type - lua.set_function("m2", &some_class::member_function, some_class{}); - - // binds just the member variable as a function - lua["v1"] = &some_class::variable; - - // binds class with member variable as function - lua.set_function("v2", &some_class::variable, some_class{}); +.. literalinclude:: ../../../examples/tutorials/quick_n_dirty/functions_all.cpp + :linenos: + :lines: 1-50 The lua code to call these things is: -.. code-block:: lua +.. literalinclude:: ../../../examples/tutorials/quick_n_dirty/functions_all.cpp + :linenos: + :lines: 51- - f1() -- some function! - f2() -- some other function! - - -- need class instance if you don't bind it with the function - print(m1(sc)) -- 24.5 - -- does not need class instance: was bound to lua with one - print(m2()) -- 24.5 - - -- need class instance if you - -- don't bind it with the function - print(v1(sc)) -- 30 - -- does not need class instance: - -- it was bound with one - print(v2()) -- 30 - - -- can set, still - -- requires instance - v1(sc, 212) - -- can set, does not need - -- class instance: was bound with one - v2(254) - - print(v1(sc)) -- 212 - print(v2()) -- 254 - -Can use ``sol::readonly( &some_class::variable )`` to make a variable readonly and error if someone tries to write to it. +You can use ``sol::readonly( &some_class::variable )`` to make a variable readonly and error if someone tries to write to it. self call --------- -You can pass the 'self' argument through C++ to emulate 'member function' calls in Lua. - -.. code-block:: cpp - - sol::state lua; - - lua.open_libraries(sol::lib::base, sol::lib::package, sol::lib::table); - - // a small script using 'self' syntax - lua.script(R"( - some_table = { some_val = 100 } - - function some_table:add_to_some_val(value) - self.some_val = self.some_val + value - end - - function print_some_val() - print("some_table.some_val = " .. some_table.some_val) - end - )"); - - // do some printing - lua["print_some_val"](); - // 100 - - sol::table self = lua["some_table"]; - self["add_to_some_val"](self, 10); - lua["print_some_val"](); +You can pass the ``self`` argument through C++ to emulate 'member function' calls in Lua. +.. literalinclude:: ../../../examples/tutorials/quick_n_dirty/self_call.cpp + :linenos: + :lines: 1- multiple returns from lua ------------------------- -.. code-block:: cpp - - sol::state lua; - - lua.script("function f (a, b, c) return a, b, c end"); - - std::tuple result; - result = lua["f"](100, 200, 300); - // result == { 100, 200, 300 } - int a; - int b; - std::string c; - sol::tie( a, b, c ) = lua["f"](100, 200, "bark"); - // a == 100 - // b == 200 - // c == "bark" +.. literalinclude:: ../../../examples/tutorials/quick_n_dirty/multiple_returns_from_lua.cpp + :linenos: + :lines: 1- multiple returns to lua ----------------------- -.. code-block:: cpp - - sol::state lua; - - lua["f"] = [](int a, int b, sol::object c) { - // sol::object can be anything here: just pass it through - return std::make_tuple( a, b, c ); - }; - - std::tuple result = lua["f"](100, 200, 300); - // result == { 100, 200, 300 } - - std::tuple result2; - result2 = lua["f"](100, 200, "BARK BARK BARK!"); - // result2 == { 100, 200, "BARK BARK BARK!" } - - int a, b; - std::string c; - sol::tie( a, b, c ) = lua["f"](100, 200, "bark"); - // a == 100 - // b == 200 - // c == "bark" +.. literalinclude:: ../../../examples/tutorials/quick_n_dirty/multiple_returns_to_lua.cpp + :linenos: + :lines: 1- C++ classes from C++ diff --git a/docs/source/tutorial/getting-started.rst b/docs/source/tutorial/getting-started.rst index f5bd7cfd..570de472 100644 --- a/docs/source/tutorial/getting-started.rst +++ b/docs/source/tutorial/getting-started.rst @@ -36,7 +36,7 @@ Or using your favorite IDE / tool after setting up your include paths and librar .. note:: - If you get an avalanche of errors (particularly referring to ``auto``), you may not have enabled C++14 / C++17 mode for your compiler. Add one of ``std=c++14``, ``std=c++1z`` OR ``std=c++1y`` to your compiler options. By default, this is always-on for VC++ compilers in Visual Studio and friends, but g++ and clang++ require a flag (unless you're on `GCC 6.0`_). + If you get an avalanche of errors (particularly referring to ``auto``), you may not have enabled C++14 / C++17 mode for your compiler. Add one of ``std=c++14``, ``std=c++1z`` OR ``std=c++1y`` to your compiler options. By default, this is always-on for VC++ compilers in Visual Studio and friends, but g++ and clang++ require a flag (unless you're on `GCC 6.0`_ or better). If this works, you're ready to start! The first line creates the ``lua_State`` and will hold onto it for the duration of the scope its declared in (e.g., from the opening ``{`` to the closing ``}``). It will automatically close / cleanup that lua state when it gets destructed. diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 8c89c936..c1f9af6e 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -26,11 +26,6 @@ file(GLOB EXAMPLES_SRC *.cpp tutorials/quick_n_dirty/*.cpp) source_group(examples FILES ${EXAMPLES_SRC}) function (MAKE_EXAMPLE example_source_file is_single) - if (is_single) - set(header_files ${SOL2_SINGLE_HEADER_SOURCES}) - else() - set(header_files ${SOL2_HEADER_SOURCES}) - endif() get_filename_component(example_name ${example_source_file} NAME_WE) file(RELATIVE_PATH example_source_file_relative ${CMAKE_SOURCE_DIR} ${example_source_file}) get_filename_component(example_output_relative_dir ${example_source_file_relative} DIRECTORY) @@ -45,7 +40,7 @@ function (MAKE_EXAMPLE example_source_file is_single) set(example_output_name "${example_output_relative_dir_name}.${example_name}") endif() - add_executable(${example_name} ${example_source_file} ${header_files}) + add_executable(${example_name} ${example_source_file}) set_target_properties(${example_name} PROPERTIES OUTPUT_NAME "${example_output_name}") diff --git a/examples/tutorials/quick_n_dirty/make_tables.cpp b/examples/tutorials/quick_n_dirty/make_tables.cpp index a10d2218..0e902996 100644 --- a/examples/tutorials/quick_n_dirty/make_tables.cpp +++ b/examples/tutorials/quick_n_dirty/make_tables.cpp @@ -8,12 +8,16 @@ int main(int, char* []) { lua.open_libraries(sol::lib::base); lua["abc_sol2"] = lua.create_table_with( - 0, 24); + 0, 24 + ); + sol::table inner_table = lua.create_table_with("bark", 50, + // can reference other existing stuff too + "woof", lua["abc_sol2"] + ); lua.create_named_table("def_sol2", - "ghi", lua.create_table_with("bark", 50, - // can reference other existing stuff too - "woof", lua["abc"])); + "ghi", inner_table + ); std::string code = R"( abc = { [0] = 24 } diff --git a/scripts/preparation.linux.sh b/scripts/preparation.linux.sh index f9db82e5..4f4e4813 100644 --- a/scripts/preparation.linux.sh +++ b/scripts/preparation.linux.sh @@ -73,7 +73,7 @@ then apt-get -y install xz-utils clang wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-${LLVM_VERSION}-x86_64-linux-gnu-ubuntu-${download_version}.tar.xz -O ${LLVM_ARCHIVE_PATH} mkdir -p "${CLANG_PREFIX}" - tar xf "${LLVM_ARCHIVE_PATH}" -C "${CLANG_PREFIX}" --strip-components 1 + tar xf "${LLVM_ARCHIE_PATH}" -C "${CLANG_PREFIX}" --strip-components 1 # make sure a clang(++) of major/minor exists # use || true to ignore potential failures ln -s "clang-${major}.${minor}" "${CLANG_PREFIX}/bin/clang-${major}.${minor}" || true diff --git a/scripts/run.linux.sh b/scripts/run.linux.sh index af120269..d861997c 100644 --- a/scripts/run.linux.sh +++ b/scripts/run.linux.sh @@ -22,6 +22,8 @@ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# # This script runs the actual project + echo -en "travis_fold:start:build_preparation.1\r" if [ -z "${SOL2_DIR}" ] then @@ -48,7 +50,6 @@ echo -en "travis_fold:start:build_preparation.1\r" source ./sol2.compiler.vars fi - # This script runs the actual project mkdir -p Debug Release export build_type_cc=-DCMAKE_C_COMPILER\=${CC} diff --git a/sol/optional_implementation.hpp b/sol/optional_implementation.hpp index b0881693..147414fb 100644 --- a/sol/optional_implementation.hpp +++ b/sol/optional_implementation.hpp @@ -619,7 +619,7 @@ namespace sol { #ifdef SOL_NO_EXCEPTIONS // we can't abort here // because there's no constexpr abort - : *(T*)nullptr; + : *static_cast(nullptr); #else : (throw bad_optional_access("bad optional access"), contained_val()); #endif @@ -628,7 +628,7 @@ namespace sol { OPTIONAL_MUTABLE_CONSTEXPR T& value() & { return initialized() ? contained_val() #ifdef SOL_NO_EXCEPTIONS - : *(T*)nullptr; + : *static_cast(nullptr); #else : (throw bad_optional_access("bad optional access"), contained_val()); #endif @@ -639,7 +639,7 @@ namespace sol { #ifdef SOL_NO_EXCEPTIONS // we can't abort here // because there's no constexpr abort - : std::move(*(T*)nullptr); + : std::move(*static_cast(nullptr)); #else : (throw bad_optional_access("bad optional access"), contained_val()); #endif @@ -666,7 +666,7 @@ namespace sol { #ifdef SOL_NO_EXCEPTIONS // we can't abort here // because there's no constexpr abort - : *(T*)nullptr; + : *static_cast(nullptr); #else : (throw bad_optional_access("bad optional access"), contained_val()); #endif @@ -677,7 +677,7 @@ namespace sol { #ifdef SOL_NO_EXCEPTIONS // we can abort here // but the others are constexpr, so we can't... - : (std::abort(), *(T*)nullptr); + : (std::abort(), *static_cast(nullptr)); #else : (throw bad_optional_access("bad optional access"), contained_val()); #endif diff --git a/sol/simple_usertype_metatable.hpp b/sol/simple_usertype_metatable.hpp index 0cc78646..2a443c9d 100644 --- a/sol/simple_usertype_metatable.hpp +++ b/sol/simple_usertype_metatable.hpp @@ -326,8 +326,8 @@ namespace sol { static_assert(sizeof(void*) <= sizeof(detail::inheritance_check_function), "The size of this data pointer is too small to fit the inheritance checking function: Please file a bug report."); static_assert(sizeof(void*) <= sizeof(detail::inheritance_cast_function), "The size of this data pointer is too small to fit the inheritance checking function: Please file a bug report."); - baseclasscheck = (void*)&detail::inheritance::type_check; - baseclasscast = (void*)&detail::inheritance::type_cast; + baseclasscheck = reinterpret_cast(&detail::inheritance::type_check); + baseclasscast = reinterpret_cast(&detail::inheritance::type_cast); indexbaseclasspropogation = usertype_detail::walk_all_bases; newindexbaseclasspropogation = usertype_detail::walk_all_bases; } diff --git a/sol/stack_check.hpp b/sol/stack_check.hpp index 9ad0a739..deed4ba8 100644 --- a/sol/stack_check.hpp +++ b/sol/stack_check.hpp @@ -455,7 +455,7 @@ namespace stack { lua_rawget(L, metatableindex); if (type_of(L, -1) != type::lua_nil) { void* basecastdata = lua_touserdata(L, -1); - detail::inheritance_check_function ic = (detail::inheritance_check_function)basecastdata; + detail::inheritance_check_function ic = reinterpret_cast(basecastdata); success = ic(detail::id_for::value); } } diff --git a/sol/stack_get.hpp b/sol/stack_get.hpp index 4ad653bb..79fb988d 100644 --- a/sol/stack_get.hpp +++ b/sol/stack_get.hpp @@ -662,7 +662,7 @@ namespace stack { static T* get_no_lua_nil_from(lua_State* L, void* udata, int index, record&) { if (detail::has_derived::value && luaL_getmetafield(L, index, &detail::base_class_cast_key()[0]) != 0) { void* basecastdata = lua_touserdata(L, -1); - detail::inheritance_cast_function ic = (detail::inheritance_cast_function)basecastdata; + detail::inheritance_cast_function ic = reinterpret_cast(basecastdata); // use the casting function to properly adjust the pointer for the desired T udata = ic(udata, detail::id_for::value); lua_pop(L, 1);