I have a premake5.lua file which I use to build my projects. The system works correctly on Windows, but as soon as I try to run the generated Makefiles on Linux with sudo make I get errors related to include directories being incorrect. Note that I'm very new to Linux and I may be doing something obviously incorrect.
This is my premake5.lua file (shortened to only include the relevant parts):
local llvm_root = os.getenv("LLVM_ROOT")
print("LLVM_ROOT: " .. llvm_root)
workspace "sigma"
configurations { "Release" }
architecture "x64"
startproject "compiler"
project "compiler"
kind "ConsoleApp"
language "C++"
cppdialect "C++latest"
location "compiler"
includedirs
{
"compiler/source",
path.join(llvm_root, "include")
}
My file hierarchy looks like this:
dev
|- projects
| |- sigma
| |- premake5.lua
| |- compiler
| | |- Makefile
| |- Makefile
|- llvm-project
|- build
|- include
|- llvm
|- IR
|- the required files
...
Before running premake5 (from dev/projects/sigma/) I create the required environment variable:
export LLVM_ROOT=/home/goubermouche/dev/llvm-project/build/
I then run premake5:
sudo -E premake5 gmake
Which creates the necessary Makefiles and prints the correct environment variable value. The Makefiles look like this:
Makefile 1 (dev/projects/sigma/)
# GNU Make workspace makefile autogenerated by Premake
ifndef config
config=release
endif
ifndef verbose
SILENT = @
endif
ifeq ($(config),release)
compiler_config = release
endif
PROJECTS := compiler
.PHONY: all clean help $(PROJECTS)
all: $(PROJECTS)
compiler:
ifneq (,$(compiler_config))
@echo "==== Building compiler ($(compiler_config)) ===="
@${MAKE} --no-print-directory -C compiler -f Makefile config=$(compiler_config)
endif
clean:
@${MAKE} --no-print-directory -C compiler -f Makefile clean
help:
@echo "Usage: make [config=name] [target]"
@echo ""
@echo "CONFIGURATIONS:"
@echo " release"
@echo ""
@echo "TARGETS:"
@echo " all (default)"
@echo " clean"
@echo " compiler"
@echo ""
@echo "For more information, see https://github.com/premake/premake-core/wiki"
Makefile 2 (dev/project/sigma/compiler/), only the relevant section
# GNU Make project makefile autogenerated by Premake
ifndef config
config=release
endif
ifndef verbose
SILENT = @
endif
.PHONY: clean prebuild prelink
ifeq ($(config),release)
RESCOMP = windres
TARGETDIR = ../bin/Release/compiler
TARGET = $(TARGETDIR)/compiler
OBJDIR = ../bin-int/Release/compiler
DEFINES += -DNDEBUG
INCLUDES += -Isource -I../../../llvm-project/build/include
FORCE_INCLUDE +=
ALL_CPPFLAGS += $(CPPFLAGS) -MD -MP $(DEFINES) $(INCLUDES)
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m64 -O2 -Wall
ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CPPFLAGS) -m64 -O2 -Wall -std=c++20
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
LIBS += -lLLVMAArch64AsmParser.lib -lLLVMAArch64CodeGen.lib -lLLVMAArch64Desc.lib -lLLVMAArch64Disassembler.lib -lLLVMAArch64Info.lib -lLLVMAArch64Utils.lib -lLLVMAMDGPUAsmParser.lib -lLLVMAMDGPUCodeGen.lib -lLLVMAMDGPUDesc.lib -lLLVMAMDGPUDisassembler.lib -lLLVMAMDGPUInfo.lib -lLLVMAMDGPUTargetMCA.lib -lLLVMAMDGPUUtils.lib -lLLVMARMAsmParser.lib -lLLVMARMCodeGen.lib -lLLVMARMDesc.lib -lLLVMARMDisassembler.lib -lLLVMARMInfo.lib -lLLVMARMUtils.lib -lLLVMAVRAsmParser.lib -lLLVMAVRCodeGen.lib -lLLVMAVRDesc.lib -lLLVMAVRDisassembler.lib -lLLVMAVRInfo.lib -lLLVMAggressiveInstCombine.lib -lLLVMAnalysis.lib -lLLVMAsmParser.lib -lLLVMAsmPrinter.lib -lLLVMBPFAsmParser.lib -lLLVMBPFCodeGen.lib -lLLVMBPFDesc.lib -lLLVMBPFDisassembler.lib -lLLVMBPFInfo.lib -lLLVMBinaryFormat.lib -lLLVMBitReader.lib -lLLVMBitWriter.lib -lLLVMBitstreamReader.lib -lLLVMCFGuard.lib -lLLVMCodeGen.lib -lLLVMCore.lib -lLLVMCoroutines.lib -lLLVMCoverage.lib -lLLVMDWARFLinker.lib -lLLVMDWARFLinkerParallel.lib -lLLVMDWP.lib -lLLVMDebugInfoCodeView.lib -lLLVMDebugInfoDWARF.lib -lLLVMDebugInfoGSYM.lib -lLLVMDebugInfoLogicalView.lib -lLLVMDebugInfoMSF.lib -lLLVMDebugInfoPDB.lib -lLLVMDemangle.lib -lLLVMDlltoolDriver.lib -lLLVMExecutionEngine.lib -lLLVMExtensions.lib -lLLVMFileCheck.lib -lLLVMFrontendHLSL.lib -lLLVMFrontendOpenACC.lib -lLLVMFrontendOpenMP.lib -lLLVMFuzzMutate.lib -lLLVMFuzzerCLI.lib -lLLVMGlobalISel.lib -lLLVMHexagonAsmParser.lib -lLLVMHexagonCodeGen.lib -lLLVMHexagonDesc.lib -lLLVMHexagonDisassembler.lib -lLLVMHexagonInfo.lib -lLLVMIRPrinter.lib -lLLVMIRReader.lib -lLLVMInstCombine.lib -lLLVMInstrumentation.lib -lLLVMInterfaceStub.lib -lLLVMInterpreter.lib -lLLVMJITLink.lib -lLLVMLTO.lib -lLLVMLanaiAsmParser.lib -lLLVMLanaiCodeGen.lib -lLLVMLanaiDesc.lib -lLLVMLanaiDisassembler.lib -lLLVMLanaiInfo.lib -lLLVMLibDriver.lib -lLLVMLineEditor.lib -lLLVMLinker.lib -lLLVMLoongArchAsmParser.lib -lLLVMLoongArchCodeGen.lib -lLLVMLoongArchDesc.lib -lLLVMLoongArchDisassembler.lib -lLLVMLoongArchInfo.lib -lLLVMMC.lib -lLLVMMCA.lib -lLLVMMCDisassembler.lib -lLLVMMCJIT.lib -lLLVMMCParser.lib -lLLVMMIRParser.lib -lLLVMMSP430AsmParser.lib -lLLVMMSP430CodeGen.lib -lLLVMMSP430Desc.lib -lLLVMMSP430Disassembler.lib -lLLVMMSP430Info.lib -lLLVMMipsAsmParser.lib -lLLVMMipsCodeGen.lib -lLLVMMipsDesc.lib -lLLVMMipsDisassembler.lib -lLLVMMipsInfo.lib -lLLVMNVPTXCodeGen.lib -lLLVMNVPTXDesc.lib -lLLVMNVPTXInfo.lib -lLLVMObjCARCOpts.lib -lLLVMObjCopy.lib -lLLVMObject.lib -lLLVMObjectYAML.lib -lLLVMOption.lib -lLLVMOrcJIT.lib -lLLVMOrcShared.lib -lLLVMOrcTargetProcess.lib -lLLVMPasses.lib -lLLVMPowerPCAsmParser.lib -lLLVMPowerPCCodeGen.lib -lLLVMPowerPCDesc.lib -lLLVMPowerPCDisassembler.lib -lLLVMPowerPCInfo.lib -lLLVMProfileData.lib -lLLVMRISCVAsmParser.lib -lLLVMRISCVCodeGen.lib -lLLVMRISCVDesc.lib -lLLVMRISCVDisassembler.lib -lLLVMRISCVInfo.lib -lLLVMRISCVTargetMCA.lib -lLLVMRemarks.lib -lLLVMRuntimeDyld.lib -lLLVMScalarOpts.lib -lLLVMSelectionDAG.lib -lLLVMSparcAsmParser.lib -lLLVMSparcCodeGen.lib -lLLVMSparcDesc.lib -lLLVMSparcDisassembler.lib -lLLVMSparcInfo.lib -lLLVMSupport.lib -lLLVMSymbolize.lib -lLLVMSystemZAsmParser.lib -lLLVMSystemZCodeGen.lib -lLLVMSystemZDesc.lib -lLLVMSystemZDisassembler.lib -lLLVMSystemZInfo.lib -lLLVMTableGen.lib -lLLVMTarget.lib -lLLVMTargetParser.lib -lLLVMTextAPI.lib -lLLVMTransformUtils.lib -lLLVMVEAsmParser.lib -lLLVMVECodeGen.lib -lLLVMVEDesc.lib -lLLVMVEDisassembler.lib -lLLVMVEInfo.lib -lLLVMVectorize.lib -lLLVMWebAssemblyAsmParser.lib -lLLVMWebAssemblyCodeGen.lib -lLLVMWebAssemblyDesc.lib -lLLVMWebAssemblyDisassembler.lib -lLLVMWebAssemblyInfo.lib -lLLVMWebAssemblyUtils.lib -lLLVMWindowsDriver.lib -lLLVMWindowsManifest.lib -lLLVMX86AsmParser.lib -lLLVMX86CodeGen.lib -lLLVMX86Desc.lib -lLLVMX86Disassembler.lib -lLLVMX86Info.lib -lLLVMX86TargetMCA.lib -lLLVMXCoreCodeGen.lib -lLLVMXCoreDesc.lib -lLLVMXCoreDisassembler.lib -lLLVMXCoreInfo.lib -lLLVMXRay.lib -lLLVMipo.lib -ladvapi32.lib -lclangAPINotes.lib -lclangARCMigrate.lib -lclangAST.lib -lclangASTMatchers.lib -lclangAnalysis.lib -lclangAnalysisFlowSensitive.lib -lclangAnalysisFlowSensitiveModels.lib -lclangBasic.lib -lclangCodeGen.lib -lclangCrossTU.lib -lclangDependencyScanning.lib -lclangDirectoryWatcher.lib -lclangDriver.lib -lclangDynamicASTMatchers.lib -lclangEdit.lib -lclangExtractAPI.lib -lclangFormat.lib -lclangFrontend.lib -lclangFrontendTool.lib -lclangHandleCXX.lib -lclangHandleLLVM.lib -lclangIndex.lib -lclangIndexSerialization.lib -lclangInterpreter.lib -lclangLex.lib -lclangParse.lib -lclangRewrite.lib -lclangRewriteFrontend.lib -lclangSema.lib -lclangSerialization.lib -lclangStaticAnalyzerCheckers.lib -lclangStaticAnalyzerCore.lib -lclangStaticAnalyzerFrontend.lib -lclangSupport.lib -lclangTooling.lib -lclangToolingASTDiff.lib -lclangToolingCore.lib -lclangToolingInclusions.lib -lclangToolingInclusionsStdlib.lib -lclangToolingRefactoring.lib -lclangToolingSyntax.lib -lclangTransformer.lib -lcomdlg32.lib -ldelayimp.lib -lgdi32.lib -lkernel32.lib -lole32.lib -loleaut32.lib -lpsapi.lib -lshell32.lib -luser32.lib -luuid.lib -lversion.lib -lwinspool.lib
LDDEPS +=
ALL_LDFLAGS += $(LDFLAGS) -L../../../llvm-project/build/lib -L../../../llvm-project/build/Release/lib -L/usr/lib64 -m64 -s
LINKCMD = $(CXX) -o "$@" $(OBJECTS) $(RESOURCES) $(ALL_LDFLAGS) $(LIBS)
define PREBUILDCMDS
endef
define PRELINKCMDS
endef
define POSTBUILDCMDS
endef
all: prebuild prelink $(TARGET)
@:
After running premake5 I try to compile the projects with:
sudo make
Which results in the following error:
==== Building compiler (release) ====
main.cpp
In file included from source/utility/diagnostics/diagnostic.h:3,
from source/utility/diagnostics/error.h:2,
from source/lexer/lexer.h:3,
from source/parser/parser.h:2,
from source/code_generator/implementation/code_generator.h:3,
from source/compiler/compiler.h:3,
from main.cpp:1:
source/llvm_wrappers/type.h:2:10: fatal error: llvm/IR/IRBuilder.h: No such file or directory
2 | #include <llvm/IR/IRBuilder.h>
| ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
Solved it, although I built LLVM I forgot to actually install it... I'm gonna go cry in a corner.