标签: scons

如何测量 scons 构建的每个组件的构建时间?

我有一个使用 scons 构建的大型 C++ 项目。它的构建速度很慢,我想进行一些更改以使其构建速度更快。现在我想集中时间加速构建中最慢的部分。

如何找出哪些文件的编译时间最长?

timing scons

5
推荐指数
1
解决办法
1226
查看次数

SCONS 中所有构建目标的隐式列表?

我有一个 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 文件中添加一个 ,但该项目相当大。

c++ scons

5
推荐指数
1
解决办法
2649
查看次数

SCons:如何在已使用 VariantDir 调用的 SConscript 中导入 Python 模块?

我的构建结构如下:

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.

scons python-import

5
推荐指数
1
解决办法
3672
查看次数

Scons AttributeError:“builtin_function_or_method”对象没有属性“dispatch”

我有一个正在实例化一个对象的 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 multiprocessing python-2.7

5
推荐指数
1
解决办法
3071
查看次数

如何解决 CheckLib 返回 false 的问题?

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)

scons

5
推荐指数
1
解决办法
1618
查看次数

在 SConstruct 文件上使用 flake8(来自 scons)

我想用它flake8来验证 scons 文件 ( SConstruct, SConscript)。因为scons隐式导入 SCons 模块,所以默认情况下可以使用一些名称,例如Program, Glob, Command。flake8 不知道它们并丢弃“未定义名称'Glob'[F821]”警告。

我该如何解决这个问题?

scons flake8

5
推荐指数
1
解决办法
184
查看次数

配置 CMake 只运行 scons,不构建任何东西

我在使用 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)之前添加,但没有成功。

c++ cmake scons clion

5
推荐指数
1
解决办法
880
查看次数

如何限制SCons Command构建器仅在其依赖项已更改时才运行?

我在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)

python scons

4
推荐指数
1
解决办法
5500
查看次数

如何使用eclipse和pydev调试SCons脚本?

我是SCons的新手,也使用pydev.有人可以帮我提供有关如何使用Eclipse和pydev调试scons脚本的说明吗?考虑到SCons是一个单独的应用程序而不是python的扩展这一事实是否可能?

python eclipse pydev scons

4
推荐指数
1
解决办法
2296
查看次数

Scons:运行make命令作为目标的依赖项

我有一个库需要构建为我的目标的依赖项.该库随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)

makefile scons

4
推荐指数
1
解决办法
2305
查看次数