Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set cmake compile options based on language #7600

Merged
merged 14 commits into from Sep 1, 2020
19 changes: 14 additions & 5 deletions conans/client/generators/cmake_common.py
Expand Up @@ -200,11 +200,20 @@ def cmake_global_vars(deps, build_type=""):
$<$<CONFIG:RelWithDebInfo>:${{CONAN_COMPILE_DEFINITIONS_{uname}_RELWITHDEBINFO}}>
$<$<CONFIG:MinSizeRel>:${{CONAN_COMPILE_DEFINITIONS_{uname}_MINSIZEREL}}>
$<$<CONFIG:Debug>:${{CONAN_COMPILE_DEFINITIONS_{uname}_DEBUG}}>)
set_property(TARGET {name} PROPERTY INTERFACE_COMPILE_OPTIONS ${{CONAN_C_FLAGS_{uname}_LIST}} ${{CONAN_CXX_FLAGS_{uname}_LIST}}
$<$<CONFIG:Release>:${{CONAN_C_FLAGS_{uname}_RELEASE_LIST}} ${{CONAN_CXX_FLAGS_{uname}_RELEASE_LIST}}>
$<$<CONFIG:RelWithDebInfo>:${{CONAN_C_FLAGS_{uname}_RELWITHDEBINFO_LIST}} ${{CONAN_CXX_FLAGS_{uname}_RELWITHDEBINFO_LIST}}>
$<$<CONFIG:MinSizeRel>:${{CONAN_C_FLAGS_{uname}_MINSIZEREL_LIST}} ${{CONAN_CXX_FLAGS_{uname}_MINSIZEREL_LIST}}>
$<$<CONFIG:Debug>:${{CONAN_C_FLAGS_{uname}_DEBUG_LIST}} ${{CONAN_CXX_FLAGS_{uname}_DEBUG_LIST}}>)
set_property(TARGET {name} PROPERTY INTERFACE_COMPILE_OPTIONS $<$<COMPILE_LANGUAGE:C>:${{CONAN_C_FLAGS_{uname}_LIST}}>
$<$<COMPILE_LANGUAGE:CXX>:${{CONAN_CXX_FLAGS_{uname}_LIST}}>
$<$<CONFIG:Release>:
$<$<COMPILE_LANGUAGE:C>:${{CONAN_C_FLAGS_{uname}_RELEASE_LIST}}>
$<$<COMPILE_LANGUAGE:CXX>:${{CONAN_CXX_FLAGS_{uname}_RELEASE_LIST}}>>
$<$<CONFIG:RelWithDebInfo>:
$<$<COMPILE_LANGUAGE:C>:${{CONAN_C_FLAGS_{uname}_RELWITHDEBINFO_LIST}}>
$<$<COMPILE_LANGUAGE:CXX>:${{CONAN_CXX_FLAGS_{uname}_RELWITHDEBINFO_LIST}}>>
$<$<CONFIG:MinSizeRel>:
$<$<COMPILE_LANGUAGE:C>:${{CONAN_C_FLAGS_{uname}_MINSIZEREL_LIST}}>
$<$<COMPILE_LANGUAGE:CXX>:${{CONAN_CXX_FLAGS_{uname}_MINSIZEREL_LIST}}>>
$<$<CONFIG:Debug>:
$<$<COMPILE_LANGUAGE:C>:${{CONAN_C_FLAGS_{uname}_DEBUG_LIST}}>
$<$<COMPILE_LANGUAGE:CXX>:${{CONAN_CXX_FLAGS_{uname}_DEBUG_LIST}}>>)
"""


Expand Down
11 changes: 7 additions & 4 deletions conans/client/generators/cmake_find_package.py
Expand Up @@ -42,7 +42,8 @@ class CMakeFindPackageGenerator(Generator):
set_property(TARGET {name}::{name} PROPERTY INTERFACE_COMPILE_DEFINITIONS
${{{name}_COMPILE_DEFINITIONS}})
set_property(TARGET {name}::{name} PROPERTY INTERFACE_COMPILE_OPTIONS
"${{{name}_COMPILE_OPTIONS_LIST}}")
$<$<COMPILE_LANGUAGE:C>:${{{name}_COMPILE_OPTIONS_C}}>
$<$<COMPILE_LANGUAGE:CXX>:${{{name}_COMPILE_OPTIONS_CXX}}>)
{find_dependencies_block}
endif()
endif()
Expand Down Expand Up @@ -96,7 +97,8 @@ class CMakeFindPackageGenerator(Generator):
set({{ pkg_name }}_{{ comp_name }}_RES_DIRS {{ comp.res_paths }})
set({{ pkg_name }}_{{ comp_name }}_DEFINITIONS {{ comp.defines }})
set({{ pkg_name }}_{{ comp_name }}_COMPILE_DEFINITIONS {{ comp.compile_definitions }})
set({{ pkg_name }}_{{ comp_name }}_COMPILE_OPTIONS_LIST "{{ comp.cxxflags_list }}" "{{ comp.cflags_list }}")
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removing this variable when using components, as this feature is marked as experimental

set({{ pkg_name }}_{{ comp_name }}_COMPILE_OPTIONS_C {{ comp.cflags_list }})
set({{ pkg_name }}_{{ comp_name }}_COMPILE_OPTIONS_CPP {{ comp.cxxflags_list }})
set({{ pkg_name }}_{{ comp_name }}_LIBS {{ comp.libs }})
set({{ pkg_name }}_{{ comp_name }}_SYSTEM_LIBS {{ comp.system_libs }})
set({{ pkg_name }}_{{ comp_name }}_FRAMEWORK_DIRS {{ comp.framework_paths }})
Expand Down Expand Up @@ -181,7 +183,8 @@ class CMakeFindPackageGenerator(Generator):
set_target_properties({{ pkg_name }}::{{ comp_name }} PROPERTIES INTERFACE_COMPILE_DEFINITIONS
"{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_DEFINITIONS}' }}")
set_target_properties({{ pkg_name }}::{{ comp_name }} PROPERTIES INTERFACE_COMPILE_OPTIONS
"{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_LIST}' }}")
$<$<COMPILE_LANGUAGE:C>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_C}' }}>
$<$<COMPILE_LANGUAGE:CXX>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_CXX}' }}>>)
endif()
endif()

Expand Down Expand Up @@ -266,7 +269,7 @@ def _find_for_dep(self, pkg_name, pkg_findname, pkg_filename, cpp_info):
pkg_public_deps_filenames = [self._get_filename(self.deps_build_info[public_dep])
for public_dep in cpp_info.public_deps]
pkg_public_deps_names = [self._get_name(self.deps_build_info[public_dep])
for public_dep in cpp_info.public_deps]
for public_dep in cpp_info.public_deps]
deps_names = ";".join(["{n}::{n}".format(n=n) for n in pkg_public_deps_names])
if cpp_info.components:
components = self._get_components(pkg_name, pkg_findname, cpp_info)
Expand Down
2 changes: 2 additions & 0 deletions conans/client/generators/cmake_find_package_common.py
Expand Up @@ -15,6 +15,8 @@
)
set({name}_COMPILE_DEFINITIONS{build_type_suffix} {deps.compile_definitions})
set({name}_COMPILE_OPTIONS{build_type_suffix}_LIST "{deps.cxxflags_list}" "{deps.cflags_list}")
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

here I kept the variable (although it is not used in targets) to avoid breaking

set({name}_COMPILE_OPTIONS_C{build_type_suffix} "{deps.cflags_list}")
set({name}_COMPILE_OPTIONS_CXX{build_type_suffix} "{deps.cxxflags_list}")
set({name}_LIBRARIES_TARGETS{build_type_suffix} "") # Will be filled later, if CMake 3
set({name}_LIBRARIES{build_type_suffix} "") # Will be filled later
set({name}_LIBS{build_type_suffix} "") # Same as {name}_LIBRARIES
Expand Down
35 changes: 26 additions & 9 deletions conans/client/generators/cmake_find_package_multi.py
Expand Up @@ -64,10 +64,18 @@ class CMakeFindPackageMultiGenerator(CMakeFindPackageGenerator):
$<$<CONFIG:Debug>:${{{name}_COMPILE_DEFINITIONS_DEBUG}}>)
set_property(TARGET {name}::{name}
PROPERTY INTERFACE_COMPILE_OPTIONS
$<$<CONFIG:Release>:${{{name}_COMPILE_OPTIONS_RELEASE_LIST}}>
$<$<CONFIG:RelWithDebInfo>:${{{name}_COMPILE_OPTIONS_RELWITHDEBINFO_LIST}}>
$<$<CONFIG:MinSizeRel>:${{{name}_COMPILE_OPTIONS_MINSIZEREL_LIST}}>
$<$<CONFIG:Debug>:${{{name}_COMPILE_OPTIONS_DEBUG_LIST}}>)
$<$<CONFIG:Release>:
$<$<COMPILE_LANGUAGE:C>:${{{name}_COMPILE_OPTIONS_C_RELEASE}}>
$<$<COMPILE_LANGUAGE:CXX>:${{{name}_COMPILE_OPTIONS_CXX_RELEASE}}>>
$<$<CONFIG:RelWithDebInfo>:
$<$<COMPILE_LANGUAGE:C>:${{{name}_COMPILE_OPTIONS_C_RELWITHDEBINFO}}>
$<$<COMPILE_LANGUAGE:CXX>:${{{name}_COMPILE_OPTIONS_CXX_RELWITHDEBINFO}}>>
$<$<CONFIG:MinSizeRel>:
$<$<COMPILE_LANGUAGE:C>:${{{name}_COMPILE_OPTIONS_C_MINSIZEREL}}>
$<$<COMPILE_LANGUAGE:CXX>:${{{name}_COMPILE_OPTIONS_CXX_MINSIZEREL}}>>
$<$<CONFIG:Debug>:
$<$<COMPILE_LANGUAGE:C>:${{{name}_COMPILE_OPTIONS_C_DEBUG}}>
$<$<COMPILE_LANGUAGE:CXX>:${{{name}_COMPILE_OPTIONS_CXX_DEBUG}}>>)
"""

