【问题标题】:Command line arguments to make for working in Linux and Windows用于在 Linux 和 Windows 中工作的命令行参数
【发布时间】:2012-05-27 05:08:10
【问题描述】:

我已经浏览了链接 Passing additional variables from command line to make.

我有一个使用 makefile 在 Linux 和 Windows 上编译的项目。在 Windows 中它使用 gcc,而在 Linux 中它使用 ARM 版本的gccarmv7-linux-gcc。 我想使用一个命令行变量来告诉 makefile 根据 Windows 或 Linux 使用哪个编译器。

例如在 Windows 中它应该是这样的:

CC= gcc  
CFLAGS= -c -D COMPILE_FOR_WINDOWS

对于 Linux:

CC =  armv7-linux-gcc  
CFLAGS = -c -D COMPILE_FOR_LINUX

这些预处理器定义 COMPILE_FOR_WINDOWS 和 COMPILE_FOR_LINUX 存在于代码库中,无法更改。

对于 make clean 它也应该为 Windows 和 Linux 清理。我不能假设我构建它的人会安装 Cygwin,所以不能使用 rm 删除文件。

【问题讨论】:

  • 由于标准make 中没有条件机制,因此您在makefile 中作为条件执行的任何操作都有些特定于平台。如果你不打算授权rm,大概你也不会授权GNU make,所以你只是让自己变得非常困难。为这两种配置考虑单独的 makefile 或 makefile 片段,因此您最终会运行 make -f makefile.unixmake -f makefile.win64 或其他任何东西。尽量减少差异,但您需要知道 Windows 支持什么。
  • 为了清楚,您使用的是哪个版本的 Make?
  • 也许你应该转向像 cmake 这样的 makefile 生成器?
  • 问题是什么?如果是关于 rm,因为您自己已经回答了其他所有问题。然后以同样的方式进行。 RM=rmRM=del

标签: windows linux makefile command-line-arguments


【解决方案1】:

也许您可以使用 ant(带有 build.xml 文件)来构建项目。 否则,在 Makefile 中,您需要检查系统并设置一些条件来检查您是在 Unix 环境还是 Windows 环境中制作项目。

【讨论】:

    【解决方案2】:

    此答案仅在您使用 GNU make 或类似产品时有效:

    使用环境变量有条件地设置您的 make 变量。

    为了使“干净”规则正常运行,您可能还必须为任一操作系统的文件扩展名的任何差异创建一个 make 变量。

    朴素的例子:

    ifeq ($(OS), Windows_NT)
      CC=gcc
      RM=del
      EXE=.exe
      CFLAGS=-c -DCOMPILE_FOR_WINDOWS
    else
      CC=armv7-linux-gcc
      RM=rm  
      EXE=
      CFLAGS=-c -DCOMPILE_FOR_LINUX
    endif
    
    PROG=thing$(EXE)
    
    .PHONY: all
    all: $(PROG)
            $(CC) $(CFLAGS) -o $(PROG) main.c
    
    .PHONY: clean
    clean:
            -$(RM) $(PROG) *.o
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 2012-05-12
      • 2018-11-15
      • 2017-11-06
      • 2012-03-11
      • 2016-09-09
      相关资源
      最近更新 更多