Makefile make(windows)调用子nmake时出现意外行为

Makefile make(windows)调用子nmake时出现意外行为,makefile,nmake,multiple-makefiles,Makefile,Nmake,Multiple Makefiles,制作一个makefile来构建openssl for windows,我遇到了一些让我困惑的事情。我只想通过一个调用来构建它,为构建提供平台。有一个父makefile,它调用一个子make,并根据平台(linux、win32、win64、win64debug等)设置了一些参数 windows的子makefile部分如下所示: winConfig: patch.tmp cd $(BUILD_HOME)/openssl-$(VERSION) ; \ $(CHMOD) -R 777 *

制作一个makefile来构建openssl for windows,我遇到了一些让我困惑的事情。我只想通过一个调用来构建它,为构建提供平台。有一个父makefile,它调用一个子make,并根据平台(linux、win32、win64、win64debug等)设置了一些参数

windows的子makefile部分如下所示:

winConfig: patch.tmp
    cd $(BUILD_HOME)/openssl-$(VERSION) ; \
    $(CHMOD) -R 777 * ; \
    perl Configure $(PERL_CFG_TARGET) $(CFG_BASEOPTS) ; \
    [ $(CFG_BITS) = 32 ] && ms/do_ms.bat ; \
    [ $(CFG_BITS) = 64 ] && ms/do_win64a.bat
    $(TOUCH) cfg-win$(CFG_BITS)$(CFG_DEBUG).tmp cfg.tmp
    $(TOUCH) winConfig

winBuild: winConfig remakeDirs
    cd $(BUILD_HOME)/openssl-$(VERSION) ; \
    env -u MAKE -u MAKEFLAGS nmake -f ms/nt.mak install ; \
    $(CP) crypto/ec/ec_lcl.h crypto/ecdsa/ecs_locl.h $(OPENSSL_INSTALL_DIR)/include/openssl/
    $(TOUCH) winBuild

winPkg: winConfig winBuild
    $(RM) $(TARGET_HOME)/$(OPENSSL_TARBALL)
    $(TAR) -C $(OPENSSL_INSTALL_BASE) -cf $(TARGET_HOME)/$(OPENSSL_TARBALL) $(OPENSSL_INSTALL_TARGET)
    $(GZIP) -f $(TARGET_HOME)/$(OPENSSL_TARBALL)
    $(RM) $(OPENSSL_INSTALL_DIR)
    $(TOUCH) winPkg

