Cmake 如何在SCON中包含外部包

Cmake 如何在SCON中包含外部包,cmake,scons,Cmake,Scons,我想知道在依赖于外部包的情况下,使用SCON构建项目的正确方法 考虑以下程序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; } 什么是等效的SConstruct文件?

我想知道在依赖于外部包的情况下,使用SCON构建项目的正确方法

考虑以下程序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;
}
什么是等效的SConstruct文件?特别是,如何模拟find_包功能

这就是我到目前为止提到的。Sconstruct

 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) 为用于指定包路径等的环境变量设置前缀。假设您将包含一些设置包的逻辑

env = Environment()
env.AppendUnique(CPPPATH = '$PACKAGE_A_INCLUDE_DIRS')
env.AppendUnique(LIBPATH = '$PACKAGE_A_LIBS')
env.Program("hello_world", ["hello_world.cpp"])
2) 使用工具设置所需的变量。这一用法可能与“工具”的名称不符,但其他人已经很好地使用了这一用法

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

据我所知,find_package()通过在cmake_模块路径中定位名为find.cmake的文件来工作。您是否询问SCons是否可以加载cmake find包文件?或者别的什么?我在问我应该如何创建一个生成与CMakeLists相同结果的Sconstruct文件。我的直觉是,我需要文件${external_package_INCLUDE_DIRS}和${external_package_LIBRARIES}的列表,在工作示例中,这些文件是使用
pkg config
子系统通过find_package()创建的。您的外部包是否提供了相应的配置文件?您是否询问如何实现find_package()?或者仅仅是一种合理的方式来设置每个包的包含路径和库?@bdbaddog第二。谢谢你的回答。但是,这需要我手动指定头和lib的路径,这取决于用户安装此软件包的方式。SCON是否有办法自动定位这些文件(如CMake)?再次感谢您查找Find.cmake文件。那么你是在问斯科恩能不能用这些?或者使用pkg配置文件是否有效?在这种情况下,ParseFlags()应该可以工作,正如我在对原始问题的评论中所说的,您可以将这些问题封装在一个工具中。。基本上,任何不使用Find.cmake文件的解决方案都需要a)了解它们的安装位置(如上所述)。b) 使用pkg配置文件,c)从其他来源提取信息的一些方法。然而,这些软件包是否在您的沙箱中,您只需要相对于顶部进行引用?您可以尝试进一步澄清您的原始问题。如果我的答案是正确的,那么您的问题可能会更清楚“我如何使用SCON来管理向我的构建环境中添加其他包的标志?”因为我的答案并没有严格地回答如何做您的cmake所做的事情。
def exists(env):
    return True

def generate(env):
    env.AppendUnique('LIBPATH'=['/path/to/libs'])
    env.AppendUnique('CPPPATH'=['/path/to/headers',...])