我有一个使用 scons 构建的大型 C++ 项目。它的构建速度很慢,我想进行一些更改以使其构建速度更快。现在我想集中时间加速构建中最慢的部分。
如何找出哪些文件的编译时间最长?
我有一个 scons 项目,强制包含多个头文件作为编译器标志。
# Forced include files passed directly to the compiler
env.Append(CCFLAGS = ['/FIinclude.h'])
Run Code Online (Sandbox Code Playgroud)
这些文件不包含在项目中的任何文件中。我需要为它们添加显式依赖项。
forced_include_headers = ['include.h']
# Trying to add an explicit dependency for each build target
for object in BUILD_TARGETS:
env.Depends(object, forced_include_headers)
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是BUILD_TARGETS列表是空的。它似乎只包含从COMMAND_LINE_TARGETSor传递的东西DEFAULT_TARGETS。我们项目中的所有目标都是隐式构建的。我们不使用env.Default等。有没有办法获取隐式目标列表,或者我是否必须手动构建它?我注意到它TARGETS是保留的,似乎也不包含我想要的内容。
我可以env.Depends(target, forced_include_headers)为所有目标在各自的 SConscript 文件中添加一个 ,但该项目相当大。
我的构建结构如下:
SConstruct
subdir/SConscript
subdir/module/__init__.py
Run Code Online (Sandbox Code Playgroud)
SConstructsubdir/SConscript作为子公司调用:
# SConstruct
SConscript('subdir/SConscript')
Run Code Online (Sandbox Code Playgroud)
subdir/SConscript进口module:
# subdir/SConscript
from module import foo
do SConsy stuff with foo()...
Run Code Online (Sandbox Code Playgroud)
这工作正常,直到我使用variant_dirwith subdir/SConscript:
# SConstruct
SConscript('subdir/SConscript', variant_dir='subdir/build', duplicate=0)
Run Code Online (Sandbox Code Playgroud)
问题是import失败,因为module不再位于路径中,该路径已被 更改variant_dir。
SCons 或 Python 是否有解决此问题的标准方法?我知道特殊site_scons目录,但看来该目录必须存在于 root 的顶层SConstruct,并且我想将subdir特定文件保留在subdir.
我有一个正在实例化一个对象的 sconstruct 脚本。该对象在内部调用一个方法而不是运行多处理模块。示例如下所示
该对象在调用函数之前会解封文件并将输入传递给多处理模块。
def run_scons(self,inpfile,outfile):
# Unpickle input parameter
fid=open(inpfile,'rb')
input_data=pkls.load(fid)
my_results=[]
#run solver in loop
for my_data in input_data:
work_ers=len(my_data)
pool = Pool(processes=work_ers)
a_result=pool.map_async(my_solver, my_data)
pool.close()
pool.join()
my_results.append(a_result.get())
fid.close()
fid_out=open(outfile,'wb+')
pkls.dump(rot_full_results,fid_out)
Run Code Online (Sandbox Code Playgroud)
通过 scons 执行相同的函数时出现以下错误。
pool = Pool(processes=work_ers)
File "C:\Python27\lib\multiprocessing\__init__.py", line 232, in Pool
return Pool(processes, initializer, initargs, maxtasksperchild)
File "C:\Python27\lib\multiprocessing\pool.py", line 138, in __init__
self._setup_queues()
File "C:\Python27\lib\multiprocessing\pool.py", line 232, in _setup_queues
from .queues import SimpleQueue
File "C:\Python27\lib\multiprocessing\queues.py", line 48, in <module>
from multiprocessing.synchronize import Lock, BoundedSemaphore, Semaphore, Condition …Run Code Online (Sandbox Code Playgroud) Scons版本是2.3.3。这是构建脚本的相关部分:
if not conf.CheckLib('portaudio'):
raise Exception(
'Did not find libportaudio.a, portaudio.lib, or the PortAudio-v19 development header files.')
Run Code Online (Sandbox Code Playgroud)
CheckLib 始终返回错误值。我该如何调试这个?我跟踪了 Scons 源代码,直到它尝试构建一个小型测试程序,但随后我无法进一步跟踪它。
我尝试了Scons 手册第 27 节中建议的所有故障排除标志,但没有一个产生任何额外的输出。例如,
C:\code\github\mixxx2>scons -Q --debug=findlibs winlib=%WINLIB_PATH% qtdir=%WINL
IB_PATH%\build\qt-everywhere-opensource-src-4.8.6 hss1394=1 mediafoundation=1 op
us=0 build=%BUILD_TYPE% machine=%TARGET_MACHINE% toolchain=msvs virtualize=0 tes
t=1 sqlitedll=0 mssdk_dir=%MSSDK_DIR% force32=1
Run Code Online (Sandbox Code Playgroud)
我不知道这个-Q选项有什么用。我尝试过省略它,但没有什么区别;我没有得到有关标准输出的更多信息。只是这个:
[...truncated...]
Checking for C library portaudio... no
ERROR:root:Unmet dependency: Did not find libportaudio.a, portaudio.lib, or the
PortAudio-v19 development header files.
Run Code Online (Sandbox Code Playgroud) 我想用它flake8来验证 scons 文件 ( SConstruct, SConscript)。因为scons隐式导入 SCons 模块,所以默认情况下可以使用一些名称,例如Program, Glob, Command。flake8 不知道它们并丢弃“未定义名称'Glob'[F821]”警告。
我该如何解决这个问题?
我在使用 scons 的项目中使用 CLion(仅支持 CMake)。
如何将 CMake 配置为不构建任何内容,只需运行带参数的 scons,以便 IDE 能够获取错误中的文件引用,并且我将能够轻松导航?
Edit1:
我尝试过add_custom_target(在评论中建议)这样的:
add_custom_target(game
ALL
scons p=linux bits=64
SOURCES
godot-cpp/godot_headers/android/godot_android.h
godot-cpp/godot_headers/arvr/godot_arvr.h
godot-cpp/godot_headers/gdnative/aabb.h
godot-cpp/godot_headers/gdnative/array.h
... all files from previously used add_executable (which worked with IDE)
)
Run Code Online (Sandbox Code Playgroud)
但是 IDE 找不到任何包含的文件,所以我猜我做错了什么。我也尝试COMMAND在 scons 和各种WORKING_DIRECTORY( ., src, without)之前添加,但没有成功。
我在scons中使用Command构建器指定需要调用特定脚本来生成特定文件.
我想只运行该脚本,因为该文件是先前生成的."命令"构建器的默认行为似乎是始终运行脚本.我怎么能改变这个?
这是我目前的SConstruct:
speed = Command('speed_analysis.tex','','python code/speed.py')
report = PDF(target = 'report.pdf', source = 'report.tex')
Depends(report, speed)
Run Code Online (Sandbox Code Playgroud) 我是SCons的新手,也使用pydev.有人可以帮我提供有关如何使用Eclipse和pydev调试scons脚本的说明吗?考虑到SCons是一个单独的应用程序而不是python的扩展这一事实是否可能?
我有一个库需要构建为我的目标的依赖项.该库随Makefile一起发布,除了运行之外,没有什么特别需要构建它:
make my_target
Run Code Online (Sandbox Code Playgroud)
如果我的文件看起来如下所示,我将如何将此命令作为我的SConstruct文件的一部分运行:
env = Environment()
flags = env.ParseFlags( CCFLAGS + LDFLAGS )
env.MergeFlags( flags )
env.Program( target = 'my_prog', source = SRC )
Run Code Online (Sandbox Code Playgroud)