我正在尝试在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项目都应使用它(即,它不应该是全局的)。
答案 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)