CMake,UnitBuild特定的编译选项

时间:2014-11-30 12:43:27

标签: c++ cmake

我有一个以文件夹结构的项目:

ProjectRoot/
ProjectRoot/Folder1
ProjectRoot/Folder2

当前我在ProjectRoot中的Cmake文件看起来像那样

#I'm not proficient with Cmake, so I force recent version to prevent me debuggin
#problems for users that use old Cmake versions.

cmake_minimum_required( VERSION 2.8)
project( Project)

add_definitions( -DPROJECT_BUILD_DLL)


if(MINGW)
    add_compile_options( -Os -Wall -Wextra)
endif()

add_subdirectory( ProjectRoot/Folder1)
add_subdirectory( ProjectRoot/Folder2)


add_library( libProject SHARED $<TARGET_OBJECTS:ProjectRootObj>
                               $<TARGET_OBJECTS:ProjectRootFolder1Obj>)

对于每个子文件夹,我都有一个这样的文件:

cmake_minimum_required( VERSION 2.8)
project( ProjectRoot_Folder1)

# find source files
file(GLOB sourceFiles
"*.cpp"
)

# Exclude them from build
set_source_files_properties(${sourceFiles} PROPERTIES HEADER_FILE_ONLY true)

# Create single source file
set(unit_build_file ${CMAKE_CURRENT_BINARY_DIR}/all.cpp)
file( WRITE ${unit_build_file} "// autogenerated by CMake\n")

foreach(source_file ${sourceFiles} )
    file( APPEND ${unit_build_file} "#include \"${source_file}\"\n")
endforeach(source_file)



# Add compiler and unit-build specific settings
if(MINGW)
  add_compile_options( -Wzero-as-null-pointer-constant  
                       -Wold-style-cast
                   )
endif()

add_library( ProjectRootFolder1Obj OBJECT all.cpp )

构建成功。但是我有一个讨厌的问题,在子文件夹中设置的编译器选项被应用&#34;项目范围&#34; (每个CMakeLists.txt文件中的选项都被&#34;添加到#34;以及其他文件!)

Folder2中的源代码是一个自动生成的OpenGL源文件(GLLoadGen),所以我希望它在没有编译选项的情况下编译(在另一个CMakeLists.txt文件的另一个文件夹中设置):

-Wzero-as-null-pointer-constant  
-Wold-style-cast

因为它产生了数百个警告。不管我有什么订单添加子文件夹,似乎&#34;编译器选项&#34;在项目范围内应用,这意味着如果我编译

带有

的文件夹1
-O1

的文件夹2
-O2

通过查看生成的Makefile,我看到了&#34; -O1&#34;和&#34; -O2&#34;作为两个文件夹的命令行选项应用!而我想为每个文件夹使用不同的编译选项,因为每个文件夹都是不同的编译单元,需要不同的警告和优化级别。

这对我来说似乎是一个Cmake问题,因为我按照他们关于OBJECT目标的教程,特别指出了#34;为每个对象使用不同的编译器选项&#34;。那我错过了什么?

现金:

  • 我总是为我的项目使用统一构建,我现在使用Cmake自动化#all; all.cpp&#34;生成(我以前用bash脚本做过)使用此页面上的教程:enter link description here

1 个答案:

答案 0 :(得分:0)

经过调查,我终于找到了解决方案。问题不是sub_folders的相对顺序,而是&#34; add_compile_options&#34;的顺序。 要为每个子目录实现不同的编译选项,我必须执行以下操作:

#options seen by subfolders
if(MINGW)
    add_compile_options( -Os -Wall -Wextra) 
endif()

add_subdirectory( ProjectRoot/Folder1)
add_subdirectory( ProjectRoot/Folder2)

#options seen only by current target (if any file compiled here)
if(MINGW)
    add_compile_options( -Wzero-as-null-pointer-constant  
                         -Wold-style-cast)
endif()

问题是CMakeLists.txt添加了一些文件夹,其中包含&#34; add_compile_options&#34;在错误的地方。

基本上我的解决方案/建议:避免递归添加CMakeLists.txt 使用root&#34; CMakeLists.txt&#34;并包括所有子文件夹。这使得项目更多 更简单(在添加新文件夹时有一个地方可以编辑,而不是找到要编辑的N个文件以包含他们的&#34;孩子&#34;)