## build and install for Windows:
all-win: winPkg
在顶部设置了许多变量,所有这些变量似乎都工作正常。这里有两个问题:

  • 在winbuild目标中,我收到关于找不到env的投诉,但是,除非我使用env命令处理它,否则nmake将不会运行。奇怪

  • 这是一个真正让我困惑的问题。nmake行似乎在后台运行。我这么说是因为,我在输出中找到了copy命令,紧接着是tar+gzip命令。。。而编译刚刚开始。生成的tarball在构建完成前大约10分钟创建,它只有安装文件夹的目录结构以及引用的两个文件

  • 我怎样才能让这个过程同步完成,而不必分别进行建筑和柏油

    编辑:更新了上面的示例生成文件

    致电:

    make -f openssl.mf win64
    
    其中openssl.mf包含:

    win64:
        make -j 1 -f openssl-sub.mf all-win CC=cl  CXX=cl  OUTPATH=out64  CFG_TARGET=VC-WIN64A 
    
    它继续在后台调用nmake,然后继续对一个相当空的目录进行tar。根本不是我想要完成的。我想让这个过程坐下来,直到nmake返回。。。可能吗

    错误输出:

    cd L:/dev/openssl/openssl-build/openssl-1.0.1l ; \
            env -u MAKE -u MAKEFLAGS nmake -f ms/nt.mak install ; \
            L:/wintools/cygwin/cp -f crypto/ec/ec_lcl.h crypto/ecdsa/ecs_locl.h L:/dev/openssl/openssl-install/win64-x86/include/openssl/
    
    Microsoft (R) Program Maintenance Utility Version 8.00.50727.762
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    Building OpenSSL
            perl util/mkdir-p.pl "tmp32"
    created directory `tmp32'
            perl util/mkdir-p.pl "out32"
    created directory `out32'
            perl util/mkdir-p.pl "inc32"
    created directory `inc32'
            perl util/mkdir-p.pl "inc32\openssl"
    L:/wintools/cygwin/touch winBuild
    created directory `inc32/openssl'
            perl util/copy.pl ".\.\e_os.h" "tmp32\e_os.h"
    Copying: ././e_os.h to tmp32/e_os.h
            perl util/copy.pl ".\crypto\cryptlib.h" "tmp32\cryptlib.h"
    Copying: ./crypto/cryptlib.h to tmp32/cryptlib.h
            perl util/copy.pl ".\crypto\buildinf.h" "tmp32\buildinf.h"
    Copying: ./crypto/buildinf.h to tmp32/buildinf.h
            perl util/copy.pl ".\crypto\md32_common.h" "tmp32\md32_common.h"
    Copying: ./crypto/md32_common.h to tmp32/md32_common.h
            perl util/copy.pl ".\crypto\o_time.h" "tmp32\o_time.h"
    
    Copying: ./crypto/o_time.h to tmp32/o_time.h
    L:/wintools/rm -rf /dev/openssl/packages/win64-x86-openssl-1.0.1l.tar
            perl util/copy.pl ".\crypto\o_str.h" "tmp32\o_str.h"
    L:/wintools/Gow/bin/tar.exe -C L:/dev/openssl/openssl-install -cf /dev/openssl/packages/win64-x86-openssl-1.0.1l.tar win64-x86
    Copying: ./crypto/o_str.h to tmp32/o_str.h
            perl util/copy.pl ".\crypto\o_dir.h" "tmp32\o_dir.h"
    Copying: ./crypto/o_dir.h to tmp32/o_dir.h
            perl util/copy.pl ".\crypto\constant_time_locl.h" "tmp32\constant_time_locl.h"
    Copying: ./crypto/constant_time_locl.h to tmp32/constant_time_locl.h
            perl util/copy.pl ".\crypto\md4\md4_locl.h" "tmp32\md4_locl.h"
    L:/wintools/cygwin/gzip -f /dev/openssl/packages/win64-x86-openssl-1.0.1l.tar
    Copying: ./crypto/md4/md4_locl.h to tmp32/md4_locl.h
            perl util/copy.pl ".\crypto\md5\md5_locl.h" "tmp32\md5_locl.h"
    Copying: ./crypto/md5/md5_locl.h to tmp32/md5_locl.h
            perl util/copy.pl ".\crypto\sha\sha_locl.h" "tmp32\sha_locl.h"
    gzip: /dev/openssl/packages/win64-x86-openssl-1.0.1l.tar: No such file or directory
    make[1]: *** [winPkg] Error 1
    make[1]: Leaving directory `L:/dev/openssl'
    make: *** [win64] Error 2
    

    您可以看到,在底部,winPkg中的tar命令在winbuild完成之前已经发出。

    关于
    env
    您到底遇到了哪些错误?如果您尝试运行
    nmake
    而不在那里使用
    env
    会发生什么情况?您如何运行顶级
    make
    命令?您是否在使用
    -j
    ?如果你的目标依赖于先完成的其他目标才能正确运作,为什么你的目标不将彼此列为先决条件?嗨,伊坦,我已经编辑了原始问题。请注意,找不到“env”的错误已消失。。。我不知道为什么。我不知道我是否一定会相信输出顺序。你能在tar和nmake之前粘贴
    回显“tar$(date)”
    (等)命令并查看它们的输出吗?但是。。。。难道命令不应该像shell脚本一样按顺序执行,并且一个目标在另一个开始之前完成吗?