Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
151 changes: 138 additions & 13 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,17 @@ endif()

project(Luau LANGUAGES CXX C)

find_package(Git QUIET)
if(GIT_FOUND)
# Get the version from the latest git tag
execute_process(
COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=0
OUTPUT_VARIABLE GIT_VERSION
ERROR_QUIET
)
set(PROJECT_VERSION "${GIT_VERSION}")
endif()

if (LUAU_BUILD_SHARED)
add_library(Luau.Common SHARED)
add_library(Luau.CLI.lib SHARED)
Expand Down Expand Up @@ -69,75 +80,178 @@ if(LUAU_BUILD_CLI)
set_target_properties(Luau.Reduce.CLI PROPERTIES OUTPUT_NAME luau-reduce)
set_target_properties(Luau.Compile.CLI PROPERTIES OUTPUT_NAME luau-compile)
set_target_properties(Luau.Bytecode.CLI PROPERTIES OUTPUT_NAME luau-bytecode)

install(TARGETS Luau.Repl.CLI)
install(TARGETS Luau.Analyze.CLI)
install(TARGETS Luau.Ast.CLI)
install(TARGETS Luau.Reduce.CLI)
install(TARGETS Luau.Compile.CLI)
install(TARGETS Luau.Bytecode.CLI)
endif()

if(LUAU_BUILD_TESTS)
add_executable(Luau.UnitTest)
add_executable(Luau.Conformance)
add_executable(Luau.CLI.Test)

# The unit tests aren't `install`ed
endif()

if(LUAU_BUILD_WEB)
add_executable(Luau.Web)

# The web module isn't `install`ed - emscripten builds usually have custom
# packaging steps
endif()

# Proxy target to make it possible to depend on private VM headers
add_library(Luau.VM.Internals INTERFACE)

include(GNUInstallDirs)
include(Sources.cmake)

target_compile_features(Luau.Bytecode PUBLIC cxx_std_17)
target_include_directories(Luau.Bytecode PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Bytecode/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(Luau.Bytecode PUBLIC Luau.Common)
install(TARGETS Luau.Bytecode EXPORT LuauTargets)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Bytecode/include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h"
)

target_compile_features(Luau.Common PUBLIC cxx_std_17)
target_include_directories(Luau.Common PUBLIC Common/include)
target_include_directories(Luau.Common PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Common/include>
$<INSTALL_INTERFACE:include>
)
install(TARGETS Luau.Common EXPORT LuauTargets)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Common/include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h"
)

target_compile_features(Luau.CLI.lib PUBLIC cxx_std_17)
target_include_directories(Luau.CLI.lib PUBLIC CLI/include)
target_link_libraries(Luau.CLI.lib PRIVATE Luau.Common Luau.Config)
install(TARGETS Luau.CLI.lib EXPORT LuauTargets)
target_include_directories(Luau.CLI.lib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/CLI/include>
$<INSTALL_INTERFACE:include>
)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/CLI/include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h"
)

target_compile_features(Luau.Ast PUBLIC cxx_std_17)
target_include_directories(Luau.Ast PUBLIC Ast/include)
target_link_libraries(Luau.Ast PUBLIC Luau.Common)

target_compile_features(Luau.Bytecode PUBLIC cxx_std_17)
target_include_directories(Luau.Bytecode PUBLIC Bytecode/include)
target_link_libraries(Luau.Bytecode PUBLIC Luau.Common)

target_compile_features(Luau.Ast PUBLIC cxx_std_17)
target_include_directories(Luau.Ast PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Ast/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(Luau.Ast PUBLIC Luau.Common)
install(TARGETS Luau.Ast EXPORT LuauTargets)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Ast/include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h"
)

target_compile_features(Luau.Compiler PUBLIC cxx_std_17)
target_include_directories(Luau.Compiler PUBLIC Compiler/include)
target_include_directories(Luau.Compiler PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Compiler/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(Luau.Compiler PUBLIC Luau.Ast Luau.Bytecode)
install(TARGETS Luau.Compiler EXPORT LuauTargets)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Compiler/include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h"
)