# https://gitlab.kitware.com/cmake/cmake/blob/master/Modules/BasicConfigVersion-SameMajorVersion.cmake.in
Expand Down Expand Up @@ -119,7 +127,8 @@ class CMakeFindPackageMultiGenerator(CMakeFindPackageGenerator):
set({{ pkg_name }}_{{ comp_name }}_RES_DIRS_{{ build_type }} {{ comp.res_paths }})
set({{ pkg_name }}_{{ comp_name }}_DEFINITIONS_{{ build_type }} {{ comp.defines }})
set({{ pkg_name }}_{{ comp_name }}_COMPILE_DEFINITIONS_{{ build_type }} {{ comp.compile_definitions }})
set({{ pkg_name }}_{{ comp_name }}_COMPILE_OPTIONS_LIST_{{ build_type }} "{{ comp.cxxflags_list }}" "{{ comp.cflags_list }}")
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed variable in the components flavour

set({{ pkg_name }}_{{ comp_name }}_COMPILE_OPTIONS_C_{{ build_type }} "{{ comp.cflags_list }}")
set({{ pkg_name }}_{{ comp_name }}_COMPILE_OPTIONS_CXX_{{ build_type }} "{{ comp.cxxflags_list }}")
set({{ pkg_name }}_{{ comp_name }}_LIBS_{{ build_type }} {{ comp.libs }})
set({{ pkg_name }}_{{ comp_name }}_SYSTEM_LIBS_{{ build_type }} {{ comp.system_libs }})
set({{ pkg_name }}_{{ comp_name }}_FRAMEWORK_DIRS_{{ build_type }} {{ comp.framework_paths }})
Expand Down Expand Up @@ -239,10 +248,18 @@ class CMakeFindPackageMultiGenerator(CMakeFindPackageGenerator):
$<$<CONFIG:MinSizeRel>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_DEFINITIONS_MINSIZEREL}' }}>
$<$<CONFIG:Debug>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_DEFINITIONS_DEBUG}' }}>)
set_property(TARGET {{ pkg_name }}::{{ comp_name }} PROPERTY INTERFACE_COMPILE_OPTIONS
$<$<CONFIG:Release>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_LIST_RELEASE}' }}>
$<$<CONFIG:RelWithDebInfo>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_LIST_RELWITHDEBINFO}' }}>
$<$<CONFIG:MinSizeRel>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_LIST_MINSIZEREL}' }}>
$<$<CONFIG:Debug>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_LIST_DEBUG}' }}>)
$<$<CONFIG:Release>:
$<$<COMPILE_LANGUAGE:C>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_C_RELEASE}' }}>
$<$<COMPILE_LANGUAGE:CXX>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_CXX_RELEASE}' }}>>
$<$<CONFIG:RelWithDebInfo>:
$<$<COMPILE_LANGUAGE:C>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_C_RELWITHDEBINFO}' }}>
$<$<COMPILE_LANGUAGE:CXX>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_CXX_RELWITHDEBINFO}' }}>>
$<$<CONFIG:MinSizeRel>:
$<$<COMPILE_LANGUAGE:C>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_C_MINSIZEREL}' }}>
$<$<COMPILE_LANGUAGE:CXX>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_CXX_MINSIZEREL}' }}>>
$<$<CONFIG:Debug>:
$<$<COMPILE_LANGUAGE:C>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_C_DEBUG}' }}>
$<$<COMPILE_LANGUAGE:CXX>:{{ '${'+pkg_name+'_'+comp_name+'_COMPILE_OPTIONS_CXX_DEBUG}' }}>>)
set({{ pkg_name }}_{{ comp_name }}_TARGET_PROPERTIES TRUE)

