@ -12,7 +12,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import enum
import os
import re
from . . import mlog
from . . import mesonlib , build
@ -24,6 +26,10 @@ from ..interpreter import CustomTargetHolder
from . . interpreterbase import permittedKwargs , FeatureNewKwargs
from . . dependencies import ExternalProgram
class ResourceCompilerType ( enum . Enum ) :
windres = 1
rc = 2
class WindowsModule ( ExtensionModule ) :
def detect_compiler ( self , compilers ) :
@ -62,7 +68,19 @@ class WindowsModule(ExtensionModule):
if not rescomp . found ( ) :
raise MesonException ( ' Could not find Windows resource compiler ' )
self . _rescomp = rescomp
for ( arg , match , type ) in [
( ' /? ' , ' ^.*Microsoft.*Resource Compiler.*$ ' , ResourceCompilerType . rc ) ,
( ' --version ' , ' ^.*GNU windres.*$ ' , ResourceCompilerType . windres ) ,
] :
p , o , e = mesonlib . Popen_safe ( rescomp . get_command ( ) + [ arg ] )
m = re . search ( match , o , re . MULTILINE )
if m :
mlog . log ( ' Windows resource compiler: %s ' % m . group ( ) )
self . _rescomp = ( rescomp , type )
break
else :
raise MesonException ( ' Could not determine type of Windows resource compiler ' )
return self . _rescomp
@FeatureNewKwargs ( ' windows.compile_resources ' , ' 0.47.0 ' , [ ' depend_files ' , ' depends ' ] )
@ -80,8 +98,8 @@ class WindowsModule(ExtensionModule):
raise MesonException ( ' Resource include dirs should be include_directories(). ' )
extra_args + = get_include_args ( inc_dirs )
rescomp = self . _find_resource_compiler ( state )
if ' rc ' in rescomp . get_path ( ) :
rescomp , rescomp_type = self . _find_resource_compiler ( state )
if rescomp_type == ResourceCompilerType . rc :
# RC is used to generate .res files, a special binary resource
# format, which can be passed directly to LINK (apparently LINK uses
# CVTRES internally to convert this to a COFF object)
@ -137,7 +155,7 @@ class WindowsModule(ExtensionModule):
}
# instruct binutils windres to generate a preprocessor depfile
if ' windres ' in rescomp . get_path ( ) :
if rescomp_type == ResourceCompilerType . windres :
res_kwargs [ ' depfile ' ] = res_kwargs [ ' output ' ] + ' .d '
res_kwargs [ ' command ' ] + = [ ' --preprocessor-arg=-MD ' , ' --preprocessor-arg=-MQ@OUTPUT@ ' , ' --preprocessor-arg=-MF@DEPFILE@ ' ]