时间:2019-05-14 12:34:45

标签: python makefile options scons

我正在尝试在SConstruct中找到复制Makefile包含的最佳方法。我想出了一个解决方案,但是它很杂乱,取决于用户传递特定的命令行参数,并且肯定不是最佳选择。

我的文件结构是这样的:

Working_Dir/
   |-> includes/
   |    |-> filename.mk
   |    |-> filename.py
   |-> Makefile
   |-> main.c
   |-> SConstruct

这些是我文件的内容

Makefile

all: main.o
    echo "Version is: $(VERSION)"
    gcc $^ -o main

include includes/filename.mk

filename.mk

VERSION := "1.6.2"

%.o: %.c
    gcc -c -o $@ $<

SConstruct

import filename

env=Environment()
filename.Init(env)

#Create new builder
prog = Builder(action=["gcc $SOURCE -o $TARGET"])

#Add the builder
builder = { "Prog": prog}
env.Append(BUILDERS=builder)

print "Version is: " + env['VERSION']
env.Prog(target = "main", source = "main.o")

filename.py

from SCons.Script import *  # Needed so we can use scons stuff like builders

def Init(env):
    #Make builder
    obj = Builder(action="gcc -c -o $TARGET $SOURCE")

    #Add stuff
    env.Append(BUILDERS= {'Obj': obj})
    env.Append(VERSION= "1.6.2")

(忽略SCons具有其自己的Object builder的事实,这只是我从一个更大的项目中学到的简化示例)

要编译生成文件,我运行make并对其scons --site-dir="includes"进行编译,因为我包含的文件不在标准路径中。据我所知,site_dir选项是在scons as seen here中包含自己的代码/构建器的唯一方法。还要注意,SConscript文件不是我想要的,因为当您调用它们时,它们会在自己的目录中执行其指令,而不仅仅是将变量和构建器加载到调用程序中。

我希望它对用户来说可以只运行scons并且可以运行。我已经阅读了我可以在10.1.1节中全局设置这些设置到我的bash配置文件as seen here,但是我不想这样做,因为我不希望系统上的每个SCons项目默认使用此目录。我也看过SetOption()函数,但是它的功能有限,实际上根本不允许您设置此特定参数。

我唯一想到的解决方案是使用GetOption('site_dir')开始,如果它不是我期望的目录,我将使用所有相同的参数调用一个新的SCons调用,但是现在使用正确的{ {1}}选项。

但是,这感觉非常贫民窟,我觉得我缺少一个更好的解决方案。有更好的解决方案吗?

编辑:

之所以使用此“包含”目录而不是“ site_scons”目录,是因为在我较大的项目中,“包含”目录与该项目不在同一目录中,而是在一个完全不同的目录中(该目录的路径是已知的)。 site_dir将用于我依赖它的多个SCons项目,但并不是我机器上的每个SCons项目都应使用它(即,它不应该是全局的)。

1 个答案:

答案 0 :(得分:0)

我自己弄清楚了。我只是将文件作为普通的python模块加载,如顶部答案here所示。我特别使用了Python 2答案,因为似乎在我的系统上将SCons配置为使用python 2。

为此,我能够从计算机上的任何位置加载任何python文件,包括与scons相关的代码,这正是我想要的。

对于那些好奇的人,这是我需要添加的代码

file_path = "/path/to/my/file/filename.py"

import imp
extra_stuff = imp.load_source('filename', file_path)

env=Environment()
extra_stuff.Init(env)