【问题标题】:make error from Makefile generated from premake从 premake 生成的 Makefile 出错
【发布时间】:2021-12-07 07:01:12
【问题描述】:

我在尝试运行 make 时从控制台得到以下输出。

==== Building Project (debug) ====
process_begin: CreateProcess(NULL, echo Creating obj/Debug, ...) failed.
make (e=2): The system cannot find the file specified.
make[1]: *** [Project.make:90: obj/Debug] Error 2
make: *** [Makefile:30: Project] Error 2

makefile 是使用 premake 生成的,我没有使用 makefile 的经验。 make 文件如下所示:

# Alternative GNU Make workspace makefile autogenerated by Premake

ifndef config
  config=debug
endif

ifndef verbose
  SILENT = @
endif

ifeq ($(config),debug)
  Project_config = debug

else ifeq ($(config),release)
  Project_config = release

else
  $(error "invalid configuration $(config)")
endif

PROJECTS := Project

.PHONY: all clean help $(PROJECTS) 

all: $(PROJECTS)

Project:
ifneq (,$(Project_config))
    @echo "==== Building Project ($(Project_config)) ===="
    @${MAKE} --no-print-directory -C . -f Project.make config=$(Project_config)
endif

clean:
    @${MAKE} --no-print-directory -C . -f Project.make clean

help:
    @echo "Usage: make [config=name] [target]"
    @echo ""
    @echo "CONFIGURATIONS:"
    @echo "  debug"
    @echo "  release"
    @echo ""
    @echo "TARGETS:"
    @echo "   all (default)"
    @echo "   clean"
    @echo "   Project"
    @echo ""
    @echo "For more information, see https://github.com/premake/premake-core/wiki"

premake5.lua 文件是这样的:

workspace "Workspace"  
    configurations { "Debug", "Release" } 

project "Project" 
    kind "ConsoleApp"   
    language "C++"   
    targetdir "bin/%{cfg.buildcfg}" 
    files { "**.h", "**.cpp" } 
    filter "configurations:Debug"
        defines { "DEBUG" }  
        symbols "On" 
    filter "configurations:Release"  
        defines { "NDEBUG" }    
        optimize "On"

对可能出现的问题有任何想法吗? 提前致谢。

编辑:Project.make 文件如下所示:

# Alternative GNU Make project makefile autogenerated by Premake

ifndef config
  config=debug
endif

ifndef verbose
  SILENT = @
endif

.PHONY: clean prebuild

SHELLTYPE := posix
ifeq (.exe,$(findstring .exe,$(ComSpec)))
    SHELLTYPE := msdos
endif

# Configurations
# #############################################

RESCOMP = windres
INCLUDES +=
FORCE_INCLUDE +=
ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
LIBS +=
LDDEPS +=
LINKCMD = $(CXX) -o "$@" $(OBJECTS) $(RESOURCES) $(ALL_LDFLAGS) $(LIBS)
define PREBUILDCMDS
endef
define PRELINKCMDS
endef
define POSTBUILDCMDS
endef

ifeq ($(config),debug)
TARGETDIR = bin/Debug
TARGET = $(TARGETDIR)/Project.exe
OBJDIR = obj/Debug
DEFINES += -DDEBUG
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -g
ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CPPFLAGS) -g
ALL_LDFLAGS += $(LDFLAGS)

else ifeq ($(config),release)
TARGETDIR = bin/Release
TARGET = $(TARGETDIR)/Project.exe
OBJDIR = obj/Release
DEFINES += -DNDEBUG
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -O2
ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CPPFLAGS) -O2
ALL_LDFLAGS += $(LDFLAGS) -s

endif

# Per File Configurations
# #############################################


# File sets
# #############################################

GENERATED :=
OBJECTS :=

GENERATED += $(OBJDIR)/main.o
OBJECTS += $(OBJDIR)/main.o

# Rules
# #############################################

all: $(TARGET)
    @:

$(TARGET): $(GENERATED) $(OBJECTS) $(LDDEPS) | $(TARGETDIR)
    $(PRELINKCMDS)
    @echo Linking Project
    $(SILENT) $(LINKCMD)
    $(POSTBUILDCMDS)

$(TARGETDIR):
    @echo Creating $(TARGETDIR)
