diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 18c9c7beb0a9570433fe1e9e00ed8190ea62b444..85f622d3388dca35e73107e3c6bd58557265230f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -143,6 +143,22 @@ msys2-mingw64-meson: paths: - _build/meson-logs +msys2-clang64-meson: + stage: build + tags: + - win32-ps + variables: + MSYSTEM: "CLANG64" + CHERE_INVOKING: "yes" + script: + - C:\msys64\usr\bin\pacman --noconfirm -Syyuu + - C:\msys64\usr\bin\bash -lc "bash -x ./.gitlab-ci/test-msys2-meson.sh" + artifacts: + when: on_failure + name: "gi-_${env:CI_COMMIT_REF_NAME}" + paths: + - _build/meson-logs + vs2017-x64-meson: stage: build tags: diff --git a/.gitlab-ci/test-msys2-meson.sh b/.gitlab-ci/test-msys2-meson.sh index c61efcdea63fe822b5c3d98aff26429fef47bd6d..2fe3d6e0d0fe0183b2aac9244cca8e9467384c2e 100644 --- a/.gitlab-ci/test-msys2-meson.sh +++ b/.gitlab-ci/test-msys2-meson.sh @@ -2,30 +2,24 @@ set -e -if [[ "$MSYSTEM" == "MINGW32" ]]; then - export MSYS2_ARCH="i686" -else - export MSYS2_ARCH="x86_64" -fi - pacman --noconfirm -Suy pacman --noconfirm -S --needed \ git \ base-devel \ - mingw-w64-$MSYS2_ARCH-toolchain \ - mingw-w64-$MSYS2_ARCH-ccache \ - mingw-w64-$MSYS2_ARCH-meson \ - mingw-w64-$MSYS2_ARCH-python3 \ - mingw-w64-$MSYS2_ARCH-python3-pip \ - mingw-w64-$MSYS2_ARCH-python3-mako \ - mingw-w64-$MSYS2_ARCH-python3-markdown \ - mingw-w64-$MSYS2_ARCH-libffi \ - mingw-w64-$MSYS2_ARCH-pkg-config \ - mingw-w64-$MSYS2_ARCH-cairo \ - mingw-w64-$MSYS2_ARCH-pcre2 \ - mingw-w64-$MSYS2_ARCH-zlib \ - mingw-w64-$MSYS2_ARCH-gettext + ${MINGW_PACKAGE_PREFIX}-toolchain \ + ${MINGW_PACKAGE_PREFIX}-ccache \ + ${MINGW_PACKAGE_PREFIX}-meson \ + ${MINGW_PACKAGE_PREFIX}-python3 \ + ${MINGW_PACKAGE_PREFIX}-python3-pip \ + ${MINGW_PACKAGE_PREFIX}-python3-mako \ + ${MINGW_PACKAGE_PREFIX}-python3-markdown \ + ${MINGW_PACKAGE_PREFIX}-libffi \ + ${MINGW_PACKAGE_PREFIX}-pkg-config \ + ${MINGW_PACKAGE_PREFIX}-cairo \ + ${MINGW_PACKAGE_PREFIX}-pcre2 \ + ${MINGW_PACKAGE_PREFIX}-zlib \ + ${MINGW_PACKAGE_PREFIX}-gettext export CCACHE_BASEDIR="${CI_PROJECT_DIR}" export CCACHE_DIR="${CCACHE_BASEDIR}/_ccache" diff --git a/girepository/cmph/meson.build b/girepository/cmph/meson.build index 2a0cef7e4c7b3e23368266758587c508c81b5e2f..157b09e960a54665867b8ba95073928744e87b25 100644 --- a/girepository/cmph/meson.build +++ b/girepository/cmph/meson.build @@ -43,6 +43,7 @@ if cc.get_id() != 'msvc' '-Wno-cast-align', '-Wno-unused-function', '-Wno-return-type', + '-Wno-sometimes-uninitialized', ]) endif diff --git a/giscanner/ccompiler.py b/giscanner/ccompiler.py index a6be9ee666f609203b1cf94ed53559de56a132fc..2912fe0e01173bdd5c841f2f6b68d7114730f07b 100644 --- a/giscanner/ccompiler.py +++ b/giscanner/ccompiler.py @@ -95,6 +95,41 @@ def customize_compiler(compiler): compiler.shared_lib_extension = shlib_suffix +def resolve_mingw_lib(implib, libtool=None): + """Returns a DLL name given a path to an import lib + + /full/path/to/libgtk-3.dll.a -> libgtk-3-0.dll + """ + + args = [] + if libtool: + args.extend(libtool) + args.append('--mode=execute') + + # Figure out if we have a gcc toolchain or llvm one + dlltool = os.environ.get('DLLTOOL', 'dlltool.exe') + dlltool_output = subprocess.run( + [dlltool], stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + universal_newlines=True).stdout + is_llvm = 'llvm-dlltool' in dlltool_output + + if not is_llvm: + # gcc dlltool provides this via --identify + dlltool_args = args + [dlltool, '--identify'] + output = subprocess.check_output(dlltool_args + [implib], universal_newlines=True) + for line in output.splitlines(): + return line + else: + # for llvm we need to parse the output of nm + # https://github.com/msys2/MINGW-packages/issues/11994#issuecomment-1176691216 + output = subprocess.check_output(args + ['nm', implib], universal_newlines=True) + for line in output.splitlines(): + if line.endswith(':'): + return line[:-1] + return None + + # Flags that retain macros in preprocessed output. FLAGS_RETAINING_MACROS = ['-g3', '-ggdb3', '-gstabs3', '-gcoff3', '-gxcoff3', '-gvms3'] @@ -208,7 +243,7 @@ class CCompiler(object): args.append('-libpath:' + library_path) else: args.append('-L' + library_path) - if os.path.isabs(library_path): + if os.name != 'nt' and os.path.isabs(library_path): if libtool: args.append('-rpath') args.append(library_path) @@ -341,10 +376,6 @@ class CCompiler(object): # When we are not using Visual C++ nor clang-cl (i.e. we are using GCC)... else: libtool = utils.get_libtool_command(options) - if libtool: - args.extend(libtool) - args.append('--mode=execute') - args.extend([os.environ.get('DLLTOOL', 'dlltool.exe'), '--identify']) proc = subprocess.Popen([self.compiler_cmd, '-print-search-dirs'], stdout=subprocess.PIPE) o, e = proc.communicate() @@ -400,13 +431,10 @@ class CCompiler(object): tmp_fileobj.close() os.unlink(tmp_filename) else: - proc = subprocess.Popen(args + [implib], - stdout=subprocess.PIPE) - o, e = proc.communicate() - for line in o.decode('ascii').splitlines(): - shlibs.append(line) + shlib = resolve_mingw_lib(implib, libtool) + if shlib is not None: + shlibs.append(shlib) found = True - break if not found: not_resolved.append(lib) if len(not_resolved) > 0: diff --git a/giscanner/meson.build b/giscanner/meson.build index 3d7dc678a260b6db38afea809fe15e660d84da7e..5cb6036b09c04a2ef96d97621cc70a5ccaa04fbb 100644 --- a/giscanner/meson.build +++ b/giscanner/meson.build @@ -83,6 +83,7 @@ if cc.get_id() != 'msvc' custom_c_args = cc.get_supported_arguments([ '-Wno-missing-field-initializers', '-Wno-unused-parameter', + '-Wno-misleading-indentation', ]) endif