如何在SCons中包括外部软件包

时间:2018-08-23 00:11:08

标签: cmake 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"])

我认为我应该在CPPPATH中填充$ {external_package_INCLUDE_DIRS},在LIBPATH中填充$ {external_package_LIB_DIRS},但是我不知道如何自动找到它们。

更新:我的问题不是很清楚。 我想要一个SConstruct文件,它与提供的CMake相同。它必须构建一个具有外部依赖项的项目。

1 个答案:

答案 0 :(得分:0)

所以有几种方法可以做到这一点:

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')简单地添加到每个应该使用它的环境中。