c为大型项目做准备

时间:2014-02-11 23:01:31

标签: cmake

我目前有一个非常大的文件结构,我想将其移植到cMake,但不幸的是,我很难找到类似于我目前正在使用的文件结构的示例。

_ _。c / h表示任何文件名)

Project
   Target
        <*.s19/*.elf goes here>
   Component1
        src
            file.c
            file.h
            ____.c
            ____.h
        cfg
            ____.c
            ____.h
        out
            <*.o goes here>
        tmp
            <*.d goes here>
   Component2
        src
            file.c
            file.h
            ____.c
            ____.h
        cfg
            ____.c
            ____.h
        out
            <*.o goes here>
        tmp
            <*.d goes here>
   Component3
        src
            file.c
            file.h
            ____.c
            ____.h
        cfg
            ____.c
            ____.h
        out
            <*.o goes here>
        tmp
            <*.d goes here>

另外,我如何告诉它在某个组件中查找包含,例如我希望组件1中的文件只在Component2中查找#includes。另外,我如何告诉它只在某个文件列表中编译,例如在src中,我可能只希望它在file1.c中编译,而不是在file2.c中编译

1 个答案:

答案 0 :(得分:0)

如何在不同的组件中使用不同的include目录(在@ruslo和@steveire的帮助下):

  1. 在主CMakeLists.txt中按正确的顺序添加组件:

    add_subdirectory(Component1)
    add_subdirectory(Component2)
    
  2. 在Component1 / CMakeLists.txt中为生成的库添加一个属性::

    cmake_minimum_required(VERSION 2.8.11)
    
    ...
    
    add_library(Component1 ${Component1_SOURCES})
    target_include_directories(Component1 INTERFACE
      "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
      "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
      ... other required includes
    )
    
  3. 在Component2 / CMakeLists.txt中使用target_include_directories作为Component2:

    cmake_minimum_required(VERSION 2.8.11)
    
    ...
    
    add_executable(Component2 ${Component2_SOURCES})
    target_link_libraries(Component2 Component1)
    
  4. 关于要编译的文件的确切列表。坦率地说,我认为这方面没有任何问题。只需在add_executableadd_library指令中明确指定它们:

    add_binary(Component1Binary test1.c test2.c test5.c)
    

    但是我应该提一下,传统的CMake使用稍微不同的布局来编译工件。它将编译的工件放在源目录中,或者您可以创建一个完全分离的目录,它将所有编译的工件放在那里,完全复制您的项目结构。看看:

     MyProject/
         CMakeLists.txt <- the top-level CMakeLists.txt. It may simply `add_subdirectory()`s (for each of its `Components`) and configure project-wide settings
         Component1/
             CMakeLists.txt <- this is intented to build artifact(s) for Component1
             src1-1.c
             src1-1.h
             ...
         Component2/
             CMakeLists.txt <- this is intented to build artifact(s) for Component2
             src2-1.c
             src2-1.h
             ...
    

    现在您可以在文件系统中创建一个具有任意名称(例如,build.release where 的空目录(通常在MyProject中的某个位置但不是必需的),然后cd到那个目录并像这样调用cmake:

     cmake [cmake flags like -DCMAKE_BUILD_TYPE=Release and others] path/to/the/MyProject
    
    然后,CMake会在此目录中创建所有必需的Makefile-s和其他构建工件,如果您选择使用make而不是{{ninja,则可以调用ninja(或make 1}})并且所有构建工件都将驻留在该目录中,再现MyProject的原始结构:

    build.release/
         Component1/
             src1-1.o
             ...
             Component1.a
         Component2/
             src2-1.o
             ...
             Component2Exe
    

    有关$<BUILD_INTERFACE:...>内容的更多信息在docsHow to set include_directories from a CMakeLists.txt file?等。此功能相对较新,我仍然不确定我是否完全正确地执行了所有操作(测试示例确实编译了)