如何在 SCons 中包含外部包
How to include external packages in SCons
我想知道在依赖外部包的情况下使用 SCons 构建项目的正确方法。
考虑以下程序hello_world.cpp
#include <iostream>
#include "external_package/external_header.hpp"
int main(int argc, char* argv[])
{
std::cout<<"Hello World!"<<std::endl;
return 0;
}
我可以通过以下 CMakeLists.txt 文件使用 CMake 构建它
find_package(external_package REQUIRED)
include_directories(${external_package_INCLUDE_DIRS})
add_executable(hello_world hello_world.cpp)
target_link_libraries(hello_world ${external_package_LIBRARIES})
install(TARGETS hello_world
DESTINATION bin)
什么是等效的 SConstruct 文件?特别是,如何模拟 find_package 功能?
这就是我到目前为止的想法。构造
env = Environment()
env.Append(CPPPATH = [])
env.Append(LIB_PATH=[])
env.Program("hello_world", ["hello_world.cpp"])
我认为我应该用 ${external_package_INCLUDE_DIRS} 填充 CPPPATH,用 ${external_package_LIB_DIRS} 填充 LIBPATH,但我不知道如何自动找到它们。
更新:我的问题不是很清楚。
我想要一个与提供的 CMake 相同的 SConstruct 文件。它必须构建一个具有外部依赖性的项目。
所以有几种方法可以做到这一点:
1) 为用于指定包路径等的环境变量设置一个前缀。假设您将包含一些设置 PACKAGE_A_INCLUDE_DIRS 等的逻辑
env = Environment()
env.AppendUnique(CPPPATH = '$PACKAGE_A_INCLUDE_DIRS')
env.AppendUnique(LIBPATH = '$PACKAGE_A_LIBS')
env.Program("hello_world", ["hello_world.cpp"])
2) 使用工具设置所需的变量。这个用法可能与名字"tool"不符,但其他人用得很好
env = Environment()
env.Tool('PACKAGE_A')
env.Program("hello_world", ["hello_world.cpp"])
然后在 site_scons/site_tools 中,您将有一个名为 PACKAGE_A.py 的文件,如下所示:
def exists(env):
return True
def generate(env):
env.AppendUnique('LIBPATH'=['/path/to/libs'])
env.AppendUnique('CPPPATH'=['/path/to/headers',...])
然后您可以简单地将 env.Tool('some_package') 添加到每个应该使用它的环境中。
我想知道在依赖外部包的情况下使用 SCons 构建项目的正确方法。
考虑以下程序hello_world.cpp
#include <iostream>
#include "external_package/external_header.hpp"
int main(int argc, char* argv[])
{
std::cout<<"Hello World!"<<std::endl;
return 0;
}
我可以通过以下 CMakeLists.txt 文件使用 CMake 构建它
find_package(external_package REQUIRED)
include_directories(${external_package_INCLUDE_DIRS})
add_executable(hello_world hello_world.cpp)
target_link_libraries(hello_world ${external_package_LIBRARIES})
install(TARGETS hello_world
DESTINATION bin)
什么是等效的 SConstruct 文件?特别是,如何模拟 find_package 功能?
这就是我到目前为止的想法。构造
env = Environment()
env.Append(CPPPATH = [])
env.Append(LIB_PATH=[])
env.Program("hello_world", ["hello_world.cpp"])
我认为我应该用 ${external_package_INCLUDE_DIRS} 填充 CPPPATH,用 ${external_package_LIB_DIRS} 填充 LIBPATH,但我不知道如何自动找到它们。
更新:我的问题不是很清楚。 我想要一个与提供的 CMake 相同的 SConstruct 文件。它必须构建一个具有外部依赖性的项目。
所以有几种方法可以做到这一点:
1) 为用于指定包路径等的环境变量设置一个前缀。假设您将包含一些设置 PACKAGE_A_INCLUDE_DIRS 等的逻辑
env = Environment()
env.AppendUnique(CPPPATH = '$PACKAGE_A_INCLUDE_DIRS')
env.AppendUnique(LIBPATH = '$PACKAGE_A_LIBS')
env.Program("hello_world", ["hello_world.cpp"])
2) 使用工具设置所需的变量。这个用法可能与名字"tool"不符,但其他人用得很好
env = Environment()
env.Tool('PACKAGE_A')
env.Program("hello_world", ["hello_world.cpp"])
然后在 site_scons/site_tools 中,您将有一个名为 PACKAGE_A.py 的文件,如下所示:
def exists(env):
return True
def generate(env):
env.AppendUnique('LIBPATH'=['/path/to/libs'])
env.AppendUnique('CPPPATH'=['/path/to/headers',...])
然后您可以简单地将 env.Tool('some_package') 添加到每个应该使用它的环境中。