target_compile_features(Luau.Config PUBLIC cxx_std_17)
target_include_directories(Luau.Config PUBLIC Config/include)
target_link_libraries(Luau.Config PUBLIC Luau.Ast)
target_include_directories(Luau.Config PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Config/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(Luau.Config PRIVATE Luau.Compiler Luau.VM)
target_link_libraries(Luau.Config PUBLIC Luau.Ast)
install(TARGETS Luau.Config EXPORT LuauTargets)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Config/include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h"
)

target_compile_features(Luau.Analysis PUBLIC cxx_std_17)
target_include_directories(Luau.Analysis PUBLIC Analysis/include)
target_include_directories(Luau.Analysis PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Analysis/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(Luau.Analysis PUBLIC Luau.Ast Luau.Config)
target_link_libraries(Luau.Analysis PRIVATE Luau.Compiler Luau.VM)
install(TARGETS Luau.Analysis EXPORT LuauTargets)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Analysis/include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h"
)

target_compile_features(Luau.CodeGen PRIVATE cxx_std_17)
target_include_directories(Luau.CodeGen PUBLIC CodeGen/include)
target_include_directories(Luau.CodeGen PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/CodeGen/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(Luau.CodeGen PRIVATE Luau.VM Luau.VM.Internals) # Code generation needs VM internals
target_link_libraries(Luau.CodeGen PUBLIC Luau.Common)
install(TARGETS Luau.CodeGen EXPORT LuauTargets)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/CodeGen/include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h"
)

target_compile_features(Luau.VM PRIVATE cxx_std_11)
target_include_directories(Luau.VM PUBLIC VM/include)
target_include_directories(Luau.VM PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/VM/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(Luau.VM PUBLIC Luau.Common)
install(TARGETS Luau.VM EXPORT LuauTargets)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/VM/include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h"
)

target_compile_features(Luau.Require PUBLIC cxx_std_17)
target_include_directories(Luau.Require PUBLIC Require/include)
target_include_directories(Luau.Require PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Require/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(Luau.Require PUBLIC Luau.Config Luau.VM)
install(TARGETS Luau.Require EXPORT LuauTargets)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Require/include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h"
)

target_include_directories(isocline PUBLIC extern/isocline/include)

target_include_directories(Luau.VM.Internals INTERFACE VM/src)
target_include_directories(Luau.VM.Internals INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/VM/src>
# no INSTALL_INTERFACE: the `Internals` target really only exists at compile-time
)
install(TARGETS Luau.VM.Internals EXPORT LuauTargets)

set(LUAU_OPTIONS)

if(MSVC)
list(APPEND LUAU_OPTIONS /D_CRT_SECURE_NO_WARNINGS) # We need to use the portable CRT functions.
list(APPEND LUAU_OPTIONS "/we4018") # Signed/unsigned mismatch
list(APPEND LUAU_OPTIONS "/we4388") # Also signed/unsigned mismatch
list(APPEND LUAU_OPTIONS "/utf-8")
else()
list(APPEND LUAU_OPTIONS -Wall) # All warnings
list(APPEND LUAU_OPTIONS -Wimplicit-fallthrough)
Expand Down Expand Up @@ -338,3 +452,14 @@ foreach(LIB Luau.Ast Luau.Compiler Luau.Config Luau.Analysis Luau.CodeGen Luau.V
endif()
endif()
endforeach()

# Installation target
cmake_path(APPEND libdir_for_pc_file "\${prefix}" "${CMAKE_INSTALL_LIBDIR}")
cmake_path(APPEND includedir_for_pc_file "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")

configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/tools/luau.pc.in"
"${CMAKE_CURRENT_BINARY_DIR}/luau.pc"
@ONLY
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/luau.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
9 changes: 9 additions & 0 deletions tools/luau.pc.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
prefix=@CMAKE_INSTALL_PREFIX@
libdir=@libdir_for_pc_file@
includedir=@includedir_for_pc_file@

Name: Luau
Description: A fast, small, safe, gradually typed embeddable scripting language derived from Lua
Version: @VERSION@
Cflags: -I${includedir}
Libs: -L${libdir} -lLuau.Require -lLuau.Bytecode -lLuau.Ast -lLuau.Compiler -lLuau.Common -lLuau.Config -lLuau.Analysis -lLuau.CodeGen -lLuau.VM
Loading