什么力量正在努力保持狡猾的旧Make(有或没有makefile生成器工具)作为构建工具突出?是否存在替代方案的缺陷,使其无法被广泛采用,或者宣传不足,或者做些什么来使其保持到位?
尽管Make在处理大型项目方面存在许多缺点和困难(例如参见http://freshmeat.net/articles/what-is-wrong-with-make),但它似乎仍然比新的,改进的替代品(如Scons)更广泛地使用.Jam,Rake,Cook等.
这些替代方案是否有可衡量的收益,或者"市场份额"主要归功于团队领导者的意见和经验?
我正在使用google的cpplint.py来验证我的项目中的源代码是否符合Google C++ Style Guide中规定的标准.我们使用SCons进行构建,所以我想通过让SCons首先读取所有.h和.cc文件然后在它们上运行cpplint.py来自动化该过程,只有在它通过时才构建文件.问题如下:
我想在SCons中运行一个没有任何输入/输出文件的命令(实际上输入和输出是同一个文件).目前我只是使用subprocess.Popen手动运行它,但是有更多的SConsy方法吗?
我一直在寻找,看着,我无法找到我的问题的答案.我今晚刚刚开始学习scons,它看起来很棒!我虽然遇到了一点混乱.
为了便于开发,我经常喜欢让我的make文件构建我的目标,然后运行它以便我可以通过一次击键测试更改.这在make文件中非常简单:
run: $(exe)
chmod a+x $(exe)
$(exe)
Run Code Online (Sandbox Code Playgroud)
我已经发现我可以使用子进程这样做:
import subprocess import os.path
env = Environment();
result = env.Program(target = "FOO", source = "BAR");
location = os.path.abspath(result[0].name)
subprocess.call([location])
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案存在问题.就我的实验而言,scons不会等到你的程序在启动子进程调用之前完成构建,所以你最终运行旧的可执行文件,或者如果它是干净后的构建则出错.
我正在尝试设置SCons以遵循在构建期间自动生成的文件的依赖关系,并使用多线程构建正常工作.
我正在构建的项目是一个CIM提供程序,包括定义数据结构的MOF文件,来自MOF文件的自动生成的源文件和头文件,以及引用自动生成文件的手写源文件和头文件.为了使构建成功,自动生成步骤必须在编译任何手写文件之前运行完成,否则手写文件所依赖的标题将不存在并且将失败.自动生成步骤创建的.cpp文件也必须添加到源列表中并在最终构建中进行编译.
当运行单线程构建时,一切正常,因为自动生成步骤总是在编译步骤之前完成,因此生成的头文件就位.但是,在运行构建多线程时,它会尝试在自动生成步骤完成之前编译手写文件,并且构建失败.我已经指定了一个显式依赖项,但SCons没有遵循它.
这是我的SConscript文件的相关部分,我从cim_targets []中删除了单个文件名,因为列表非常长,但总而言之,cim_targets []是自动生成步骤的目标输出文件列表,provider_sources []是返回的autogen步骤完成后的源列表,sources []是手写源文件列表,GenProvider()是外部定义的Command构建器,用于执行自动生成步骤,SharedLibrary()是外部定义的构建器,它执行听起来像,使用带有一些扩展名的SCons库构建器
# Define directory paths for the CIM schema
cim_dir = 'cim-schema-2.26.0'
var_smis_dir = Dir('.').abspath # src/lib/XXX in variant
cim_sources = [
Glob(os.path.join(cim_dir, '*qualifiers*.mof')),
Glob(os.path.join(cim_dir, 'Core') + '/CIM_*.mof'),
Glob(os.path.join(cim_dir, 'Device') + '/CIM_*.mof'),
Glob(os.path.join(cim_dir, 'Event') + '/CIM_*.mof'),
Glob(os.path.join(cim_dir, 'XXXXXX') + '/XXX_*.mof'),
Glob(os.path.join(cim_dir, 'Interop') + '/CIM_*.mof'),
Glob(os.path.join(cim_dir, 'Physical') + '/CIM_*.mof'),
Glob(os.path.join(cim_dir, 'System') + '/CIM_*.mof'),
]
cim_sources_flat = []
for cim in cim_sources:
for src in cim:
cim_sources_flat.append(src)
cim_targets = [
......
]
sources = [ …Run Code Online (Sandbox Code Playgroud) 我需要按顺序运行两个程序作为自定义构建器的一部分.
其中一个是我坚持的程序,无法处理绝对/相对路径,因此我必须使用chdir=1Builder 的选项,以便其操作在与目标相同的目录中运行.
第二个是位于tools项目子目录中的脚本; SConstruct文件位于项目的根目录中.我需要创建一个操作来运行这个脚本,并且遇到了麻烦,因为我既没有项目的绝对路径,也没有从目标所在的目录返回到tools脚本所在子目录的相对路径.如果我能以某种方式获得我项目的根目录的绝对路径,我将全部设置,我可以连接`tools/myscript.bar'并完成它.
这就是我所拥有的,或多或少:
env['BUILDERS']['FooBar'] = Builder(action = [
'c:/bin/foo.exe ${SOURCE.filebase}',
'c:/bin/bar-interpreter.exe myscript.bar ${SOURCE.filebase}',
], chdir=1);
Run Code Online (Sandbox Code Playgroud)
问题是我需要更改有问题的操作,以便找到"myscript.bar",例如:
env['BUILDERS']['FooBar'] = Builder(action = [
'c:/bin/foo.exe ${SOURCE.filebase}',
'c:/bin/bar-interpreter.exe $PATHTOHERE/tools/myscript.bar ${SOURCE.filebase}',
], chdir=1);
Run Code Online (Sandbox Code Playgroud)
这似乎很简单,但我无法弄清楚如何.
我正在尝试让SCons创建一个共享库.进入的.so一个项目是.a静态库.
我有一句话:
env_2.SharedLibrary('libstuff.so', \
Split("""stuff.cxx mylib/libMine.a""")
Run Code Online (Sandbox Code Playgroud)
在运行它时,我收到此错误:
scons: *** Source file: mylib/libMine.a \
is static and is not compatible with shared target: libstuff.so
Run Code Online (Sandbox Code Playgroud)
但是,我知道共享库可以.a通过命令来制作,如:
g++ -m32 -shared -o libstuff.so stuff.o mylib/libMine.a
Run Code Online (Sandbox Code Playgroud)
任何关于让这个工作或任何变通方法的想法将不胜感激.
相关问题:如何让scons -shared在LINK命令行上添加一个额外的字符串进行Program()调用?如果我能做到这一点,我认为它会满足我的需求.
我有一个使用boost的C++项目.整个项目是使用scons + Visual Studio 2008构建的.我们已经安装了Visual Studio 2010,结果发现scons试图使用后来的编译器而不是旧编译器 - 并且无法构建项目作为boost和visual studio 2010 don还是非常喜欢彼此.我们想要压制这个并迫使scons使用2008版本.这可能吗?我们如何做到这一点?
我知道有一种方法可以让vim运行scons而不是make按下时:make.
我有一个选项可以做到这一点,~/.vimrc但我刚刚删除它并忘记了它是什么.
我是scons和Python的新手.我想知道是否有办法在python脚本中调用scons.
我的python脚本从用户接受一个目录列表,其中要编译的代码位于其中(除了执行其他一些非平凡的事情).它还生成一个字符串,用作scons创建的可执行文件的名称.
我想将这些信息从我的python脚本传递给scons,然后调用scons.有一个简单的方法吗?
我可以想到以下几种可能性:
subprocess.call("scons"...)我不确定scons是否接受我需要传递的所有信息作为命令行参数scons ×10
python ×3
build-tools ×1
c++ ×1
dependencies ×1
lint ×1
makefile ×1
portability ×1
static ×1
vim ×1