2021-10-30 04:25:12 +08:00
|
|
|
# This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
2021-11-05 23:47:21 +08:00
|
|
|
.SUFFIXES:
|
2021-10-30 04:25:12 +08:00
|
|
|
MAKEFLAGS+=-r -j8
|
|
|
|
COMMA=,
|
|
|
|
|
|
|
|
config=debug
|
|
|
|
|
|
|
|
BUILD=build/$(config)
|
|
|
|
|
|
|
|
AST_SOURCES=$(wildcard Ast/src/*.cpp)
|
|
|
|
AST_OBJECTS=$(AST_SOURCES:%=$(BUILD)/%.o)
|
|
|
|
AST_TARGET=$(BUILD)/libluauast.a
|
|
|
|
|
|
|
|
COMPILER_SOURCES=$(wildcard Compiler/src/*.cpp)
|
|
|
|
COMPILER_OBJECTS=$(COMPILER_SOURCES:%=$(BUILD)/%.o)
|
|
|
|
COMPILER_TARGET=$(BUILD)/libluaucompiler.a
|
|
|
|
|
|
|
|
ANALYSIS_SOURCES=$(wildcard Analysis/src/*.cpp)
|
|
|
|
ANALYSIS_OBJECTS=$(ANALYSIS_SOURCES:%=$(BUILD)/%.o)
|
|
|
|
ANALYSIS_TARGET=$(BUILD)/libluauanalysis.a
|
|
|
|
|
2022-05-27 06:08:16 +08:00
|
|
|
CODEGEN_SOURCES=$(wildcard CodeGen/src/*.cpp)
|
|
|
|
CODEGEN_OBJECTS=$(CODEGEN_SOURCES:%=$(BUILD)/%.o)
|
|
|
|
CODEGEN_TARGET=$(BUILD)/libluaucodegen.a
|
|
|
|
|
2021-10-30 04:25:12 +08:00
|
|
|
VM_SOURCES=$(wildcard VM/src/*.cpp)
|
|
|
|
VM_OBJECTS=$(VM_SOURCES:%=$(BUILD)/%.o)
|
|
|
|
VM_TARGET=$(BUILD)/libluauvm.a
|
|
|
|
|
2022-02-05 00:45:57 +08:00
|
|
|
ISOCLINE_SOURCES=extern/isocline/src/isocline.c
|
|
|
|
ISOCLINE_OBJECTS=$(ISOCLINE_SOURCES:%=$(BUILD)/%.o)
|
|
|
|
ISOCLINE_TARGET=$(BUILD)/libisocline.a
|
|
|
|
|
2022-07-22 05:16:54 +08:00
|
|
|
TESTS_SOURCES=$(wildcard tests/*.cpp) CLI/FileUtils.cpp CLI/Flags.cpp CLI/Profiler.cpp CLI/Coverage.cpp CLI/Repl.cpp
|
2021-10-30 04:25:12 +08:00
|
|
|
TESTS_OBJECTS=$(TESTS_SOURCES:%=$(BUILD)/%.o)
|
|
|
|
TESTS_TARGET=$(BUILD)/luau-tests
|
|
|
|
|
2022-07-22 05:16:54 +08:00
|
|
|
REPL_CLI_SOURCES=CLI/FileUtils.cpp CLI/Flags.cpp CLI/Profiler.cpp CLI/Coverage.cpp CLI/Repl.cpp CLI/ReplEntry.cpp
|
2021-10-30 04:25:12 +08:00
|
|
|
REPL_CLI_OBJECTS=$(REPL_CLI_SOURCES:%=$(BUILD)/%.o)
|
|
|
|
REPL_CLI_TARGET=$(BUILD)/luau
|
|
|
|
|
2022-07-22 05:16:54 +08:00
|
|
|
ANALYZE_CLI_SOURCES=CLI/FileUtils.cpp CLI/Flags.cpp CLI/Analyze.cpp
|
2021-10-30 04:25:12 +08:00
|
|
|
ANALYZE_CLI_OBJECTS=$(ANALYZE_CLI_SOURCES:%=$(BUILD)/%.o)
|
|
|
|
ANALYZE_CLI_TARGET=$(BUILD)/luau-analyze
|
|
|
|
|
2021-12-03 14:41:04 +08:00
|
|
|
FUZZ_SOURCES=$(wildcard fuzz/*.cpp) fuzz/luau.pb.cpp
|
2021-10-30 04:25:12 +08:00
|
|
|
FUZZ_OBJECTS=$(FUZZ_SOURCES:%=$(BUILD)/%.o)
|
|
|
|
|
|
|
|
TESTS_ARGS=
|
|
|
|
ifneq ($(flags),)
|
|
|
|
TESTS_ARGS+=--fflags=$(flags)
|
|
|
|
endif
|
2022-07-15 06:52:26 +08:00
|
|
|
ifneq ($(opt),)
|
|
|
|
TESTS_ARGS+=-O$(opt)
|
|
|
|
endif
|
2021-10-30 04:25:12 +08:00
|
|
|
|
2022-05-27 06:08:16 +08:00
|
|
|
OBJECTS=$(AST_OBJECTS) $(COMPILER_OBJECTS) $(ANALYSIS_OBJECTS) $(CODEGEN_OBJECTS) $(VM_OBJECTS) $(ISOCLINE_OBJECTS) $(TESTS_OBJECTS) $(CLI_OBJECTS) $(FUZZ_OBJECTS)
|
2022-08-05 06:35:33 +08:00
|
|
|
EXECUTABLE_ALIASES = luau luau-analyze luau-tests
|
2021-10-30 04:25:12 +08:00
|
|
|
|
|
|
|
# common flags
|
2021-11-12 22:56:25 +08:00
|
|
|
CXXFLAGS=-g -Wall
|
2021-10-30 04:25:12 +08:00
|
|
|
LDFLAGS=
|
|
|
|
|
2021-11-12 22:56:25 +08:00
|
|
|
# some gcc versions treat var in `if (type var = val)` as unused
|
|
|
|
# some gcc versions treat variables used in constexpr if blocks as unused
|
2021-11-06 03:39:27 +08:00
|
|
|
ifeq ($(findstring g++,$(shell $(CXX) --version)),g++)
|
|
|
|
CXXFLAGS+=-Wno-unused
|
|
|
|
endif
|
2021-10-30 04:25:12 +08:00
|
|
|
|
2021-11-12 22:56:25 +08:00
|
|
|
# enabled in CI; we should be warning free on our main compiler versions but don't guarantee being warning free everywhere
|
|
|
|
ifneq ($(werror),)
|
|
|
|
CXXFLAGS+=-Werror
|
|
|
|
endif
|
|
|
|
|
2021-10-30 04:25:12 +08:00
|
|
|
# configuration-specific flags
|
|
|
|
ifeq ($(config),release)
|
|
|
|
CXXFLAGS+=-O2 -DNDEBUG
|
|
|
|
endif
|
|
|
|
|
|
|
|
ifeq ($(config),coverage)
|
|
|
|
CXXFLAGS+=-fprofile-instr-generate -fcoverage-mapping
|
|
|
|
LDFLAGS+=-fprofile-instr-generate
|
|
|
|
endif
|
|
|
|
|
|
|
|
ifeq ($(config),sanitize)
|
|
|
|
CXXFLAGS+=-fsanitize=address -O1
|
|
|
|
LDFLAGS+=-fsanitize=address
|
|
|
|
endif
|
|
|
|
|
|
|
|
ifeq ($(config),analyze)
|
|
|
|
CXXFLAGS+=--analyze
|
|
|
|
endif
|
|
|
|
|
|
|
|
ifeq ($(config),fuzz)
|
|
|
|
CXX=clang++ # our fuzzing infra relies on llvm fuzzer
|
2022-08-26 05:53:50 +08:00
|
|
|
CXXFLAGS+=-fsanitize=address,fuzzer -Ibuild/libprotobuf-mutator -O2
|
2021-10-30 04:25:12 +08:00
|
|
|
LDFLAGS+=-fsanitize=address,fuzzer
|
|
|
|
endif
|
|
|
|
|
2022-08-12 05:01:33 +08:00
|
|
|
ifeq ($(config),profile)
|
|
|
|
CXXFLAGS+=-O2 -DNDEBUG -gdwarf-4 -DCALLGRIND=1
|
2022-07-05 02:13:07 +08:00
|
|
|
endif
|
|
|
|
|
2021-10-30 04:25:12 +08:00
|
|
|
# target-specific flags
|
2022-05-27 06:08:16 +08:00
|
|
|
$(AST_OBJECTS): CXXFLAGS+=-std=c++17 -ICommon/include -IAst/include
|
|
|
|
$(COMPILER_OBJECTS): CXXFLAGS+=-std=c++17 -ICompiler/include -ICommon/include -IAst/include
|
|
|
|
$(ANALYSIS_OBJECTS): CXXFLAGS+=-std=c++17 -ICommon/include -IAst/include -IAnalysis/include
|
2022-09-24 03:17:25 +08:00
|
|
|
$(CODEGEN_OBJECTS): CXXFLAGS+=-std=c++17 -ICommon/include -ICodeGen/include -IVM/include -IVM/src # Code generation needs VM internals
|
2022-05-27 06:08:16 +08:00
|
|
|
$(VM_OBJECTS): CXXFLAGS+=-std=c++11 -ICommon/include -IVM/include
|
2022-02-05 00:45:57 +08:00
|
|
|
$(ISOCLINE_OBJECTS): CXXFLAGS+=-Wno-unused-function -Iextern/isocline/include
|
2022-07-15 06:52:26 +08:00
|
|
|
$(TESTS_OBJECTS): CXXFLAGS+=-std=c++17 -ICommon/include -IAst/include -ICompiler/include -IAnalysis/include -ICodeGen/include -IVM/include -ICLI -Iextern -DDOCTEST_CONFIG_DOUBLE_STRINGIFY
|
2022-05-27 06:08:16 +08:00
|
|
|
$(REPL_CLI_OBJECTS): CXXFLAGS+=-std=c++17 -ICommon/include -IAst/include -ICompiler/include -IVM/include -Iextern -Iextern/isocline/include
|
|
|
|
$(ANALYZE_CLI_OBJECTS): CXXFLAGS+=-std=c++17 -ICommon/include -IAst/include -IAnalysis/include -Iextern
|
|
|
|
$(FUZZ_OBJECTS): CXXFLAGS+=-std=c++17 -ICommon/include -IAst/include -ICompiler/include -IAnalysis/include -IVM/include
|
2021-10-30 04:25:12 +08:00
|
|
|
|
2022-01-28 07:46:05 +08:00
|
|
|
$(TESTS_TARGET): LDFLAGS+=-lpthread
|
2021-10-30 04:25:12 +08:00
|
|
|
$(REPL_CLI_TARGET): LDFLAGS+=-lpthread
|
2022-08-26 05:53:50 +08:00
|
|
|
fuzz-proto fuzz-prototest: LDFLAGS+=build/libprotobuf-mutator/src/libfuzzer/libprotobuf-mutator-libfuzzer.a build/libprotobuf-mutator/src/libprotobuf-mutator.a -lprotobuf
|
2021-10-30 04:25:12 +08:00
|
|
|
|
|
|
|
# pseudo targets
|
2022-07-22 05:16:54 +08:00
|
|
|
.PHONY: all test clean coverage format luau-size aliases
|
2021-10-30 04:25:12 +08:00
|
|
|
|
2022-07-22 05:16:54 +08:00
|
|
|
all: $(REPL_CLI_TARGET) $(ANALYZE_CLI_TARGET) $(TESTS_TARGET) aliases
|
|
|
|
|
2022-08-05 06:35:33 +08:00
|
|
|
aliases: $(EXECUTABLE_ALIASES)
|
2021-10-30 04:25:12 +08:00
|
|
|
|
|
|
|
test: $(TESTS_TARGET)
|
|
|
|
$(TESTS_TARGET) $(TESTS_ARGS)
|
|
|
|
|
|
|
|
clean:
|
|
|
|
rm -rf $(BUILD)
|
2022-08-05 06:35:33 +08:00
|
|
|
rm -rf $(EXECUTABLE_ALIASES)
|
2021-10-30 04:25:12 +08:00
|
|
|
|
|
|
|
coverage: $(TESTS_TARGET)
|
|
|
|
$(TESTS_TARGET) --fflags=true
|
|
|
|
mv default.profraw default-flags.profraw
|
|
|
|
$(TESTS_TARGET)
|
|
|
|
llvm-profdata merge default.profraw default-flags.profraw -o default.profdata
|
|
|
|
rm default.profraw default-flags.profraw
|
2022-02-05 00:45:57 +08:00
|
|
|
llvm-cov show -format=html -show-instantiations=false -show-line-counts=true -show-region-summary=false -ignore-filename-regex=\(tests\|extern\|CLI\)/.* -output-dir=coverage --instr-profile default.profdata build/coverage/luau-tests
|
|
|
|
llvm-cov report -ignore-filename-regex=\(tests\|extern\|CLI\)/.* -show-region-summary=false --instr-profile default.profdata build/coverage/luau-tests
|
|
|
|
llvm-cov export -ignore-filename-regex=\(tests\|extern\|CLI\)/.* -format lcov --instr-profile default.profdata build/coverage/luau-tests >coverage.info
|
2021-10-30 04:25:12 +08:00
|
|
|
|
|
|
|
format:
|
2022-09-09 06:14:25 +08:00
|
|
|
git ls-files '*.h' '*.cpp' | xargs clang-format-11 -i
|
2021-10-30 04:25:12 +08:00
|
|
|
|
|
|
|
luau-size: luau
|
|
|
|
nm --print-size --demangle luau | grep ' t void luau_execute<false>' | awk -F ' ' '{sum += strtonum("0x" $$2)} END {print sum " interpreter" }'
|
|
|
|
nm --print-size --demangle luau | grep ' t luauF_' | awk -F ' ' '{sum += strtonum("0x" $$2)} END {print sum " builtins" }'
|
|
|
|
|
2022-09-09 06:14:25 +08:00
|
|
|
check-source:
|
|
|
|
git ls-files '*.h' '*.cpp' | xargs -I+ sh -c 'grep -L LICENSE +'
|
|
|
|
git ls-files '*.h' ':!:extern' | xargs -I+ sh -c 'grep -L "#pragma once" +'
|
|
|
|
|
2021-10-30 04:25:12 +08:00
|
|
|
# executable target aliases
|
|
|
|
luau: $(REPL_CLI_TARGET)
|
2021-12-11 06:05:05 +08:00
|
|
|
ln -fs $^ $@
|
2021-10-30 04:25:12 +08:00
|
|
|
|
|
|
|
luau-analyze: $(ANALYZE_CLI_TARGET)
|
2021-12-11 06:05:05 +08:00
|
|
|
ln -fs $^ $@
|
2021-10-30 04:25:12 +08:00
|
|
|
|
2022-08-05 06:35:33 +08:00
|
|
|
luau-tests: $(TESTS_TARGET)
|
|
|
|
ln -fs $^ $@
|
|
|
|
|
2021-10-30 04:25:12 +08:00
|
|
|
# executable targets
|
2022-05-27 06:08:16 +08:00
|
|
|
$(TESTS_TARGET): $(TESTS_OBJECTS) $(ANALYSIS_TARGET) $(COMPILER_TARGET) $(AST_TARGET) $(CODEGEN_TARGET) $(VM_TARGET) $(ISOCLINE_TARGET)
|
2022-02-05 00:45:57 +08:00
|
|
|
$(REPL_CLI_TARGET): $(REPL_CLI_OBJECTS) $(COMPILER_TARGET) $(AST_TARGET) $(VM_TARGET) $(ISOCLINE_TARGET)
|
2021-10-30 04:25:12 +08:00
|
|
|
$(ANALYZE_CLI_TARGET): $(ANALYZE_CLI_OBJECTS) $(ANALYSIS_TARGET) $(AST_TARGET)
|
|
|
|
|
|
|
|
$(TESTS_TARGET) $(REPL_CLI_TARGET) $(ANALYZE_CLI_TARGET):
|
|
|
|
$(CXX) $^ $(LDFLAGS) -o $@
|
|
|
|
|
|
|
|
# executable targets for fuzzing
|
|
|
|
fuzz-%: $(BUILD)/fuzz/%.cpp.o $(ANALYSIS_TARGET) $(COMPILER_TARGET) $(AST_TARGET) $(VM_TARGET)
|
2021-11-12 22:27:34 +08:00
|
|
|
$(CXX) $^ $(LDFLAGS) -o $@
|
|
|
|
|
2021-10-30 04:25:12 +08:00
|
|
|
fuzz-proto: $(BUILD)/fuzz/proto.cpp.o $(BUILD)/fuzz/protoprint.cpp.o $(BUILD)/fuzz/luau.pb.cpp.o $(ANALYSIS_TARGET) $(COMPILER_TARGET) $(AST_TARGET) $(VM_TARGET) | build/libprotobuf-mutator
|
|
|
|
fuzz-prototest: $(BUILD)/fuzz/prototest.cpp.o $(BUILD)/fuzz/protoprint.cpp.o $(BUILD)/fuzz/luau.pb.cpp.o $(ANALYSIS_TARGET) $(COMPILER_TARGET) $(AST_TARGET) $(VM_TARGET) | build/libprotobuf-mutator
|
|
|
|
|
|
|
|
# static library targets
|
|
|
|
$(AST_TARGET): $(AST_OBJECTS)
|
|
|
|
$(COMPILER_TARGET): $(COMPILER_OBJECTS)
|
|
|
|
$(ANALYSIS_TARGET): $(ANALYSIS_OBJECTS)
|
2022-05-27 06:08:16 +08:00
|
|
|
$(CODEGEN_TARGET): $(CODEGEN_OBJECTS)
|
2021-10-30 04:25:12 +08:00
|
|
|
$(VM_TARGET): $(VM_OBJECTS)
|
2022-02-05 00:45:57 +08:00
|
|
|
$(ISOCLINE_TARGET): $(ISOCLINE_OBJECTS)
|
2021-10-30 04:25:12 +08:00
|
|
|
|
2022-05-27 06:08:16 +08:00
|
|
|
$(AST_TARGET) $(COMPILER_TARGET) $(ANALYSIS_TARGET) $(CODEGEN_TARGET) $(VM_TARGET) $(ISOCLINE_TARGET):
|
2021-10-30 04:25:12 +08:00
|
|
|
ar rcs $@ $^
|
|
|
|
|
|
|
|
# object file targets
|
|
|
|
$(BUILD)/%.cpp.o: %.cpp
|
|
|
|
@mkdir -p $(dir $@)
|
|
|
|
$(CXX) $< $(CXXFLAGS) -c -MMD -MP -o $@
|
|
|
|
|
2022-02-05 00:45:57 +08:00
|
|
|
$(BUILD)/%.c.o: %.c
|
|
|
|
@mkdir -p $(dir $@)
|
|
|
|
$(CXX) -x c $< $(CXXFLAGS) -c -MMD -MP -o $@
|
|
|
|
|
2021-10-30 04:25:12 +08:00
|
|
|
# protobuf fuzzer setup
|
|
|
|
fuzz/luau.pb.cpp: fuzz/luau.proto build/libprotobuf-mutator
|
2022-08-26 05:53:50 +08:00
|
|
|
cd fuzz && protoc luau.proto --cpp_out=.
|
2021-10-30 04:25:12 +08:00
|
|
|
mv fuzz/luau.pb.cc fuzz/luau.pb.cpp
|
|
|
|
|
2021-12-03 14:41:04 +08:00
|
|
|
$(BUILD)/fuzz/proto.cpp.o: fuzz/luau.pb.cpp
|
|
|
|
$(BUILD)/fuzz/protoprint.cpp.o: fuzz/luau.pb.cpp
|
2021-10-30 04:25:12 +08:00
|
|
|
|
|
|
|
build/libprotobuf-mutator:
|
|
|
|
git clone https://github.com/google/libprotobuf-mutator build/libprotobuf-mutator
|
2022-08-26 05:53:50 +08:00
|
|
|
CXX= cmake -S build/libprotobuf-mutator -B build/libprotobuf-mutator -D CMAKE_BUILD_TYPE=Release -D LIB_PROTO_MUTATOR_TESTING=OFF
|
2021-10-30 04:25:12 +08:00
|
|
|
make -C build/libprotobuf-mutator -j8
|
|
|
|
|
|
|
|
# picks up include dependencies for all object files
|
|
|
|
-include $(OBJECTS:.o=.d)
|