Premake5 on Linux: Incorrect path for make include file

147 Views Asked by At

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.
1

There are 1 best solutions below

0
Goubermouche On

Solved it, although I built LLVM I forgot to actually install it... I'm gonna go cry in a corner.