def _toolchain_content(self): sections = [] sections.append("def configure(conf):") sections.append(" if not conf.env.CXXFLAGS:") sections.append(" conf.env.CXXFLAGS = []") sections.append(" if not conf.env.LINKFLAGS:") sections.append(" conf.env.LINKFLAGS = []") if "Visual Studio" in self._compiler: # first we set the options for the compiler, then load if self._compiler_version: sections.append(" conf.env.MSVC_VERSION = '{}.0'".format( self._compiler_version)) try: sections.append(" conf.env.MSVC_TARGETS = '{}'".format( self._arch_conan2waf[self._arch])) except KeyError: raise ConanException("Architecture '%s' not supported" % self._arch) sections.append(" conf.env.CXXFLAGS.append('/{}')".format( self._compiler_runtime)) sections.append(" conf.env.CXXFLAGS.extend(['/EHsc'])") if self._build_type == "Debug": sections.append(" conf.env.CXXFLAGS.extend(['/Zi', '/FS'])") sections.append(" conf.env.LINKFLAGS.extend(['/DEBUG'])") elif self._build_type == "Release": sections.append( " conf.env.CXXFLAGS.extend(['/O2', '/Ob1', '/DNDEBUG'])" ) else: sections.append(" conf.env.CC_VERSION = {}".format( self._gcc_ver_conan2waf(self._compiler_version))) cxxf = self._libcxx_flags(compiler=self._compiler, libcxx=self._compiler_libcxx) cppstd = cppstd_from_settings(self._conanfile.settings) cxxf.append( cppstd_flag( self._conanfile.settings.get_safe("compiler"), self._conanfile.settings.get_safe("compiler.version"), cppstd)) for flag in cxxf: sections.append( " conf.env.CXXFLAGS.append('{}')".format(flag)) if self._compiler_cppstd: cppstdf = cppstd_flag(self._compiler, self._compiler_version, self._compiler_cppstd) sections.append( " conf.env.CXXFLAGS.append('{}')".format(cppstdf)) if self._build_type == "Debug": sections.append(" conf.env.CXXFLAGS.extend(['-g'])") elif self._build_type == "Release": sections.append(" conf.env.CXXFLAGS.extend(['-O3'])") return "\n".join(sections)
def test_visual_cppstd_flags(self): self.assertEquals(cppstd_flag("Visual Studio", "12", "11"), None) self.assertEquals(cppstd_flag("Visual Studio", "12", "14"), None) self.assertEquals(cppstd_flag("Visual Studio", "12", "17"), None) self.assertEquals(cppstd_flag("Visual Studio", "14", "11"), None) self.assertEquals(cppstd_flag("Visual Studio", "14", "14"), '/std:c++14') self.assertEquals(cppstd_flag("Visual Studio", "14", "17"), '/std:c++latest') self.assertEquals(cppstd_flag("Visual Studio", "17", "11"), None) self.assertEquals(cppstd_flag("Visual Studio", "17", "14"), '/std:c++14') self.assertEquals(cppstd_flag("Visual Studio", "17", "17"), '/std:c++17') self.assertEquals(cppstd_flag("Visual Studio", "17", "20"), '/std:c++latest')
def test_visual_cppstd_flags(self): self.assertEquals(cppstd_flag("Visual Studio", "12", "11"), None) self.assertEquals(cppstd_flag("Visual Studio", "12", "14"), None) self.assertEquals(cppstd_flag("Visual Studio", "12", "17"), None) self.assertEquals(cppstd_flag("Visual Studio", "14", "11"), None) self.assertEquals(cppstd_flag("Visual Studio", "14", "14"), '/std:c++14') self.assertEquals(cppstd_flag("Visual Studio", "14", "17"), '/std:c++latest') self.assertEquals(cppstd_flag("Visual Studio", "17", "11"), None) self.assertEquals(cppstd_flag("Visual Studio", "17", "14"), '/std:c++14') self.assertEquals(cppstd_flag("Visual Studio", "17", "17"), '/std:c++17')
def __init__(self, conanfile): self._conanfile = conanfile self._build_type = conanfile.settings.get_safe("build_type") self._compiler = conanfile.settings.get_safe("compiler") self._compiler_version = conanfile.settings.get_safe( "compiler.version") self._compiler_runtime = conanfile.settings.get_safe( "compiler.runtime") self._shared = self._conanfile.options.get_safe("shared") self._fpic = self._deduce_fpic() self._libcxx_flag = libcxx_flag(conanfile.settings) self._cppstd_flag = cppstd_flag(conanfile.settings) self._skip_rpath = True if self._conanfile.settings.get_safe( "os") == "Macos" else False self._arch_flag = architecture_flag(self._conanfile.settings) self._build_type_flags = build_type_flags(self._conanfile.settings) self._os_host = conanfile.settings.get_safe("os") self._arch_host = conanfile.settings.get_safe("arch") self._os_target, self._arch_target = get_target_os_arch(conanfile) self._arch_build, self._os_build = self._get_build_os_arch() self._trip_build, self._trip_host, self._trip_target = self._get_host_build_target_flags( ) self._build_type_define = build_type_define( build_type=self._build_type) self._glibcxx_define = libcxx_define(self._conanfile.settings) self.variables = {} self.preprocessor_definitions = {}
def vs_std_cpp(settings): cppstd = cppstd_from_settings(settings) if settings.get_safe("compiler") == "Visual Studio" and cppstd: flag = cppstd_flag(settings.get_safe("compiler"), settings.get_safe("compiler.version"), cppstd) return flag return None
def vs_std_cpp(settings): if settings.get_safe("compiler") == "Visual Studio" and \ settings.get_safe("cppstd"): flag = cppstd_flag(settings.get_safe("compiler"), settings.get_safe("compiler.version"), settings.get_safe("cppstd")) return flag return None
def check_flag_available(values_range, value, setting_id): available = [v for v in values_range if cppstd_flag(compiler, compiler_version, v)] if str(value) not in available: raise ConanException("The specified '%s=%s' is not available " "for '%s %s'. Possible values are %s'" % (setting_id, value, compiler, compiler_version, available))
def _cppstd_flag(self): if conan_version >= Version("1.24"): return tools.cppstd_flag(self._settings) else: from conans.client.build.cppstd_flags import cppstd_flag, cppstd_from_settings compiler = self._settings.get_safe("compiler") compiler_version = self._settings.get_safe("compiler.version") cppstd = cppstd_from_settings(self._settings) return cppstd_flag(compiler, compiler_version, cppstd)
def content(self): """With compiler_args you can invoke your compiler: $ gcc main.c @conanbuildinfo.args -o main $ clang main.c @conanbuildinfo.args -o main $ cl /EHsc main.c @conanbuildinfo.args """ flags = [] flags.extend(format_defines(self._deps_build_info.defines)) flags.extend(format_include_paths(self._deps_build_info.include_paths, compiler=self.compiler)) flags.extend(self._deps_build_info.cxxflags) flags.extend(self._deps_build_info.cflags) arch_flag = architecture_flag(arch=self.conanfile.settings.get_safe("arch"), os=self.conanfile.settings.get_safe("os"), compiler=self.compiler) if arch_flag: flags.append(arch_flag) build_type = self.conanfile.settings.get_safe("build_type") btfs = build_type_flags(compiler=self.compiler, build_type=build_type, vs_toolset=self.conanfile.settings.get_safe("compiler.toolset")) if btfs: flags.extend(btfs) btd = build_type_define(build_type=build_type) if btd: flags.extend(format_defines([btd])) if self.compiler == "Visual Studio": runtime = visual_runtime(self.conanfile.settings.get_safe("compiler.runtime")) if runtime: flags.append(runtime) # Necessary in the "cl" invocation before specify the rest of linker flags flags.append(visual_linker_option_separator) os_build, _ = get_build_os_arch(self.conanfile) if not hasattr(self.conanfile, 'settings_build'): os_build = os_build or self.conanfile.settings.get_safe("os") flags.extend(rpath_flags(os_build, self.compiler, self._deps_build_info.lib_paths)) flags.extend(format_library_paths(self._deps_build_info.lib_paths, compiler=self.compiler)) flags.extend(format_libraries(self._deps_build_info.libs, compiler=self.compiler)) flags.extend(format_libraries(self._deps_build_info.system_libs, compiler=self.compiler)) flags.extend(self._deps_build_info.sharedlinkflags) flags.extend(self._deps_build_info.exelinkflags) flags.extend(self._libcxx_flags()) flags.extend(format_frameworks(self._deps_build_info.frameworks, compiler=self.compiler)) flags.extend(format_framework_paths(self._deps_build_info.framework_paths, compiler=self.compiler)) flags.append(cppstd_flag(self.conanfile.settings)) sysrf = sysroot_flag(self._deps_build_info.sysroot, compiler=self.compiler) if sysrf: flags.append(sysrf) return " ".join(flag for flag in flags if flag)
def __init__(self, conanfile, win_bash=False, include_rpath_flags=False): """ FIXME: include_rpath_flags CONAN 2.0 to default True? Could break many packages in center """ self._conanfile = conanfile self._win_bash = win_bash self._include_rpath_flags = include_rpath_flags self.subsystem = OSInfo().detect_windows_subsystem( ) if self._win_bash else None self._deps_cpp_info = conanfile.deps_cpp_info self._os = conanfile.settings.get_safe("os") self._os_version = conanfile.settings.get_safe("os.version") self._os_sdk = conanfile.settings.get_safe("os.sdk") self._os_subsystem = conanfile.settings.get_safe("os.subsystem") self._arch = conanfile.settings.get_safe("arch") self._os_target, self._arch_target = get_target_os_arch(conanfile) self._build_type = conanfile.settings.get_safe("build_type") self._compiler = conanfile.settings.get_safe("compiler") conan_v2_error("compiler setting should be defined.", not self._compiler) self._compiler_version = conanfile.settings.get_safe( "compiler.version") self._compiler_runtime = conanfile.settings.get_safe( "compiler.runtime") self._libcxx = conanfile.settings.get_safe("compiler.libcxx") self._cppstd = cppstd_from_settings(conanfile.settings) # Set the generic objects before mapping to env vars to let the user # alter some value self.libs = list(self._deps_cpp_info.libs) self.libs.extend(list(self._deps_cpp_info.system_libs)) self.include_paths = list(self._deps_cpp_info.include_paths) self.library_paths = list(self._deps_cpp_info.lib_paths) self.defines = self._configure_defines() # Will go to CFLAGS and CXXFLAGS ["-m64" "-m32", "-g", "-s"] self.flags = self._configure_flags() # Only c++ flags [-stdlib, -library], will go to CXXFLAGS self.cxx_flags = self._configure_cxx_flags() # cpp standard self.cppstd_flag = cppstd_flag(conanfile.settings) # Not -L flags, ["-m64" "-m32"] self.link_flags = self._configure_link_flags() # TEST! # Precalculate -fPIC self.fpic = self._configure_fpic() # Precalculate build, host, target triplets self.build, self.host, self.target = self._get_host_build_target_flags( )
def content(self): """With compiler_args you can invoke your compiler: $ gcc main.c @conanbuildinfo.args -o main $ clang main.c @conanbuildinfo.args -o main $ cl /EHsc main.c @conanbuildinfo.args """ flags = [] flags.extend(format_defines(self._deps_build_info.defines)) flags.extend(format_include_paths(self._deps_build_info.include_paths, compiler=self.compiler)) flags.extend(self._deps_build_info.cppflags) flags.extend(self._deps_build_info.cflags) arch_flag = architecture_flag(arch=self.conanfile.settings.get_safe("arch"), compiler=self.compiler) if arch_flag: flags.append(arch_flag) build_type = self.conanfile.settings.get_safe("build_type") btfs = build_type_flags(compiler=self.compiler, build_type=build_type, vs_toolset=self.conanfile.settings.get_safe("compiler.toolset")) if btfs: flags.extend(btfs) btd = build_type_define(build_type=build_type) if btd: flags.extend(format_defines([btd])) if self.compiler == "Visual Studio": runtime = visual_runtime(self.conanfile.settings.get_safe("compiler.runtime")) if runtime: flags.append(runtime) # Necessary in the "cl" invocation before specify the rest of linker flags flags.append(visual_linker_option_separator) the_os = (self.conanfile.settings.get_safe("os_build") or self.conanfile.settings.get_safe("os")) flags.extend(rpath_flags(the_os, self.compiler, self._deps_build_info.lib_paths)) flags.extend(format_library_paths(self._deps_build_info.lib_paths, compiler=self.compiler)) flags.extend(format_libraries(self._deps_build_info.libs, compiler=self.compiler)) flags.extend(self._deps_build_info.sharedlinkflags) flags.extend(self._deps_build_info.exelinkflags) flags.extend(self._libcxx_flags()) flags.append(cppstd_flag(self.conanfile.settings.get_safe("compiler"), self.conanfile.settings.get_safe("compiler.version"), self.conanfile.settings.get_safe("cppstd"))) sysrf = sysroot_flag(self._deps_build_info.sysroot, compiler=self.compiler) if sysrf: flags.append(sysrf) return " ".join(flag for flag in flags if flag)
def _get_cpp_standard_vars(self): if not self._cppstd: return {} ret = {} if self._cppstd.startswith("gnu"): ret["CONAN_CMAKE_CXX_STANDARD"] = self._cppstd[3:] ret["CONAN_CMAKE_CXX_EXTENSIONS"] = "ON" else: ret["CONAN_CMAKE_CXX_STANDARD"] = self._cppstd ret["CONAN_CMAKE_CXX_EXTENSIONS"] = "OFF" ret["CONAN_STD_CXX_FLAG"] = cppstd_flag(self._compiler, self._compiler_version, self._cppstd) return ret
def check_cppstd(settings): compiler = settings.get_safe("compiler") compiler_version = settings.get_safe("compiler.version") cppstd = settings.get_safe("cppstd") if not cppstd or compiler not in ("gcc", "clang", "apple-clang", "Visual Studio"): return cpp_values = settings.cppstd.values_range available = [ v for v in cpp_values if cppstd_flag(compiler, compiler_version, v) ] if str(cppstd) not in available: raise ConanException("The specified 'cppstd=%s' is not available " "for '%s %s'. Possible values are %s'" % (cppstd, compiler, compiler_version, available))
def _get_cpp_standard_vars(self): if not self._cppstd: return {} ret = {} if self._cppstd.startswith("gnu"): ret["CONAN_CMAKE_CXX_STANDARD"] = self._cppstd[3:] ret["CONAN_CMAKE_CXX_EXTENSIONS"] = "ON" else: ret["CONAN_CMAKE_CXX_STANDARD"] = self._cppstd ret["CONAN_CMAKE_CXX_EXTENSIONS"] = "OFF" ret["CONAN_STD_CXX_FLAG"] = cppstd_flag(self._compiler, self._compiler_version, self._cppstd) return ret
def _get_cpp_standard_vars(self): cppstd = cppstd_from_settings(self._conanfile.settings) if not cppstd: return {} definitions = {} if cppstd.startswith("gnu"): definitions["CONAN_CMAKE_CXX_STANDARD"] = cppstd[3:] definitions["CONAN_CMAKE_CXX_EXTENSIONS"] = "ON" else: definitions["CONAN_CMAKE_CXX_STANDARD"] = cppstd definitions["CONAN_CMAKE_CXX_EXTENSIONS"] = "OFF" definitions["CONAN_STD_CXX_FLAG"] = cppstd_flag(self._conanfile.settings) return definitions
def _get_cpp_standard_vars(self): cppstd = cppstd_from_settings(self._conanfile.settings) compiler = self._ss("compiler") compiler_version = self._ss("compiler.version") if not cppstd: return {} ret = {} if cppstd.startswith("gnu"): ret["CONAN_CMAKE_CXX_STANDARD"] = cppstd[3:] ret["CONAN_CMAKE_CXX_EXTENSIONS"] = "ON" else: ret["CONAN_CMAKE_CXX_STANDARD"] = cppstd ret["CONAN_CMAKE_CXX_EXTENSIONS"] = "OFF" ret["CONAN_STD_CXX_FLAG"] = cppstd_flag(compiler, compiler_version, cppstd) return ret
def __init__(self, conanfile, win_bash=False, include_rpath_flags=False): """ FIXME: include_rpath_flags CONAN 2.0 to default True? Could break many packages in center """ self._conanfile = conanfile self._win_bash = win_bash self._include_rpath_flags = include_rpath_flags self.subsystem = OSInfo().detect_windows_subsystem( ) if self._win_bash else None self._deps_cpp_info = conanfile.deps_cpp_info self._arch = conanfile.settings.get_safe("arch") self._build_type = conanfile.settings.get_safe("build_type") self._compiler = conanfile.settings.get_safe("compiler") self._compiler_version = conanfile.settings.get_safe( "compiler.version") self._libcxx = conanfile.settings.get_safe("compiler.libcxx") self._cppstd = conanfile.settings.get_safe("cppstd") # Set the generic objects before mapping to env vars to let the user # alter some value self.libs = copy.copy(self._deps_cpp_info.libs) self.include_paths = copy.copy(self._deps_cpp_info.include_paths) self.library_paths = copy.copy(self._deps_cpp_info.lib_paths) self.defines = self._configure_defines() # Will go to CFLAGS and CXXFLAGS ["-m64" "-m32", "-g", "-s"] self.flags = self._configure_flags() # Only c++ flags [-stdlib, -library], will go to CXXFLAGS self.cxx_flags = self._configure_cxx_flags() # cpp standard self.cppstd_flag = cppstd_flag(self._compiler, self._compiler_version, self._cppstd) # Not -L flags, ["-m64" "-m32"] self.link_flags = self._configure_link_flags() # TEST! # Not declared by default self.fpic = None # Precalculate build, host, target triplets self.build, self.host, self.target = self._get_host_build_target_flags( )
def __init__(self, conanfile): self._conanfile = conanfile self._set_libcxx = True self._set_cppstd = True self._set_arch = True self._set_shared = True if conanfile.options.get_safe( "shared") else False self._set_fpic = True if conanfile.options.get_safe("fPIC") else False self._compiler = conanfile.settings.get_safe("compiler") self._compiler_version = conanfile.settings.get_safe( "compiler.version") self._compiler_runtime = conanfile.settings.get_safe( "compiler.runtime") self._libcxx = conanfile.settings.get_safe("compiler.libcxx") # cpp standard self._cppstd = cppstd_from_settings(conanfile.settings) self._cppstd_flag = cppstd_flag(conanfile.settings) # arch_build in compiler flag format self._arch_flag = architecture_flag(self._conanfile.settings) # build_type information in compiler flag format self._build_type_flags = " ".join( build_type_flags(self._conanfile.settings)) self._os_host = conanfile.settings.get_safe("os") self._arch_host = conanfile.settings.get_safe("arch") self._os_target, self._arch_target = get_target_os_arch(conanfile) self._arch_build, self._os_build = self._get_build_os_arch() self._build_type = conanfile.settings.get_safe("build_type") # Precalculate build, host, target triplets self._trip_build, self._trip_host, self._trip_target = self._get_host_build_target_flags( ) self.definitions = {}
def __init__(self, conanfile, win_bash=False, include_rpath_flags=False): """ FIXME: include_rpath_flags CONAN 2.0 to default True? Could break many packages in center """ self._conanfile = conanfile self._win_bash = win_bash self._include_rpath_flags = include_rpath_flags self.subsystem = OSInfo().detect_windows_subsystem() if self._win_bash else None self._deps_cpp_info = conanfile.deps_cpp_info self._arch = conanfile.settings.get_safe("arch") self._build_type = conanfile.settings.get_safe("build_type") self._compiler = conanfile.settings.get_safe("compiler") self._compiler_version = conanfile.settings.get_safe("compiler.version") self._libcxx = conanfile.settings.get_safe("compiler.libcxx") self._cppstd = conanfile.settings.get_safe("cppstd") # Set the generic objects before mapping to env vars to let the user # alter some value self.libs = copy.copy(self._deps_cpp_info.libs) self.include_paths = copy.copy(self._deps_cpp_info.include_paths) self.library_paths = copy.copy(self._deps_cpp_info.lib_paths) self.defines = self._configure_defines() # Will go to CFLAGS and CXXFLAGS ["-m64" "-m32", "-g", "-s"] self.flags = self._configure_flags() # Only c++ flags [-stdlib, -library], will go to CXXFLAGS self.cxx_flags = self._configure_cxx_flags() # cpp standard self.cppstd_flag = cppstd_flag(self._compiler, self._compiler_version, self._cppstd) # Not -L flags, ["-m64" "-m32"] self.link_flags = self._configure_link_flags() # TEST! # Not declared by default self.fpic = None # Precalculate build, host, target triplets self.build, self.host, self.target = self._get_host_build_target_flags()
def test_apple_clang_cppstd_flags(self): self.assertEquals(cppstd_flag("apple-clang", "3.9", "98"), None) self.assertEquals(cppstd_flag("apple-clang", "3.9", "gnu98"), None) self.assertEquals(cppstd_flag("apple-clang", "3.9", "11"), None) self.assertEquals(cppstd_flag("apple-clang", "3.9", "14"), None) self.assertEquals(cppstd_flag("apple-clang", "4.0", "98"), "-std=c++98") self.assertEquals(cppstd_flag("apple-clang", "4.0", "gnu98"), "-std=gnu++98") self.assertEquals(cppstd_flag("apple-clang", "4.0", "11"), "-std=c++11") self.assertEquals(cppstd_flag("apple-clang", "4.0", "14"), None) self.assertEquals(cppstd_flag("apple-clang", "5.0", "98"), "-std=c++98") self.assertEquals(cppstd_flag("apple-clang", "5.0", "gnu98"), "-std=gnu++98") self.assertEquals(cppstd_flag("apple-clang", "5.0", "11"), "-std=c++11") self.assertEquals(cppstd_flag("apple-clang", "5.0", "14"), None) self.assertEquals(cppstd_flag("apple-clang", "5.1", "98"), "-std=c++98") self.assertEquals(cppstd_flag("apple-clang", "5.1", "gnu98"), "-std=gnu++98") self.assertEquals(cppstd_flag("apple-clang", "5.1", "11"), "-std=c++11") self.assertEquals(cppstd_flag("apple-clang", "5.1", "14"), "-std=c++1y") self.assertEquals(cppstd_flag("apple-clang", "6.1", "11"), '-std=c++11') self.assertEquals(cppstd_flag("apple-clang", "6.1", "14"), '-std=c++14') self.assertEquals(cppstd_flag("apple-clang", "6.1", "17"), "-std=c++1z") self.assertEquals(cppstd_flag("apple-clang", "7", "11"), '-std=c++11') self.assertEquals(cppstd_flag("apple-clang", "7", "14"), '-std=c++14') self.assertEquals(cppstd_flag("apple-clang", "7", "17"), "-std=c++1z") self.assertEquals(cppstd_flag("apple-clang", "8", "11"), '-std=c++11') self.assertEquals(cppstd_flag("apple-clang", "8", "14"), '-std=c++14') self.assertEquals(cppstd_flag("apple-clang", "8", "17"), "-std=c++1z") self.assertEquals(cppstd_flag("apple-clang", "9", "11"), '-std=c++11') self.assertEquals(cppstd_flag("apple-clang", "9", "14"), '-std=c++14') self.assertEquals(cppstd_flag("apple-clang", "9", "17"), "-std=c++1z") self.assertEquals(cppstd_flag("apple-clang", "9.1", "11"), '-std=c++11') self.assertEquals(cppstd_flag("apple-clang", "9.1", "14"), '-std=c++14') self.assertEquals(cppstd_flag("apple-clang", "9.1", "17"), "-std=c++17")
def get_build_flags(self): if tools.cross_building(self.settings): flags = self.get_build_cross_flags() else: flags = [] # https://www.boost.org/doc/libs/1_70_0/libs/context/doc/html/context/architectures.html if self._b2_os: flags.append("target-os=%s" % self._b2_os) if self._b2_architecture: flags.append("architecture=%s" % self._b2_architecture) if self._b2_address_model: flags.append("address-model=%s" % self._b2_address_model) if self._b2_binary_format: flags.append("binary-format=%s" % self._b2_binary_format) if self._b2_abi: flags.append("abi=%s" % self._b2_abi) flags.append("--layout=%s" % self.options.layout) flags.append("-sBOOST_BUILD_PATH=%s" % self._boost_build_dir) flags.append("-sNO_ZLIB=%s" % ("0" if self.options.zlib else "1")) flags.append("-sNO_BZIP2=%s" % ("0" if self.options.bzip2 else "1")) flags.append("-sNO_LZMA=%s" % ("0" if self.options.lzma else "1")) flags.append("-sNO_ZSTD=%s" % ("0" if self.options.zstd else "1")) def add_defines(option, library): if option: for define in self.deps_cpp_info[library].defines: flags.append("define=%s" % define) if self.zip_bzip2_requires_needed: add_defines(self.options.zlib, "zlib") add_defines(self.options.bzip2, "bzip2") add_defines(self.options.lzma, "lzma") add_defines(self.options.zstd, "zstd") if self._is_msvc and self.settings.compiler.runtime: flags.append("runtime-link=%s" % ("static" if "MT" in str(self.settings.compiler.runtime) else "shared")) flags.append("threading=multi") flags.append("link=%s" % ("static" if not self.options.shared else "shared")) if self.settings.build_type == "Debug": flags.append("variant=debug") else: flags.append("variant=release") for libname in lib_list: if getattr(self.options, "without_%s" % libname): flags.append("--without-%s" % libname) toolset, _, _ = self.get_toolset_version_and_exe() flags.append("toolset=%s" % toolset) if self.settings.get_safe("compiler.cppstd"): flags.append("cxxflags=%s" % cppstd_flag( self.settings.get_safe("compiler"), self.settings.get_safe("compiler.version"), self.settings.get_safe("compiler.cppstd") ) ) # CXX FLAGS cxx_flags = [] # fPIC DEFINITION if self.settings.os != "Windows": if self.options.fPIC: cxx_flags.append("-fPIC") # Standalone toolchain fails when declare the std lib if self.settings.os != "Android": try: if self._gnu_cxx11_abi: flags.append("define=_GLIBCXX_USE_CXX11_ABI=%s" % self._gnu_cxx11_abi) if "clang" in str(self.settings.compiler): if str(self.settings.compiler.libcxx) == "libc++": cxx_flags.append("-stdlib=libc++") flags.append('linkflags="-stdlib=libc++"') else: cxx_flags.append("-stdlib=libstdc++") except: pass if self.options.error_code_header_only: flags.append("define=BOOST_ERROR_CODE_HEADER_ONLY=1") if self.options.system_no_deprecated: flags.append("define=BOOST_SYSTEM_NO_DEPRECATED=1") if self.options.asio_no_deprecated: flags.append("define=BOOST_ASIO_NO_DEPRECATED=1") if self.options.filesystem_no_deprecated: flags.append("define=BOOST_FILESYSTEM_NO_DEPRECATED=1") if self.options.segmented_stacks: flags.extend(["segmented-stacks=on", "define=BOOST_USE_SEGMENTED_STACKS=1", "define=BOOST_USE_UCONTEXT=1"]) if tools.is_apple_os(self.settings.os): if self.settings.get_safe("os.version"): cxx_flags.append(tools.apple_deployment_target_flag(self.settings.os, self.settings.os.version)) if self.settings.os == "iOS": cxx_flags.append("-DBOOST_AC_USE_PTHREADS") cxx_flags.append("-DBOOST_SP_USE_PTHREADS") cxx_flags.append("-fvisibility=hidden") cxx_flags.append("-fvisibility-inlines-hidden") cxx_flags.append("-fembed-bitcode") cxx_flags = 'cxxflags="%s"' % " ".join(cxx_flags) if cxx_flags else "" flags.append(cxx_flags) if self.options.extra_b2_flags: flags.append(str(self.options.extra_b2_flags)) return flags
def content(self): """With compiler_args you can invoke your compiler: $ gcc main.c @conanbuildinfo.args -o main $ clang main.c @conanbuildinfo.args -o main $ cl /EHsc main.c @conanbuildinfo.args """ flags = [] flags.extend( format_defines(self._deps_build_info.defines, compiler=self.compiler)) flags.extend( format_include_paths(self._deps_build_info.include_paths, compiler=self.compiler)) flags.extend(self._deps_build_info.cppflags) flags.extend(self._deps_build_info.cflags) arch_flag = architecture_flag( arch=self.conanfile.settings.get_safe("arch"), compiler=self.compiler) if arch_flag: flags.append(arch_flag) build_type = self.conanfile.settings.get_safe("build_type") btf = build_type_flag(compiler=self.compiler, build_type=build_type) if btf: flags.append(btf) btd = build_type_define(build_type=build_type) if btd: flags.extend(format_defines([btd], self.compiler)) if self.compiler == "Visual Studio": runtime = visual_runtime( self.conanfile.settings.get_safe("compiler.runtime")) if runtime: flags.append(runtime) # Necessary in the "cl" invocation before specify the rest of linker flags flags.append(visual_linker_option_separator) the_os = self.conanfile.settings.get_safe("os_build") or \ self.conanfile.settings.get_safe("os") flags.extend( rpath_flags(the_os, self.compiler, self._deps_build_info.lib_paths)) flags.extend( format_library_paths(self._deps_build_info.lib_paths, compiler=self.compiler)) flags.extend( format_libraries(self._deps_build_info.libs, compiler=self.compiler)) flags.extend(self._deps_build_info.sharedlinkflags) flags.extend(self._deps_build_info.exelinkflags) flags.extend(self._libcxx_flags()) flags.extend( cppstd_flag(self.conanfile.settings.get_safe("compiler"), self.conanfile.settings.get_safe("compiler.version"), self.conanfile.settings.get_safe("cppstd"))) sysrf = sysroot_flag(self._deps_build_info.sysroot, compiler=self.compiler) if sysrf: flags.append(sysrf) return " ".join(flag for flag in flags if flag)
def test_gcc_cppstd_flags(self): self.assertEquals(cppstd_flag("gcc", "4.2", "98"), "-std=c++98") self.assertEquals(cppstd_flag("gcc", "4.2", "gnu98"), "-std=gnu++98") self.assertEquals(cppstd_flag("gcc", "4.2", "11"), None) self.assertEquals(cppstd_flag("gcc", "4.2", "14"), None) self.assertEquals(cppstd_flag("gcc", "4.3", "98"), "-std=c++98") self.assertEquals(cppstd_flag("gcc", "4.3", "gnu98"), "-std=gnu++98") self.assertEquals(cppstd_flag("gcc", "4.3", "11"), "-std=c++0x") self.assertEquals(cppstd_flag("gcc", "4.3", "14"), None) self.assertEquals(cppstd_flag("gcc", "4.6", "11"), '-std=c++0x') self.assertEquals(cppstd_flag("gcc", "4.6", "14"), None) self.assertEquals(cppstd_flag("gcc", "4.7", "11"), '-std=c++11') self.assertEquals(cppstd_flag("gcc", "4.7", "14"), None) self.assertEquals(cppstd_flag("gcc", "4.8", "11"), '-std=c++11') self.assertEquals(cppstd_flag("gcc", "4.8", "14"), '-std=c++1y') self.assertEquals(cppstd_flag("gcc", "4.8", "17"), None) self.assertEquals(cppstd_flag("gcc", "4.9", "11"), '-std=c++11') self.assertEquals(cppstd_flag("gcc", "4.9", "14"), '-std=c++14') self.assertEquals(cppstd_flag("gcc", "4.9", "17"), None) self.assertEquals(cppstd_flag("gcc", "5", "11"), '-std=c++11') self.assertEquals(cppstd_flag("gcc", "5", "14"), '-std=c++14') self.assertEquals(cppstd_flag("gcc", "5", "gnu14"), '-std=gnu++14') self.assertEquals(cppstd_flag("gcc", "5", "17"), None) self.assertEquals(cppstd_flag("gcc", "5.1", "11"), '-std=c++11') self.assertEquals(cppstd_flag("gcc", "5.1", "14"), '-std=c++14') self.assertEquals(cppstd_flag("gcc", "5.1", "17"), '-std=c++1z') self.assertEquals(cppstd_flag("gcc", "7", "11"), '-std=c++11') self.assertEquals(cppstd_flag("gcc", "7", "14"), '-std=c++14') self.assertEquals(cppstd_flag("gcc", "7", "17"), '-std=c++1z')
def test_clang_cppstd_flags(self): self.assertEquals(cppstd_flag("clang", "2.0", "98"), None) self.assertEquals(cppstd_flag("clang", "2.0", "gnu98"), None) self.assertEquals(cppstd_flag("clang", "2.0", "11"), None) self.assertEquals(cppstd_flag("clang", "2.0", "14"), None) self.assertEquals(cppstd_flag("clang", "2.1", "98"), "-std=c++98") self.assertEquals(cppstd_flag("clang", "2.1", "gnu98"), "-std=gnu++98") self.assertEquals(cppstd_flag("clang", "2.1", "11"), "-std=c++0x") self.assertEquals(cppstd_flag("clang", "2.1", "14"), None) self.assertEquals(cppstd_flag("clang", "3.0", "11"), '-std=c++0x') self.assertEquals(cppstd_flag("clang", "3.0", "14"), None) self.assertEquals(cppstd_flag("clang", "3.1", "11"), '-std=c++11') self.assertEquals(cppstd_flag("clang", "3.1", "14"), None) self.assertEquals(cppstd_flag("clang", "3.4", "11"), '-std=c++11') self.assertEquals(cppstd_flag("clang", "3.4", "14"), '-std=c++1y') self.assertEquals(cppstd_flag("clang", "3.4", "17"), None) self.assertEquals(cppstd_flag("clang", "3.5", "11"), '-std=c++11') self.assertEquals(cppstd_flag("clang", "3.5", "14"), '-std=c++14') self.assertEquals(cppstd_flag("clang", "3.5", "17"), '-std=c++1z') self.assertEquals(cppstd_flag("clang", "5", "11"), '-std=c++11') self.assertEquals(cppstd_flag("clang", "5", "14"), '-std=c++14') self.assertEquals(cppstd_flag("clang", "5", "gnu14"), '-std=gnu++14') self.assertEquals(cppstd_flag("clang", "5", "17"), '-std=c++1z') self.assertEquals(cppstd_flag("clang", "5.1", "11"), '-std=c++11') self.assertEquals(cppstd_flag("clang", "5.1", "14"), '-std=c++14') self.assertEquals(cppstd_flag("clang", "5.1", "17"), '-std=c++1z') self.assertEquals(cppstd_flag("clang", "7", "11"), '-std=c++11') self.assertEquals(cppstd_flag("clang", "7", "14"), '-std=c++14') self.assertEquals(cppstd_flag("clang", "7", "17"), '-std=c++1z')
def test_apple_clang_cppstd_flags(self): self.assertEquals(cppstd_flag("apple-clang", "3.9", "98"), None) self.assertEquals(cppstd_flag("apple-clang", "3.9", "gnu98"), None) self.assertEquals(cppstd_flag("apple-clang", "3.9", "11"), None) self.assertEquals(cppstd_flag("apple-clang", "3.9", "14"), None) self.assertEquals(cppstd_flag("apple-clang", "4.0", "98"), "-std=c++98") self.assertEquals(cppstd_flag("apple-clang", "4.0", "gnu98"), "-std=gnu++98") self.assertEquals(cppstd_flag("apple-clang", "4.0", "11"), "-std=c++11") self.assertEquals(cppstd_flag("apple-clang", "4.0", "14"), None) self.assertEquals(cppstd_flag("apple-clang", "5.0", "98"), "-std=c++98") self.assertEquals(cppstd_flag("apple-clang", "5.0", "gnu98"), "-std=gnu++98") self.assertEquals(cppstd_flag("apple-clang", "5.0", "11"), "-std=c++11") self.assertEquals(cppstd_flag("apple-clang", "5.0", "14"), None) self.assertEquals(cppstd_flag("apple-clang", "5.1", "98"), "-std=c++98") self.assertEquals(cppstd_flag("apple-clang", "5.1", "gnu98"), "-std=gnu++98") self.assertEquals(cppstd_flag("apple-clang", "5.1", "11"), "-std=c++11") self.assertEquals(cppstd_flag("apple-clang", "5.1", "14"), "-std=c++1y") self.assertEquals(cppstd_flag("apple-clang", "6.1", "11"), '-std=c++11') self.assertEquals(cppstd_flag("apple-clang", "6.1", "14"), '-std=c++14') self.assertEquals(cppstd_flag("apple-clang", "6.1", "17"), "-std=c++1z") self.assertEquals(cppstd_flag("apple-clang", "7", "11"), '-std=c++11') self.assertEquals(cppstd_flag("apple-clang", "7", "14"), '-std=c++14') self.assertEquals(cppstd_flag("apple-clang", "7", "17"), "-std=c++1z") self.assertEquals(cppstd_flag("apple-clang", "8", "11"), '-std=c++11') self.assertEquals(cppstd_flag("apple-clang", "8", "14"), '-std=c++14') self.assertEquals(cppstd_flag("apple-clang", "8", "17"), "-std=c++1z") self.assertEquals(cppstd_flag("apple-clang", "9", "11"), '-std=c++11') self.assertEquals(cppstd_flag("apple-clang", "9", "14"), '-std=c++14') self.assertEquals(cppstd_flag("apple-clang", "9", "17"), "-std=c++1z")
def test_clang_cppstd_flags(self): self.assertEquals(cppstd_flag("clang", "2.0", "98"), None) self.assertEquals(cppstd_flag("clang", "2.0", "gnu98"), None) self.assertEquals(cppstd_flag("clang", "2.0", "11"), None) self.assertEquals(cppstd_flag("clang", "2.0", "14"), None) self.assertEquals(cppstd_flag("clang", "2.1", "98"), "-std=c++98") self.assertEquals(cppstd_flag("clang", "2.1", "gnu98"), "-std=gnu++98") self.assertEquals(cppstd_flag("clang", "2.1", "11"), "-std=c++0x") self.assertEquals(cppstd_flag("clang", "2.1", "14"), None) self.assertEquals(cppstd_flag("clang", "3.0", "11"), '-std=c++0x') self.assertEquals(cppstd_flag("clang", "3.0", "14"), None) self.assertEquals(cppstd_flag("clang", "3.1", "11"), '-std=c++11') self.assertEquals(cppstd_flag("clang", "3.1", "14"), None) self.assertEquals(cppstd_flag("clang", "3.4", "11"), '-std=c++11') self.assertEquals(cppstd_flag("clang", "3.4", "14"), '-std=c++1y') self.assertEquals(cppstd_flag("clang", "3.4", "17"), None) self.assertEquals(cppstd_flag("clang", "3.5", "11"), '-std=c++11') self.assertEquals(cppstd_flag("clang", "3.5", "14"), '-std=c++14') self.assertEquals(cppstd_flag("clang", "3.5", "17"), '-std=c++1z') self.assertEquals(cppstd_flag("clang", "5", "11"), '-std=c++11') self.assertEquals(cppstd_flag("clang", "5", "14"), '-std=c++14') self.assertEquals(cppstd_flag("clang", "5", "gnu14"), '-std=gnu++14') self.assertEquals(cppstd_flag("clang", "5", "17"), '-std=c++17') self.assertEquals(cppstd_flag("clang", "5.1", "11"), '-std=c++11') self.assertEquals(cppstd_flag("clang", "5.1", "14"), '-std=c++14') self.assertEquals(cppstd_flag("clang", "5.1", "17"), '-std=c++17') self.assertEquals(cppstd_flag("clang", "7", "11"), '-std=c++11') self.assertEquals(cppstd_flag("clang", "7", "14"), '-std=c++14') self.assertEquals(cppstd_flag("clang", "7", "17"), '-std=c++17')
def get_build_flags(self): if tools.cross_building(self.settings): flags = self.get_build_cross_flags() else: flags = [] # https://www.boost.org/doc/libs/1_68_0/libs/context/doc/html/context/architectures.html if self._b2_os: flags.append("target-os=%s" % self._b2_os) if self._b2_architecture: flags.append("architecture=%s" % self._b2_architecture) if self._b2_address_model: flags.append("address-model=%s" % self._b2_address_model) if self._b2_binary_format: flags.append("binary-format=%s" % self._b2_binary_format) if self._b2_abi: flags.append("abi=%s" % self._b2_abi) if self.settings.compiler == "gcc": flags.append("--layout=system") if self.settings.compiler == "Visual Studio" and self.settings.compiler.runtime: flags.append("runtime-link=%s" % ("static" if "MT" in str(self.settings.compiler.runtime) else "shared")) if self.settings.os == "Windows" and self.settings.compiler == "gcc": flags.append("threading=multi") flags.append("link=%s" % ("static" if not self.options.shared else "shared")) if self.settings.build_type == "Debug": flags.append("variant=debug") else: flags.append("variant=release") for libname in lib_list: if getattr(self.options, "without_%s" % libname): flags.append("--without-%s" % libname) if self.settings.cppstd: toolset, _, _ = self.get_toolset_version_and_exe() flags.append("toolset=%s" % toolset) flags.append("cxxflags=%s" % cppstd_flag( self.settings.get_safe("compiler"), self.settings.get_safe("compiler.version"), self.settings.get_safe("cppstd") ) ) # CXX FLAGS cxx_flags = [] # fPIC DEFINITION if self.settings.compiler != "Visual Studio": if self.options.fPIC: cxx_flags.append("-fPIC") # Standalone toolchain fails when declare the std lib if self.settings.os != "Android": try: if str(self.settings.compiler.libcxx) == "libstdc++": flags.append("define=_GLIBCXX_USE_CXX11_ABI=0") elif str(self.settings.compiler.libcxx) == "libstdc++11": flags.append("define=_GLIBCXX_USE_CXX11_ABI=1") if "clang" in str(self.settings.compiler): if str(self.settings.compiler.libcxx) == "libc++": cxx_flags.append("-stdlib=libc++") flags.append('linkflags="-stdlib=libc++"') else: cxx_flags.append("-stdlib=libstdc++") except: pass if self.settings.os == "iOS": arch = self.settings.get_safe('arch') cxx_flags.append("-DBOOST_AC_USE_PTHREADS") cxx_flags.append("-DBOOST_SP_USE_PTHREADS") cxx_flags.append("-fvisibility=hidden") cxx_flags.append("-fvisibility-inlines-hidden") cxx_flags.append("-fembed-bitcode") cxx_flags.extend(["-arch", tools.to_apple_arch(arch)]) try: cxx_flags.append("-mios-version-min=%s" % self.settings.os.version) self.output.info("iOS deployment target: %s" % self.settings.os.version) except: pass flags.append("macosx-version=%s" % self.b2_macosx_version()) cxx_flags = 'cxxflags="%s"' % " ".join(cxx_flags) if cxx_flags else "" flags.append(cxx_flags) return flags
def test_gcc_cppstd_flags(self): self.assertEquals(cppstd_flag("gcc", "4.2", "98"), "-std=c++98") self.assertEquals(cppstd_flag("gcc", "4.2", "gnu98"), "-std=gnu++98") self.assertEquals(cppstd_flag("gcc", "4.2", "11"), None) self.assertEquals(cppstd_flag("gcc", "4.2", "14"), None) self.assertEquals(cppstd_flag("gcc", "4.3", "98"), "-std=c++98") self.assertEquals(cppstd_flag("gcc", "4.3", "gnu98"), "-std=gnu++98") self.assertEquals(cppstd_flag("gcc", "4.3", "11"), "-std=c++0x") self.assertEquals(cppstd_flag("gcc", "4.3", "14"), None) self.assertEquals(cppstd_flag("gcc", "4.6", "11"), '-std=c++0x') self.assertEquals(cppstd_flag("gcc", "4.6", "14"), None) self.assertEquals(cppstd_flag("gcc", "4.7", "11"), '-std=c++11') self.assertEquals(cppstd_flag("gcc", "4.7", "14"), None) self.assertEquals(cppstd_flag("gcc", "4.8", "11"), '-std=c++11') self.assertEquals(cppstd_flag("gcc", "4.8", "14"), '-std=c++1y') self.assertEquals(cppstd_flag("gcc", "4.8", "17"), None) self.assertEquals(cppstd_flag("gcc", "4.9", "11"), '-std=c++11') self.assertEquals(cppstd_flag("gcc", "4.9", "14"), '-std=c++14') self.assertEquals(cppstd_flag("gcc", "4.9", "17"), None) self.assertEquals(cppstd_flag("gcc", "5", "11"), '-std=c++11') self.assertEquals(cppstd_flag("gcc", "5", "14"), '-std=c++14') self.assertEquals(cppstd_flag("gcc", "5", "gnu14"), '-std=gnu++14') self.assertEquals(cppstd_flag("gcc", "5", "17"), None) self.assertEquals(cppstd_flag("gcc", "5.1", "11"), '-std=c++11') self.assertEquals(cppstd_flag("gcc", "5.1", "14"), '-std=c++14') self.assertEquals(cppstd_flag("gcc", "5.1", "17"), '-std=c++1z') self.assertEquals(cppstd_flag("gcc", "7", "11"), '-std=c++11') self.assertEquals(cppstd_flag("gcc", "7", "14"), '-std=c++14') self.assertEquals(cppstd_flag("gcc", "7", "17"), '-std=c++1z')
def get_build_flags(self): if tools.cross_building(self.settings): flags = self.get_build_cross_flags() else: flags = [] # https://www.boost.org/doc/libs/1_69_0/libs/context/doc/html/context/architectures.html if self._b2_os: flags.append("target-os=%s" % self._b2_os) if self._b2_architecture: flags.append("architecture=%s" % self._b2_architecture) if self._b2_address_model: flags.append("address-model=%s" % self._b2_address_model) if self._b2_binary_format: flags.append("binary-format=%s" % self._b2_binary_format) if self._b2_abi: flags.append("abi=%s" % self._b2_abi) flags.append("-sBOOST_BUILD_PATH=%s" % self._boost_build_dir) if self.settings.compiler == "gcc": flags.append("--layout=system") if self._is_msvc and self.settings.compiler.runtime: flags.append("runtime-link=%s" % ("static" if "MT" in str( self.settings.compiler.runtime) else "shared")) flags.append("threading=multi") flags.append("link=%s" % ("static" if not self.options.shared else "shared")) if self.settings.build_type == "Debug": flags.append("variant=debug") else: flags.append("variant=release") for libname in lib_list: if getattr(self.options, "without_%s" % libname): flags.append("--without-%s" % libname) toolset, _, _ = self.get_toolset_version_and_exe() flags.append("toolset=%s" % toolset) if self.settings.cppstd: flags.append( "cxxflags=%s" % cppstd_flag(self.settings.get_safe("compiler"), self.settings.get_safe("compiler.version"), self.settings.get_safe("cppstd"))) # CXX FLAGS cxx_flags = [] # fPIC DEFINITION if self.settings.os != "Windows": if self.options.fPIC: cxx_flags.append("-fPIC") # Standalone toolchain fails when declare the std lib if self.settings.os != "Android": try: if str(self.settings.compiler.libcxx) == "libstdc++": flags.append("define=_GLIBCXX_USE_CXX11_ABI=0") elif str(self.settings.compiler.libcxx) == "libstdc++11": flags.append("define=_GLIBCXX_USE_CXX11_ABI=1") if "clang" in str(self.settings.compiler): if str(self.settings.compiler.libcxx) == "libc++": cxx_flags.append("-stdlib=libc++") flags.append('linkflags="-stdlib=libc++"') else: cxx_flags.append("-stdlib=libstdc++") except: pass if self.options.error_code_header_only: flags.append("define=BOOST_ERROR_CODE_HEADER_ONLY=1") if self.options.system_no_deprecated: flags.append("define=BOOST_SYSTEM_NO_DEPRECATED=1") if self.options.asio_no_deprecated: flags.append("define=BOOST_ASIO_NO_DEPRECATED=1") if tools.is_apple_os(self.settings.os): if self.settings.get_safe("os.version"): cxx_flags.append( tools.apple_deployment_target_flag( self.settings.os, self.settings.os.version)) if self.settings.os == "iOS": cxx_flags.append("-DBOOST_AC_USE_PTHREADS") cxx_flags.append("-DBOOST_SP_USE_PTHREADS") cxx_flags.append("-fvisibility=hidden") cxx_flags.append("-fvisibility-inlines-hidden") cxx_flags.append("-fembed-bitcode") cxx_flags = 'cxxflags="%s"' % " ".join(cxx_flags) if cxx_flags else "" flags.append(cxx_flags) return flags