ifeq (posix,$(SHELLTYPE))
    $(SILENT) mkdir -p $(TARGETDIR)
else
    $(SILENT) mkdir $(subst /,\\,$(TARGETDIR))
endif

$(OBJDIR):
    @echo Creating $(OBJDIR)
ifeq (posix,$(SHELLTYPE))
    $(SILENT) mkdir -p $(OBJDIR)
else
    $(SILENT) mkdir $(subst /,\\,$(OBJDIR))
endif

clean:
    @echo Cleaning Project
ifeq (posix,$(SHELLTYPE))
    $(SILENT) rm -f  $(TARGET)
    $(SILENT) rm -rf $(GENERATED)
    $(SILENT) rm -rf $(OBJDIR)
else
    $(SILENT) if exist $(subst /,\\,$(TARGET)) del $(subst /,\\,$(TARGET))
    $(SILENT) if exist $(subst /,\\,$(GENERATED)) rmdir /s /q $(subst /,\\,$(GENERATED))
    $(SILENT) if exist $(subst /,\\,$(OBJDIR)) rmdir /s /q $(subst /,\\,$(OBJDIR))
endif

prebuild: | $(OBJDIR)
    $(PREBUILDCMDS)

ifneq (,$(PCH))
$(OBJECTS): $(GCH) | $(PCH_PLACEHOLDER)
$(GCH): $(PCH) | prebuild
    @echo $(notdir $<)
    $(SILENT) $(CXX) -x c++-header $(ALL_CXXFLAGS) -o "$@" -MF "$(@:%.gch=%.d)" -c "$<"
$(PCH_PLACEHOLDER): $(GCH) | $(OBJDIR)
ifeq (posix,$(SHELLTYPE))
    $(SILENT) touch "$@"
else
    $(SILENT) echo $null >> "$@"
endif
else
$(OBJECTS): | prebuild
endif


# File Rules
# #############################################

$(OBJDIR)/main.o: main.cpp
    @echo $(notdir $<)
    $(SILENT) $(CXX) $(ALL_CXXFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<"

-include $(OBJECTS:%.o=%.d)
ifneq (,$(PCH))
  -include $(PCH_PLACEHOLDER).d
endif

【问题讨论】:

  • 这个makefile似乎调用了工作目录中名为Project.make另一个 makefile。你有那个文件吗?
  • @Beta 是的。我编辑了我的帖子以包含它。
  • 这是mingw32-make吗?安装MSYS2,在其中安装常规(正常)make(使用pacman -S make)并改用它。
  • 生成的 makefile 显示 SHELLTYPE := posix 但错误消息 CreateProcess(…) 建议使用非 POSIX shell。在system 上尝试premake docs

标签: makefile gnu-make premake


【解决方案1】:

错误消息似乎与来自Project.make 的这条规则相关联...

$(OBJDIR):
    @echo Creating $(OBJDIR)
ifeq (posix,$(SHELLTYPE))
    $(SILENT) mkdir -p $(OBJDIR)
else
    $(SILENT) mkdir $(subst /,\\,$(OBJDIR))
endif

...我从诊断消息中 CreateProcess 的外观推断您正尝试在 Windows 上执行此构建。

问题是未能创建工作目录的子目录obj/Debug。有时,此类诊断会误导问题的具体性质,但这里有一些可能性:

  • 暗示规则的 Windows 分支似乎依赖于启用“命令扩展”,以便使用一个 mkdir 命令创建两个目录。它们默认启用,但可以全局禁用,也可以基于每个进程禁用。如果它们至少在您执行构建的cmd.exe 进程中被禁用,那么您描述的故障很可能是。在这种情况下,您可能可以通过手动创建 obj 目录来解决该特定问题,但您可能会遇到其他类似的问题。

  • 或者,您可能根本没有被授权在项目文件夹中写入。

【讨论】:

  • 嗨!我已确保启用了命令扩展。我也尝试将两个目录合并为一个,但它给我带来了同样的错误。我尝试使用管理员帐户运行 make,但它仍然给我同样的错误。
  • 看起来它由于某种原因未能通过 echo 命令。我自己创建了 obj/Debug 文件夹,它给我带来了同样的错误,但是“process_begin: CreateProcess(NULL, echo Linking Project, ...) failed.”
猜你喜欢
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多