{%- endfor %}
Expand Down
48 changes: 48 additions & 0 deletions conans/test/functional/generators/cmake_test.py
Expand Up @@ -380,3 +380,51 @@ def build(self):

client.run('create .')
self.assertIn("POLICY CMP0054 IS OLD", client.out)

def test_cmake_compile_options(self):
conanfile = textwrap.dedent("""
from conans import ConanFile

class ConanTest(ConanFile):
name = "flags"
version = "1.0"
generators = "cmake"
settings = "os", "compiler", "arch", "build_type"

def package_info(self):
self.cpp_info.cflags = ["-fno-asm"]
self.cpp_info.cxxflags = ["-fno-exceptions", "-fno-rtti"]
""")

client = TestClient()
client.save({"conanfile.py": conanfile})
client.run("create conanfile.py")

conanfile_consumer = textwrap.dedent("""
from conans import ConanFile, CMake

class ConanTest(ConanFile):
name = "consumer"
version = "1.0"
generators = "cmake"
settings = "os", "compiler", "arch", "build_type"
requires = "flags/1.0"
exports_sources = "CMakeLists.txt"

def build(self):
cmake = CMake(self)
cmake.configure()
""")
cmakelists = textwrap.dedent("""
cmake_minimum_required(VERSION 2.8)
PROJECT(consumer C CXX)
include(conanbuildinfo.cmake)
CONAN_BASIC_SETUP(TARGETS)
get_target_property(opts CONAN_PKG::flags INTERFACE_COMPILE_OPTIONS)
message("${opts}")
""")
client.save({"conanfile.py": conanfile_consumer,
"CMakeLists.txt": cmakelists})
client.run('create .')
self.assertIn("$<$<COMPILE_LANGUAGE:C>:-fno-asm>;$<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions;-fno-rtti>;",
client.out)