<commit_before>--!The Automatic Cross-platform Build Tool
-- 
-- XMake is free software; you can redistribute it and/or modify
-- it under the terms of the GNU Lesser General Public License as published by
-- the Free Software Foundation; either version 2.1 of the License, or
-- (at your option) any later version.
-- 
-- XMake is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU Lesser General Public License for more details.
-- 
-- You should have received a copy of the GNU Lesser General Public License
-- along with XMake; 
-- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a>
-- 
-- Copyright (C) 2009 - 2015, ruki All rights reserved.
--
-- @author      ruki
-- @file        gcc.lua
--

-- load modules
local utils     = require("base/utils")
local table     = require("base/table")
local string    = require("base/string")
local config    = require("base/config")
local platform  = require("platform/platform")

-- define module: gcc
local gcc = gcc or {}

-- check the given flag 
function gcc._check(self, flag)

    -- this flag has been checked?
    self._CHECK = self._CHECK or {}
    if self._CHECK[flag] then
        return self._CHECK[flag]
    end

    -- check it
    local result = flag
    if 0 ~= os.execute(string.format("%s %s -S -o %s -xc %s > %s 2>&1", self._NAME, flag, xmake._NULDEV, xmake._NULDEV, xmake._NULDEV)) then
        result = ""
    end

    -- trace
    utils.verbose("checking for the compiler flags %s ... %s", flag, utils.ifelse(#result ~= 0, "ok", "no"))

    -- save it
    self._CHECK[flag] = result

    -- ok?
    return result
end

-- the init function
function gcc.init(self, name)

    -- save name
    self._NAME = name or "gcc"

    -- init mxflags
    self.mxflags = {    "-fmessage-length=0"
                    ,   "-pipe"
                    ,   "-fpascal-strings"
                    ,   "\"-DIBOutlet=__attribute__((iboutlet))\""
                    ,   "\"-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))\""
                    ,   "\"-DIBAction=void)__attribute__((ibaction)\""}

    -- init shflags
    if name:find("clang") then
        self.shflags = { "-dynamiclib", "-fPIC" }
    else
        self.shflags = { "-shared -Wl,-soname", "-fPIC" }
    end

    -- suppress warning for the clang
    local isclang = false
    if name:find("clang") then
        isclang = true
        self.cxflags = self.cxflags or {}
        self.mxflags = self.mxflags or {}
        self.asflags = self.asflags or {}
        table.join2(self.cxflags, "-Qunused-arguments")
        table.join2(self.mxflags, "-Qunused-arguments")
        table.join2(self.asflags, "-Qunused-arguments")
    end

    -- init flags map
    self.mapflags = 
    {
        -- vectorexts
        ["-mmmx"]                   = self._check
    ,   ["-msse$"]                  = self._check
    ,   ["-msse2"]                  = self._check
    ,   ["-msse3"]                  = self._check
    ,   ["-mssse3"]                 = self._check
    ,   ["-mavx$"]                  = self._check
    ,   ["-mavx2"]                  = self._check
    ,   ["-mfpu=.*"]                = self._check

        -- warnings
    ,   ["-W1"]                     = "-Wall"
    ,   ["-W2"]                     = "-Wall"
    ,   ["-W3"]                     = "-Wall"

        -- strip
    ,   ["-s"]                      = utils.ifelse(isclang, "-S", "-s")
    ,   ["-S"]                      = "-S"
 
        -- others
    ,   ["-ftrapv"]                 = self._check
    ,   ["-fsanitize=address"]      = self._check<commit_msg>fix strip flags for clang<commit_after>--!The Automatic Cross-platform Build Tool
-- 
-- XMake is free software; you can redistribute it and/or modify
-- it under the terms of the GNU Lesser General Public License as published by
-- the Free Software Foundation; either version 2.1 of the License, or
-- (at your option) any later version.
-- 
-- XMake is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU Lesser General Public License for more details.
-- 
-- You should have received a copy of the GNU Lesser General Public License
-- along with XMake; 
-- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a>
-- 
-- Copyright (C) 2009 - 2015, ruki All rights reserved.
--
-- @author      ruki
-- @file        gcc.lua
--

-- load modules
local utils     = require("base/utils")
local table     = require("base/table")
local string    = require("base/string")
local config    = require("base/config")
local platform  = require("platform/platform")

-- define module: gcc
local gcc = gcc or {}

-- check the given flag 
function gcc._check(self, flag)

    -- this flag has been checked?
    self._CHECK = self._CHECK or {}
    if self._CHECK[flag] then
        return self._CHECK[flag]
    end

    -- check it
    local result = flag
    if 0 ~= os.execute(string.format("%s %s -S -o %s -xc %s > %s 2>&1", self._NAME, flag, xmake._NULDEV, xmake._NULDEV, xmake._NULDEV)) then
        result = ""
    end

    -- trace
    utils.verbose("checking for the compiler flags %s ... %s", flag, utils.ifelse(#result ~= 0, "ok", "no"))

    -- save it
    self._CHECK[flag] = result

    -- ok?
    return result
end

-- the init function
function gcc.init(self, name)

    -- save name
    self._NAME = name or "gcc"

    -- init mxflags
    self.mxflags = {    "-fmessage-length=0"
                    ,   "-pipe"
                    ,   "-fpascal-strings"
                    ,   "\"-DIBOutlet=__attribute__((iboutlet))\""
                    ,   "\"-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))\""
                    ,   "\"-DIBAction=void)__attribute__((ibaction)\""}

    -- init shflags
    if name:find("clang") then
        self.shflags = { "-dynamiclib", "-fPIC" }
    else
        self.shflags = { "-shared -Wl,-soname", "-fPIC" }
    end

    -- suppress warning for the clang
    local isclang = false
    if name:find("clang") then
        isclang = true
        self.cxflags = self.cxflags or {}
        self.mxflags = self.mxflags or {}
        self.asflags = self.asflags or {}
        table.join2(self.cxflags, "-Qunused-arguments")
        table.join2(self.mxflags, "-Qunused-arguments")
        table.join2(self.asflags, "-Qunused-arguments")
    end

    -- init flags map
    self.mapflags = 
    {
        -- vectorexts
        ["-mmmx"]                   = self._check
    ,   ["-msse$"]                  = self._check
    ,   ["-msse2"]                  = self._check
    ,   ["-msse3"]                  = self._check
    ,   ["-mssse3"]                 = self._check
    ,   ["-mavx$"]                  = self._check
    ,   ["-mavx2"]                  = self._check
    ,   ["-mfpu=.*"]                = self._check

        -- warnings
    ,   ["-W1"]                     = "-Wall"
    ,   ["-W2"]                     = "-Wall"
    ,   ["-W3"]                     = "-Wall"

        -- strip
    ,   ["-s"]                      = utils.ifelse(isclang, "-Wl,-S", "-s")
    ,   ["-S"]                      = utils.ifelse(isclang, "-Wl,-S", "-S")
 
        -- others
    ,   ["-ftrapv"]                 = self._check
    ,   ["-fsanitize=address"]      = self._check
{'fraction_non_alphanumeric': 0.14359792580773834, 'fraction_numerical': 0.0066480521207286265, 'mean_word_length': 1.728327892636924, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 4, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4304338', 'n_tokens_mistral': 2374, 'n_tokens_neox': 2280, 'n_words': 629}