Skip to content

Commit ddbb5bc

Browse files
inkydragonstaticfloat
authored andcommitted
[win] Backport win MSYS2 build pr (#46988)
* Build/win: Build with MSYS2 (#46140) * Makefile: MSYS2: close path conversion for `DEP_LIBS` Automatic path conversion will replace `:` with `;` * Makefile: MSYS2: use `cygpath` for path convert ref: https://www.msys2.org/docs/filesystem-paths/#manual-unix-windows-path-conversion * devdoc/win/msys2: add build steps * devdoc/win/msys2: Add x86/x64 build notes * devdoc/win/msys2: apply sugestions Co-Authored-By: Elliot Saba <[email protected]> * Instead of `CC_WITH_ENV`, scope environment variables to targets * Fix whitespace Co-authored-by: Elliot Saba <[email protected]> * Disable MSYS2's path munging for `stringreplace` (#46803) This was causing our rewriting of the loader's RPATH emulation to fail after running `make install`, as MSYS2 was rewriting our list that looks like: ``` ../bin/libgcc_s_seh-1.dll:../bin/libopenlibm.dll:@../bin/libjulia-internal.dll:@../bin/libjulia-codegen.dll: ``` Into one that looked like: ``` ..\bin\libgcc_s_seh-1.dll;..\bin\libopenlibm.dll;@..\bin\libjulia-internal.dll;@..\bin\libjulia-codegen.dll; ``` By exporting `MSYS2_ARG_CONV_EXCL='*'` for all `stringreplace` invocations, we dodge this issue, as documented by MSYS2 [0]. [0] https://www.msys2.org/wiki/Porting/#filesystem-namespaces * [win] Disable MSYS2 path munging when calling `is.exe` (#46867) Tragically, I believe MSYS2 is messing with options such as `/VERYSILENT` turning them instead into `C:\msys2\VERYSILENT` or similar. Co-authored-by: Elliot Saba <[email protected]>
1 parent 752cc69 commit ddbb5bc

File tree

4 files changed

+79
-12
lines changed

4 files changed

+79
-12
lines changed

Make.inc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,13 +1391,13 @@ define symlink_target # (from, to-dir, to-name)
13911391
CLEAN_TARGETS += clean-$$(abspath $(2)/$(3))
13921392
clean-$$(abspath $(2)/$(3)):
13931393
ifeq ($(BUILD_OS), WINNT)
1394-
-cmd //C rmdir $$(call mingw_to_dos,$(2)/$(3),cd $(2) &&)
1394+
-cmd //C rmdir $$(call cygpath_w,$(2)/$(3))
13951395
else
13961396
-rm -r $$(abspath $(2)/$(3))
13971397
endif
13981398
$$(abspath $(2)/$(3)): | $$(abspath $(2))
13991399
ifeq ($$(BUILD_OS), WINNT)
1400-
@cmd //C mklink //J $$(call mingw_to_dos,$(2)/$(3),cd $(2) &&) $$(call mingw_to_dos,$(1),)
1400+
@cmd //C mklink //J $$(call cygpath_w,$(2)/$(3)) $$(call cygpath_w,$(1))
14011401
else ifneq (,$$(findstring CYGWIN,$$(BUILD_OS)))
14021402
@cmd /C mklink /J $$(call cygpath_w,$(2)/$(3)) $$(call cygpath_w,$(1))
14031403
else ifdef JULIA_VAGRANT_BUILD
@@ -1415,7 +1415,7 @@ WINE ?= wine
14151415
# many of the following targets must be = not := because the expansion of the makefile functions (and $1) shouldn't happen until later
14161416
ifeq ($(BUILD_OS), WINNT) # MSYS
14171417
spawn = $(1)
1418-
cygpath_w = $(1)
1418+
cygpath_w = `cygpath -w $(1)`
14191419
else ifneq (,$(findstring CYGWIN,$(BUILD_OS))) # Cygwin
14201420
spawn = $(1)
14211421
cygpath_w = `cygpath -w $(1)`

Makefile

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -222,8 +222,10 @@ endif
222222
endif
223223
endif
224224

225+
# Note that we disable MSYS2's path munging here, as otherwise
226+
# it replaces our `:`-separated list as a `;`-separated one.
225227
define stringreplace
226-
$(build_depsbindir)/stringreplace $$(strings -t x - $1 | grep $2 | awk '{print $$1;}') $3 255 "$(call cygpath_w,$1)"
228+
MSYS2_ARG_CONV_EXCL='*' $(build_depsbindir)/stringreplace $$(strings -t x - $1 | grep $2 | awk '{print $$1;}') $3 255 "$(call cygpath_w,$1)"
227229
endef
228230

229231

@@ -446,8 +448,9 @@ endif
446448

447449

448450
exe:
449-
# run Inno Setup to compile installer
450-
$(call spawn,$(JULIAHOME)/dist-extras/inno/iscc.exe /DAppVersion=$(JULIA_VERSION) /DSourceDir="$(call cygpath_w,$(BUILDROOT)/julia-$(JULIA_COMMIT))" /DRepoDir="$(call cygpath_w,$(JULIAHOME))" /F"$(JULIA_BINARYDIST_FILENAME)" /O"$(call cygpath_w,$(BUILDROOT))" $(INNO_ARGS) $(call cygpath_w,$(JULIAHOME)/contrib/windows/build-installer.iss))
451+
# run Inno Setup to compile installer.
452+
# Note that we disable MSYS2 path munging, as it interferes with the `/` options:
453+
MSYS2_ARG_CONV_EXCL='*' $(call spawn,$(JULIAHOME)/dist-extras/inno/iscc.exe /DAppVersion=$(JULIA_VERSION) /DSourceDir="$(call cygpath_w,$(BUILDROOT)/julia-$(JULIA_COMMIT))" /DRepoDir="$(call cygpath_w,$(JULIAHOME))" /F"$(JULIA_BINARYDIST_FILENAME)" /O"$(call cygpath_w,$(BUILDROOT))" $(INNO_ARGS) $(call cygpath_w,$(JULIAHOME)/contrib/windows/build-installer.iss))
451454
chmod a+x "$(BUILDROOT)/$(JULIA_BINARYDIST_FILENAME).exe"
452455

453456
app:
@@ -572,7 +575,7 @@ win-extras:
572575
cd $(JULIAHOME)/dist-extras && \
573576
$(JLDOWNLOAD) https://www.jrsoftware.org/download.php/is.exe && \
574577
chmod a+x is.exe && \
575-
$(call spawn, $(JULIAHOME)/dist-extras/is.exe /DIR="$(call cygpath_w,$(JULIAHOME)/dist-extras/inno)" /PORTABLE=1 /CURRENTUSER /VERYSILENT)
578+
MSYS2_ARG_CONV_EXCL='*' $(call spawn, $(JULIAHOME)/dist-extras/is.exe /DIR="$(call cygpath_w,$(JULIAHOME)/dist-extras/inno)" /PORTABLE=1 /CURRENTUSER /VERYSILENT)
576579

577580
# various statistics about the build that may interest the user
578581
ifeq ($(USE_SYSTEM_LLVM), 1)

cli/Makefile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ endif
2929
# Build list of dependent libraries that must be opened
3030
SHIPFLAGS += -DDEP_LIBS="\"$(LOADER_BUILD_DEP_LIBS)\""
3131
DEBUGFLAGS += -DDEP_LIBS="\"$(LOADER_DEBUG_BUILD_DEP_LIBS)\""
32+
ifneq (,$(findstring MINGW,$(shell uname)))
33+
# In MSYS2, do not perform path conversion for `DEP_LIBS`.
34+
# https://www.msys2.org/wiki/Porting/#filesystem-namespaces
35+
# We define this environment variable for only these two object files,
36+
# as they're the only ones that require it at the time of writing.
37+
$(BUILDDIR)/loader_lib.o: export MSYS2_ARG_CONV_EXCL = -DDEP_LIBS=
38+
$(BUILDDIR)/loader_lib.dbg.obj: export MSYS2_ARG_CONV_EXCL = -DDEP_LIBS=
39+
endif # MSYS2
3240

3341
EXE_OBJS := $(BUILDDIR)/loader_exe.o
3442
EXE_DOBJS := $(BUILDDIR)/loader_exe.dbg.obj

doc/src/devdocs/build/windows.md

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,67 @@ MinGW-w64 compilers available through Cygwin's package manager.
118118

119119
### Compiling with MinGW/MSYS2
120120

121-
Compiling Julia from source using [MSYS2](https://msys2.github.io) has worked in the past
122-
but is not actively supported. Pull requests to restore support would be welcome. See a
123-
[past version of this
124-
file](https://github.com/JuliaLang/julia/blob/v0.6.0/README.windows.md) for the former
125-
instructions for compiling using MSYS2.
121+
> MSYS2 provides a robust MSYS experience.
122+
123+
Note: MSYS2 requires **64 bit** Windows 7 or newer.
124+
125+
1. Install and configure [MSYS2](https://www.msys2.org/), Software Distribution
126+
and Building Platform for Windows.
127+
128+
1. Download and run the latest installer for the
129+
[64-bit](https://github.com/msys2/msys2-installer/releases/latest) distribution.
130+
The installer will have a name like `msys2-x86_64-yyyymmdd.exe`.
131+
132+
2. Open MSYS2. Update package database and base packages:
133+
```sh
134+
pacman -Syu
135+
```
136+
137+
3. Exit and restart MSYS2, Update the rest of the base packages:
138+
```sh
139+
pacman -Syu
140+
```
141+
142+
3. Then install tools required to build julia:
143+
```sh
144+
# tools
145+
pacman -S cmake diffutils git m4 make patch tar p7zip curl python
146+
147+
# For 64 bit Julia, install x86_64
148+
pacman -S mingw-w64-x86_64-gcc
149+
# For 32 bit Julia, install i686
150+
pacman -S mingw-w64-i686-gcc
151+
```
152+
153+
4. Configuration of MSYS2 is complete. Now `exit` the MSYS2 shell.
154+
155+
156+
2. Build Julia and its dependencies with pre-build dependencies.
157+
158+
1. Open a new [**MINGW64/MINGW32 shell**](https://www.msys2.org/docs/environments/#overview).
159+
Currently we can't use both mingw32 and mingw64,
160+
so if you want to build the x86_64 and i686 versions,
161+
you'll need to build them in each environment separately.
162+
163+
2. and clone the Julia sources
164+
```sh
165+
git clone https://github.com/JuliaLang/julia.git
166+
cd julia
167+
```
168+
169+
3. Start the build
170+
```sh
171+
make -j$(nproc)
172+
```
173+
174+
> Protip: build in dir
175+
> ```sh
176+
> make O=julia-mingw-w64 configure
177+
> echo 'ifeq ($(BUILDROOT),$(JULIAHOME))
178+
> $(error "in-tree build disabled")
179+
> endif' >> Make.user
180+
> make -C julia-mingw-w64
181+
> ```
126182

127183

128184
### Cross-compiling from Unix (Linux/Mac/WSL)

0 commit comments

Comments
 (0)