Author SHA1 Message Date
Mikaël Capelle 9f97e0f1c7 Merge remote-tracking branch 'origin/master' into dev/extensions 2025-05-29 17:51:43 +02:00
Mikaël Capelle 621daac2ec Update README. (#152) 2025-05-29 11:59:34 +02:00
Mikaël CapelleandJeremy Rimpo 044a158340 Enable move to VCPKG (#142)
* Use CMake with presets to generate USVFS solution.
* Use preset when building super repository.
* Allow overriding VCPKG_ROOT with [paths] entry.
* Remove non needed stuff (gamebryo, nuget, third party dependencies, etc.).
* Use VCPKG from VS if no VCPKG_ROOT or path setting.
* Remove uibase from releases.

---------

Co-authored-by: Jeremy Rimpo <jrim@rimpo.org>
2025-05-29 10:48:30 +02:00
Matthew William Noel c29b1adca1 Update Qt version in build instructions (#151) 2025-05-24 09:33:14 +02:00
Mikaël Capelle ec6bb2a177 Add fallout london to build. (#150) 2025-05-23 14:03:40 +02:00
Mikaël Capelle bd6a03d2f8 Add VCPKG support for USVFS. (#149) 2025-05-22 19:02:43 +02:00
Jeremy Rimpo 1087129aac Dependency Update Meta PR (#148) 2025-05-21 17:46:44 +02:00
Jonathan Feenstra 237bd6ab5e Update readme.md for Qt 6.7.1, fix quick start commands (#146)
This also removes the `> ` before the commands to make copying and pasting more convenient.
2024-09-09 16:31:25 +02:00
Mikaël Capelle b6d75fd1a3 Add plugin_python to base translations. 2024-08-10 10:57:01 +02:00
Mikaël Capelle c9882c7d99 Add uibase to the base translations. 2024-08-09 20:53:44 +02:00
Mikaël Capelle 41bb2a3032 Fix issues with translations. 2024-08-09 17:44:38 +02:00
Mikaël Capelle 0d6a130ef8 Move to VCPKG.
* Use CMake with presets to generate USVFS solution.
* Use preset when building super repository.
* Allow overriding VCPKG_ROOT with [paths] entry.
* Remove gamebryo and nuget specific stuff.
* Remove cmake command. Add done log.
* Use VCPKG from VS if no VCPKG_ROOT or path setting.
2024-08-09 17:12:46 +02:00
Mikaël Capelle b3c66b3221 Bump Qt to 6.7.1. (#145) 2024-07-20 15:42:40 +02:00
57 changed files with 887 additions and 4254 deletions
+25
View File
@@ -0,0 +1,25 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: trailing-whitespace
exclude: '^(third-party|licenses)/.*$'
- id: end-of-file-fixer
exclude: '^(third-party|licenses)/.*$'
- id: check-merge-conflict
exclude: '^(third-party|licenses)/.*$'
- id: check-case-conflict
exclude: '^(third-party|licenses)/.*$'
- repo: https://github.com/pre-commit/mirrors-clang-format
rev: v19.1.5
hooks:
- id: clang-format
'types_or': [c++, c]
exclude: '^third-party/.*$'
ci:
autofix_commit_msg: "[pre-commit.ci] Auto fixes from pre-commit.com hooks."
autofix_prs: true
autoupdate_commit_msg: "[pre-commit.ci] Pre-commit autoupdate."
autoupdate_schedule: quarterly
submodules: false
+1 -1
View File
@@ -13,7 +13,7 @@ if (!$root) {
$output = if ($Verbose) { "Out-Default" } else { "Out-Null" }
cmake -B $root/build $root | & $output
cmake -B $root/build -G "Visual Studio 17 2022" $root | & $output
$installationPath = & $root\third-party\bin\vswhere.exe -products * -nologo -prerelease -latest -property installationPath
if (! $?) {
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

+110 -49
View File
@@ -1,27 +1,28 @@
7-Zip
~~~~~
7-Zip source code
~~~~~~~~~~~~~~~~~
License for use and distribution
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7-Zip Copyright (C) 1999-2023 Igor Pavlov.
7-Zip Copyright (C) 1999-2024 Igor Pavlov.
The licenses for files are:
1) 7z.dll:
- The "GNU LGPL" as main license for most of the code
- The "GNU LGPL" with "unRAR license restriction" for some code
- The "BSD 3-clause License" for some code
2) All other files: the "GNU LGPL".
- CPP/7zip/Compress/Rar* files: the "GNU LGPL" with "unRAR license restriction"
- CPP/7zip/Compress/LzfseDecoder.cpp: the "BSD 3-clause License"
- C/ZstdDec.c: the "BSD 3-clause License"
- C/Xxh64.c: the "BSD 2-clause License"
- Some files are "public domain" files, if "public domain" status is stated in source file.
- the "GNU LGPL" for all other files. If there is no license information in
some source file, that file is under the "GNU LGPL".
Redistributions in binary form must reproduce related license information from this file.
Note:
You can use 7-Zip on any computer, including a computer in a commercial
organization. You don't need to register or pay for 7-Zip.
The "GNU LGPL" with "unRAR license restriction" means that you must follow both
"GNU LGPL" rules and "unRAR license restriction" rules.
GNU LGPL information
--------------------
GNU LGPL information
--------------------
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -33,58 +34,118 @@
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You can receive a copy of the GNU Lesser General Public License from
You should have received a copy of the GNU Lesser General Public
License along with this library; if not,
you can get a copy of the GNU Lesser General Public License from
http://www.gnu.org/
BSD 3-clause License
--------------------
BSD 3-clause License in 7-Zip code
----------------------------------
The "BSD 3-clause License" is used for the code in 7z.dll that implements LZFSE data decompression.
That code was derived from the code in the "LZFSE compression library" developed by Apple Inc,
that also uses the "BSD 3-clause License":
The "BSD 3-clause License" is used for the following code in 7z.dll
1) LZFSE data decompression.
CPP/7zip/Compress/LzfseDecoder.cpp.
That code was derived from the code in the "LZFSE compression library" developed by Apple Inc,
that also uses the "BSD 3-clause License".
2) ZSTD data decompression.
C/ZstdDec.c
that code was developed using original zstd decoder code as reference code.
The original zstd decoder code was developed by Facebook Inc,
that also uses the "BSD 3-clause License".
----
Copyright (c) 2015-2016, Apple Inc. All rights reserved.
Copyright (c) 2015-2016, Apple Inc. All rights reserved.
Copyright (c) Facebook, Inc. All rights reserved.
Copyright (c) 2023-2024 Igor Pavlov.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Text of the "BSD 3-clause License"
----------------------------------
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the distribution.
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
3. Neither the name of the copyright holder(s) nor the names of any contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---
unRAR license restriction
-------------------------
BSD 2-clause License in 7-Zip code
----------------------------------
The decompression engine for RAR archives was developed using source
code of unRAR program.
All copyrights to original unRAR code are owned by Alexander Roshal.
The "BSD 2-clause License" is used for the XXH64 code in 7-Zip.
C/Xxh64.c
The license for original unRAR code has the following restriction:
XXH64 code in 7-Zip was derived from the original XXH64 code developed by Yann Collet.
The unRAR sources cannot be used to re-create the RAR compression algorithm,
which is proprietary. Distribution of modified unRAR sources in separate form
or as a part of other software is permitted, provided that it is clearly
stated in the documentation and source comments that the code may
not be used to develop a RAR (WinRAR) compatible archiver.
Copyright (c) 2012-2021 Yann Collet.
Copyright (c) 2023-2024 Igor Pavlov.
Text of the "BSD 2-clause License"
----------------------------------
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---
--
Igor Pavlov
unRAR license restriction
-------------------------
The decompression engine for RAR archives was developed using source
code of unRAR program.
All copyrights to original unRAR code are owned by Alexander Roshal.
The license for original unRAR code has the following restriction:
The unRAR sources cannot be used to re-create the RAR compression algorithm,
which is proprietary. Distribution of modified unRAR sources in separate form
or as a part of other software is permitted, provided that it is clearly
stated in the documentation and source comments that the code may
not be used to develop a RAR (WinRAR) compatible archiver.
--
+1 -1
View File
@@ -1,4 +1,4 @@
Copyright (c) 2012 - present, Victor Zverovich
Copyright (c) 2012 - present, Victor Zverovich and {fmt} contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
+6 -6
View File
@@ -2,12 +2,12 @@ A. HISTORY OF THE SOFTWARE
==========================
Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands
as a successor of a language called ABC. Guido remains Python's
principal author, although it includes many contributions from others.
In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
National Research Initiatives (CNRI, see https://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.
@@ -19,7 +19,7 @@ https://www.python.org/psf/) was formed, a non-profit organization
created specifically to own Python-related Intellectual Property.
Zope Corporation was a sponsoring member of the PSF.
All Python releases are Open Source (see http://www.opensource.org for
All Python releases are Open Source (see https://opensource.org for
the Open Source Definition). Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.
@@ -84,7 +84,7 @@ analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation;
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation;
All Rights Reserved" are retained in Python alone or in any derivative version
prepared by Licensee.
@@ -191,9 +191,9 @@ version prepared by Licensee. Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement. This Agreement together with
Python 1.6.1 may be located on the Internet using the following
Python 1.6.1 may be located on the internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013. This
Agreement may also be obtained from a proxy server on the Internet
Agreement may also be obtained from a proxy server on the internet
using the following URL: http://hdl.handle.net/1895.22/1013".
3. In the event Licensee prepares a derivative work that is based on
+18 -45
View File
@@ -1,49 +1,22 @@
RIVERBANK COMPUTING LIMITED LICENSE AGREEMENT FOR SIP
Copyright 2024 Phil Thompson <phil@riverbankcomputing.com>
1. This LICENSE AGREEMENT ("the SIP License") is between Riverbank Computing
Limited ("Riverbank"), and the Individual or Organization ("Licensee")
accessing and otherwise using SIP software in source or binary form and its
associated documentation. SIP comprises a software tool for generating Python
bindings for software C and C++ libraries, and a Python extension module used
at runtime by those generated bindings. This License Agreement may also be
applied to other software packages written by Riverbank.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
2. Subject to the terms and conditions of this License Agreement, Riverbank
hereby grants Licensee a nonexclusive, royalty-free, world-wide license to
reproduce, analyze, test, perform and/or display publicly, prepare derivative
works, distribute, and otherwise use SIP alone or in any derivative version,
provided, however, that Riverbank's License Agreement and Riverbank's notice of
copyright, e.g., "Copyright (c) 2015 Riverbank Computing Limited; All Rights
Reserved" are retained in SIP alone or in any derivative version prepared by
Licensee.
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
3. In the event Licensee prepares a derivative work that is based on or
incorporates SIP or any part thereof, and wants to make the derivative work
available to others as provided herein, then Licensee hereby agrees to include
in any such work a brief summary of the changes made to SIP.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
4. Licensee may not use SIP to generate Python bindings for any C or C++
library for which bindings are already provided by Riverbank.
5. Riverbank is making SIP available to Licensee on an "AS IS" basis.
RIVERBANK MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY
OF EXAMPLE, BUT NOT LIMITATION, RIVERBANK MAKES NO AND DISCLAIMS ANY
REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
PURPOSE OR THAT THE USE OF SIP WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
6. RIVERBANK SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF SIP FOR ANY
INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING,
DISTRIBUTING, OR OTHERWISE USING SIP, OR ANY DERIVATIVE THEREOF, EVEN IF
ADVISED OF THE POSSIBILITY THEREOF.
7. This License Agreement will automatically terminate upon a material breach
of its terms and conditions.
8. Nothing in this License Agreement shall be deemed to create any relationship
of agency, partnership, or joint venture between Riverbank and Licensee. This
License Agreement does not grant permission to use Riverbank trademarks or
trade name in a trademark sense to endorse or promote products or services of
Licensee, or any third party.
9. By copying, installing or otherwise using SIP, Licensee agrees to be bound
by the terms and conditions of this License Agreement.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+1 -1
View File
@@ -22,5 +22,5 @@ THE SOFTWARE.
-- NOTE: Third party dependency used by this software --
This software depends on the fmt lib (MIT License),
and users must comply to its license: https://github.com/fmtlib/fmt/blob/master/LICENSE.rst
and users must comply to its license: https://raw.githubusercontent.com/fmtlib/fmt/master/LICENSE
+3 -1
View File
@@ -1,4 +1,6 @@
(C) 1995-2017 Jean-loup Gailly and Mark Adler
Copyright notice:
(C) 1995-2022 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
+13 -39
View File
@@ -18,9 +18,13 @@ install_message = never
host =
[aliases]
super = cmake_common modorganizer* githubpp
super = cmake_common modorganizer*
plugins = check_fnis bsapacker bsa_extractor diagnose_basic installer_* plugin_python preview_base preview_bsa tool_* game_*
[translations]
mo2-translations = organizer uibase plugin_python
mo2-game-bethesda = game_creation game_enderal game_enderalse game_fallout3 game_fallout4 game_fallout4vr game_falloutNV game_gamebryo game_morrowind game_nehrim game_oblivion game_skyrim game_skyrimse game_skyrimvr game_ttw
[task]
enabled = true
mo_org = ModOrganizer2
@@ -47,6 +51,7 @@ git_shallow = false
[usvfs:task]
git_shallow = false
configuration = Release
[installer:task]
enabled = false
@@ -84,40 +89,14 @@ force = false
configure = true
pull = true
[prebuilt]
boost = true
lz4 = true
openssl = true
pyqt = true
python = true
[versions]
vs = 17
vs_year = 2022
vs_toolset = 14.3
sdk = 10.0.22621.0
sevenz = 24.05
boost = 1.85.0
boost_vs = 14.3
fmt = 10.2.1
gtest = main
directxtex = main
libloot = 0.23.0
lz4 = v1.9.4
nmm = 0.71.2
openssl = 3.3.0
pyqt = 6.7.0
pyqt_builder = 1.16.2
pyqt_sip = 13.7.0
python = v3.12.3
pybind11 = v2.12.0
bzip2 = 1.0.8
sip = 6.8.3
spdlog = v1.14.1
qt = 6.7.0
qt_vs = 2019
zlib = v1.3.1
libbsarch = 0.0.12
sdk = 10.0.26100.0
pyqt = 6.7.1
qt = 6.7.3
qt_vs = 2022
usvfs = master
explorerpp = 1.4.0
ss_paper_lad_6788 = 7.2
@@ -130,16 +109,11 @@ ss_starfield_trosski = V1.11
ss_fallout3_trosski = v1.11
ss_fallout4_trosski = v1.11
[build-types]
libbsarch = release
pyqt = release
python = release
[paths]
third_party =
prefix =
cache =
patches =
icons =
licenses =
build =
install =
@@ -148,13 +122,13 @@ install_installer =
install_libs =
install_pdbs =
install_dlls =
install_loot =
install_plugins =
install_extensions =
install_stylesheets =
install_licenses =
install_pythoncore =
install_translations =
vs =
vcpkg =
qt_install =
qt_bin =
qt_translations =
-36
View File
@@ -1,36 +0,0 @@
--- builder.py (date 1575938575861)
+++ builder.py (date 1575938575861)
@@ -402,17 +402,29 @@
'QMAKE_LFLAGS += -Wl,--version-script={}.exp'.format(
buildable.target))
- pro_lines.append(
+ if project.py_platform == 'win32':
+ for include_dir in project.py_include_dir.split(';'):
+ pro_lines.append(
+ 'INCLUDEPATH += {}'.format(
+ self.qmake_quote(include_dir)))
+ else:
+ pro_lines.append(
'INCLUDEPATH += {}'.format(
- self.qmake_quote(project.py_include_dir)))
+ self.qmake_quote(project.py_include_dir)))
+ if project.py_pylib_shlib != "":
+ pro_lines.append(
+ 'DEFINES += {}'.format(
+ self.qmake_quote("PYTHON_LIB=\"{}\"".format(
+ project.py_pylib_shlib))))
+
# Python.h on Windows seems to embed the need for pythonXY.lib, so tell
# it where it is.
# TODO: is this still necessary for Python v3.8?
if not buildable.static:
pro_lines.extend(['win32 {',
- ' LIBS += -L{}'.format(
- self.qmake_quote(project.py_pylib_dir)),
+ ' LIBS += -L{}{}'.format(
+ self.qmake_quote(project.py_pylib_dir), '' if project.py_pylib_lib == '' else ' -l' + project.py_pylib_lib),
'}'])
# Add any installables from the buildable
@@ -1,10 +0,0 @@
--- PCbuild/openssl.props (revision 5c02a39a0b31a330e06b4d6f44835afb205dc7cc)
+++ PCbuild/openssl.props (date 1575994670797)
@@ -13,6 +13,7 @@
<_DLLSuffix>-3</_DLLSuffix>
<_DLLSuffix Condition="$(Platform) == 'ARM'">$(_DLLSuffix)-arm</_DLLSuffix>
<_DLLSuffix Condition="$(Platform) == 'ARM64'">$(_DLLSuffix)-arm64</_DLLSuffix>
+ <_DLLSuffix Condition="$(Platform) == 'x64'">$(_DLLSuffix)-x64</_DLLSuffix>
<OpenSSLDLLSuffix Condition="$(OpenSSLDLLSuffix) == ''">$(_DLLSuffix)</OpenSSLDLLSuffix>
</PropertyGroup>
<ItemGroup>
+146 -120
View File
@@ -1,63 +1,69 @@
# `mob` - ModOrganizer Build Tool
This README explains how to use `mob` and build ModOrganizer2 with it.
If you want to contribute to a single plugin of MO2 or even write your own plugins,
check the [ModOrganizer2 Wiki](https://github.com/ModOrganizer2/modorganizer/wiki).
## Table of contents
- [Quick start](#quick-start)
- [Slow start](#slow-start)
- [Extended start](#extended-start)
- [Changing options](#changing-options)
* [INI files](#ini-files)
* [Command line](#command-line)
* [INI format](#ini-format)
- [INI files](#override-options-using-ini-files)
- [Command line](#override-options-using-command-line)
- [INI format](#ini-format)
- [Options](#options)
* [`[global]`](#global)
* [`[task]`](#task)
* [`[tools]`](#tools)
* [`[prebuilt]`](#prebuilt)
* [`[versions]`](#versions)
* [`[paths]`](#paths)
- [Command line](#command-line-1)
* [Global options](#global-options)
* [`build`](#build)
* [`list`](#list)
* [`options`](#options)
* [`release`](#release)
* [`git`](#git)
* [`cmake`](#cmake)
* [`inis`](#inis)
- [`[global]`](#global)
- [`[task]`](#task)
- [`[tools]`](#tools)
- [`[versions]`](#versions)
- [`[paths]`](#paths)
- [Command line](#command-line)
- [Global options](#global-options)
- [`build`](#build)
- [`list`](#list)
- [`options`](#options)
- [`release`](#release)
- [`git`](#git)
- [`cmake-config`](#cmake-config)
- [`inis`](#inis)
## Quick start
```powershell
> git clone https://github.com/ModOrganizer2/mob
> cd mob
> bootstrap
> mob -d c:\somewhere build
git clone https://github.com/ModOrganizer2/mob
cd mob
./bootstrap
mob -d c:\somewhere build
```
## Extended start
### Qt - CLI based install using [aqt](https://github.com/miurahr/aqtinstall)
### Qt Installation
[aqt](https://github.com/miurahr/aqtinstall) is a CLI installer for Qt, it makes installing Qt extremely quick and painless, and doesn't require a login
Check [`mob.ini`](https://github.com/ModOrganizer2/mob/blob/master/mob.ini#L94) to find
out which version of Qt you need.
#### Installing aqt via package manager
- Start an administrative terminal
- Install aqt using one of the two popular packaage managers
- `winget install --id=miurahr.aqtinstall -e`
- `choco install aqt`
#### CLI based install using [aqt](https://github.com/miurahr/aqtinstall)
#### Installing aqt via python/pip
[aqt](https://github.com/miurahr/aqtinstall) is a CLI installer for Qt, it makes
installing Qt extremely quick and painless, and doesn't require a login.
Check the [documentation](https://aqtinstall.readthedocs.io/en/latest/installation.html)
to install **aqt** itself.
- Install [Python 3.9](https://www.python.org/downloads/release/python-390/)
- Install [aqt](https://github.com/miurahr/aqtinstall) using `pip`
When using **aqt**, you can choose which modules to install but we recommend installing
all of them in case of changes.
#### Using aqt
- Open a terminal with administrative rights, and run
```powershell
aqt install-qt --outputdir "C:\Qt" windows desktop 6.7.0 win64_msvc2019_64 -m qtwebengine qtimageformats qtpositioning qtserialport qtwebchannel qtwebsockets
# you can also use -m all to install all modules
aqt install-qt --outputdir "C:\Qt" windows desktop ${QT_VERSION} win64_msvc2022_64 `
-m qtwebengine qtimageformats qtpositioning qtserialport qtwebchannel qtwebsockets
```
### Qt - Manual installation
- Install Qt 6.7.0 ([Installer](https://download.qt.io/official_releases/online_installers/qt-unified-windows-x64-online.exe)) and select these components:
- MSVC 2019 64-bit
#### Manual installation
- Install Qt ([Installer](https://download.qt.io/official_releases/online_installers/qt-unified-windows-x64-online.exe)) and select these components:
- MSVC 2022 64-bit
- Additional Libraries:
- Qt WebEngine (display nexus pages)
- Qt Image Formats (display images in image tab and preview)
@@ -70,12 +76,15 @@ aqt install-qt --outputdir "C:\Qt" windows desktop 6.7.0 win64_msvc2019_64 -m qt
- Qt Debug Files
### Visual Studio
- Install Visual Studio 2022 ([Installer](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&channel=Release&version=VS2022&source=VSLandingPage&cid=2030&passive=false))
- Desktop development with C++
- Desktop .NET desktop development (needed by OMOD and FOMOD installers)
- Individual Components:
- .Net Framework 4.8 SDK
- .Net Framework 4.7.2 targeting pack (OMOD targets 4.8 but VS still requires the package for other .Net components)
- .Net Framework 4.7.2 targeting pack (OMOD targets 4.8 but VS still requires
the package for other .Net components)
- Windows Universal C Runtime
- C++ ATL for latest v143 build Tools (x86 & x64)
- C++ /CLI support for v143 build Tools (Latest) (for OMOD and FOMOD installers)
@@ -85,44 +94,62 @@ aqt install-qt --outputdir "C:\Qt" windows desktop 6.7.0 win64_msvc2019_64 -m qt
- CMake tools for Windows (Skip if you have this already installed outside of the VS installer)
## Setting up MOB
- Open a shell. If you've installed Git or CMake through the VS installer, they won't be on your PATH, so you must use x64 Native Tools Command Prompt for VS 2022.- Pick a folder to develop MO2 in, for these steps it'll be `C:\dev`
- Execute these commands
```powershell
mkdir C:\dev
cd C:\dev
# close this repository
git clone https://github.com/ModOrganizer2/mob
# build mob itself - this will create mob.exe in the current directory
./bootstrap.ps1
# build MO2 itself - this will take a LONG time
mob -d C:\dev\modorganizer build
```
- Once `mob` is finished, everything will be in `C:\dev\modorganizer`. Mod Organizer can be run from `install\bin\ModOrganizer.exe`. The Visual Studio solution for Mod Organizer itself is `build\modorganizer_super\modorganizer\vsbuild\organizer.sln`.
### Prebuilts
Some third-parties are not normally built from source, but this can be changed in the options by setting the various tasks in `[prebuilt]` to `false`. If OpenSSL is built from source, perl is required ([Strawberry Perl 5.30.2.1 installer](http://strawberryperl.com/download/5.30.2.1/strawberry-perl-5.30.2.1-64bit.msi)).
Once `mob` is finished, everything will be in `C:\dev\modorganizer`.
Mod Organizer can be run from `install\bin\ModOrganizer.exe`.
The Visual Studio solution for Mod Organizer itself is `build\modorganizer_super\modorganizer\vsbuild\organizer.sln`.
## Changing options
`mob` has two ways of setting options: from INI files, the `MOBINI` environment variable, or from the command line.
### INI files
`mob` builds a list of available INI files in order of priority. Higher numbers override lower numbers:
`mob` has two ways of setting options: from INI files, the `MOBINI` environment
variable, or from the command line.
### OVerride options using INI files
`mob` builds a list of available INI files in order of priority. Higher numbers
override lower numbers:
1) The master INI `mob.ini` in the directory where `mob.exe` lives (required).
2) Any files set in `MOBINI` (separated by semicolons).
3) Another `mob.ini` in the current directory.
4) Files given with `--ini`.
Use `mob inis` to see the list of INI files in order. If `--no-default-inis` is given, `mob` will skip 1) and 2). The first INI it finds after that is considered the master.
Use `mob inis` to see the list of INI files in order. If `--no-default-inis` is given,
`mob` will skip 1) and 2). The first INI it finds after that is considered the master.
### Command line
Any option can be overridden from the command like with `-s task:section/key=value`, where `task:` is optional. Some options have shortcuts, such as `--dry` for `-s global/dry=true` and `-l5` for `-s global:output_log_level=5`. See `mob options` for the list of options.
### Override options using command line
Any option can be overridden from the command like with `-s task:section/key=value`,
where `task:` is optional. Some options have shortcuts, such as `--dry`
for `-s global/dry=true` and `-l5` for `-s global:output_log_level=5`.
See `mob options` for the list of options.
### INI format
Inside the INI file are `[sections]` and `key = value` pairs. The `[task]` section is special because it can be changed for specific tasks instead of globally. Any value under a `[task_name:task]` section will only apply to a task named `task_name`. The list of available tasks can be seen with `mob list`. See [Task names](#task-names).
Inside the INI file are `[sections]` and `key = value` pairs. The `[task]` section is
special because it can be changed for specific tasks instead of globally.
Any value under a `[task_name:task]` section will only apply to a task
named `task_name`. The list of available tasks can be seen with `mob list`.
See [Task names](#task-names).
## Options
### `[global]`
| Option | Type | Description |
| --- | --- | --- |
| `dry` | bool | Whether filesystem operations are simulated. Note that many operations will fail and that the build process will most probably not complete. This is mostly useful to get a dump of the options. |
@@ -133,12 +160,13 @@ Inside the INI file are `[sections]` and `key = value` pairs. The `[task]` secti
| `clean_task` | bool | For `build`, whether tasks are cleaned. |
| `fetch_task` | bool | For `build`, whether tasks are fetched (download, git, etc.) |
| `build_task` | bool | For `build`, whether tasks are built (msbuild, jobm etc.) |
| `output_log_level` | [0-6]| The log level for stdout: 0=silent, 1=errors, 2=warnings, 3=info (default), 4=debug, 5=trace, 6=dump. Note that 6 will dump _a lot_ of stuff, such as debug information from curl during downloads.
| `output_log_level` | [0-6]| The log level for stdout: 0=silent, 1=errors, 2=warnings, 3=info (default), 4=debug, 5=trace, 6=dump. Note that 6 will dump _a lot_ of stuff, such as debug information from curl during downloads. |
| `file_log_level` | [0-6]| The log level for the log file. |
| `log_file` | path | The path to a log file. |
| `ignore_uncommitted` | bool | When `--redownload` or `--reextract` is given, directories controlled by git will be deleted even if they contain uncommitted changes.|
### `[task]`
Options for individual tasks. Can be `[task_name:task]`, where `task_name` is the name of a task (see `mob list`) , `super` for all MO tasks or a glob like `installer_*`.
| Option | Type | Description |
@@ -147,20 +175,21 @@ Options for individual tasks. Can be `[task_name:task]`, where `task_name` is th
| `configuration` | enum | Which configuration to build, should be one of Debug, Release or RelWithDebInfo with RelWithDebInfo being the default.|
#### Common git options
Unless otherwise stated, applies to any task that is a git repo.
| Option | Type | Description |
| --- | --- | --- |
| `mo_org` | string | The organisation name when pulling from Github. Only applies to ModOrganizer projects, plus NCC and usvfs. |
| `mo_branch` | string | The branch name when pulling from Github. Only applies to ModOrganizer projects, plus NCC and usvfs. |
| `mo_master` | string | The fallback branch name when pulling from Github. Only applies to ModOrganizer projects, plus NCC and usvfs.
This branch is used when `mo_branch` does not exists. If this value is empty, the fallback mechanism is disabled (default behavior). |
| `mo_master` | string | The fallback branch name when pulling from Github. Only applies to ModOrganizer projects, plus NCC and usvfs. This branch is used when `mo_branch` does not exists. If this value is empty, the fallback mechanism is disabled (default behavior). |
| `no_pull` | bool | If a repo is already cloned, a `git pull` will be done on it every time `mob build` is run. Set to `false` to never pull and build with whatever is in there. |
| `ignore_ts` | bool | Marks all the `.ts` files in a repo with `--assume-unchanged`. Note that `mob git ignore-ts off` can be used to revert it. |
| `git_url_prefix` | string | When cloning a repo, the URL will be `$(git_url_prefix)mo_org/repo.git`. |
| `git_shallow` | bool | When true, clones with `--depth 1` to avoid having to fetch all the history. Defaults to true for third-parties. |
#### Git credentials
These are used to set `user.name` and `user.email`. Applies to any task that is a git repo.
| Option | Type | Description |
@@ -169,7 +198,9 @@ These are used to set `user.name` and `user.email`. Applies to any task that is
| `git_email` | string | Email |
#### Origin and upstream remotes
When `git` clones, it automatically creates a remote named `origin` for the URL that was cloned. When `set_origin_remote` is `true`, this will:
1) Rename `origin` to `upstream`, and
2) Create a new `origin` with the given parameters.
@@ -183,7 +214,7 @@ When `git` clones, it automatically creates a remote named `origin` for the URL
For example, this will create an `origin` remote for all ModOrganizer2 projects and mark all `.ts` files as `--assume-unchanged`.
```
```ini
[super:task]
ignore_ts = true
git_username = isanae
@@ -196,21 +227,22 @@ remote_push_default_origin = true
```
### `[tools]`
The various tools in this section are used verbatim when creating processes and so will be looked in the `PATH` environment variable. `vcvars` is best left empty, it will be found using the `vswhere.exe` that's bundled as a third-party.
### `[prebuilt]`
Some tasks can use prebuilt binaries instead of building from source.
### `[versions]`
The versions for all the tasks.
### `[paths]`
The only path that's required is `prefix`, which is where `mob` will put everything. Within this directory will be `build/`, `downloads/` and `install/`. Everything else is derived from it.
If `mob` is unable to find the Qt installation directory, it can be specified in `qt_install`. This directory should contain `bin/`, `include/`, etc. It's typically something like `C:\Qt\6.5.1\msvc2019_64\`. The other path `qt_bin` will be derived from it, it's just `$qt_install/bin/`.
If `mob` is unable to find the Qt installation directory, it can be specified in `qt_install`. This directory should contain `bin/`, `include/`, etc.
It's typically something like `C:\Qt\6.7.3\msvc2022_64\`. The other path `qt_bin` will be derived from it, it's just `$qt_install/bin/`.
## Command line
Do `mob --help` for global options and the list of available commands. Do `mob <command> --help` for more help about a command.
To use global options with command options, ensure command options are together, with no global options in the middle.
@@ -219,15 +251,15 @@ To use global options with command options, ensure command options are together,
| Option | Description |
| --- | --- |
| `--ini` | Adds an INI file, see [INI files](#ini-files). |
| `--ini` | Adds an INI file, see [INI files](#override-options-using-ini-files). |
| `--dry` | Simulates filesystem operations. Note that many operations will fail and that the build process will stop with errors. This is mostly useful to get a dump of the options. |
| `-log-level` | The log level for stdout: 0=silent, 1=errors, 2=warnings, 3=info (default), 4=debug, 5=trace, 6=dump. Note that 6 will dump _a lot_ of stuff, such as debug information from curl during downloads.
| `--destination` | The build directory where `mob` will put everything.
| `--set` | Sets an option: `-s task:section/key=value`.
| `-log-level` | The log level for stdout: 0=silent, 1=errors, 2=warnings, 3=info (default), 4=debug, 5=trace, 6=dump. Note that 6 will dump _a lot_ of stuff, such as debug information from curl during downloads. |
| `--destination` | The build directory where `mob` will put everything. |
| `--set` | Sets an option: `-s task:section/key=value`. |
| `--no-default-inis` | Does not auto detect INI files, only uses `--ini`. |
### `build`
Builds tasks. The order in which tasks have to be built is handled by `mob`, but dependencies will not be built automatically when specifying tasks manually. That is, `mob build` will build `python` before `pyqt`, but `mob build pyqt` will not build `python`. Many tasks will be able to run in parallel, but not all, either because they hog the CPU (such as `usvfs`) or because they have dependencies that have to be built first.
If any task fails to build, all the active tasks are aborted as quickly as possible.
@@ -236,7 +268,7 @@ If any task fails to build, all the active tasks are aborted as quickly as possi
Each task has a name, some have more. MO tasks for example have a full name that corresponds to their git repo (such as `modorganizer-game_features`) and a shorter name (such as `game_features`). Both can be used interchangeably. The task name can also be `super`, which refers to all repos hosted on the Mod Organizer Github account, minus `libbsarch`, `usvfs` and `NexusClientCli`. Globs can be used, like `installer_*`. See `mob list` for a list of all available tasks.
#### Options
#### Options for `build`
| Option | Description |
| --- | --- |
@@ -245,75 +277,78 @@ Each task has a name, some have more. MO tasks for example have a full name that
| `--reconfigure` | Reconfigures the task by running cmake, configure scripts, etc. Some tasks might have to delete the whole source directory. |
| `--rebuild` | Cleans and rebuilds projects. Some tasks might have to delete the whole source directory |
| `--new` | Implies all the four flags above. |
| `--clean-task`,<br>`--no-clean-task` | Sets whether tasks are cleaned. With `--no-clean-task`, the flags above are ignored. |
| `--fetch-task`,<br>`--no-fetch-task` | Sets whether tasks are fetched. With `--no-fetch-task`, nothing is downloaded, extracted, cloned or pulled. |
| `--build-task`,<br>`--no-build-task` | Sets whether tasks are built. With `--no-build-task`, nothing is ever built or installed. |
| `--pull`,<br>`--no-pull` | For repos that are controlled by git, whether to pull repos that are already cloned. With `--no-pull`, once a repo is cloned, it is never updated automatically. |
| `--revert-ts`,<br>`--no-revert-ts` | Most projects will generate `.ts` files for translations. These files are typically not committed to Github and so will often conflict when trying to pull. With `--revert-ts`, any `.ts` file is reverted before pulling. |
| `--clean-task`, `--no-clean-task` | Sets whether tasks are cleaned. With `--no-clean-task`, the flags above are ignored. |
| `--fetch-task`, `--no-fetch-task` | Sets whether tasks are fetched. With `--no-fetch-task`, nothing is downloaded, extracted, cloned or pulled. |
| `--build-task`, `--no-build-task` | Sets whether tasks are built. With `--no-build-task`, nothing is ever built or installed. |
| `--pull`, `--no-pull` | For repos that are controlled by git, whether to pull repos that are already cloned. With `--no-pull`, once a repo is cloned, it is never updated automatically. |
| `--revert-ts`, `--no-revert-ts` | Most projects will generate `.ts` files for translations. These files are typically not committed to Github and so will often conflict when trying to pull. With `--revert-ts`, any `.ts` file is reverted before pulling. |
| `--ignore-uncommitted-changes` | With `--reextract`, ignores repos that have uncommitted changes and deletes the directory without confirmation. |
| `--keep-msbuild` | `mob` starts a lot of `msbuild.exe` processes, some of which hold locks on the build directory. Because that's pretty darn annoying, `mob` will kill all `msbuild.exe` processes when it finished, unless this flag is given. |
| `<task>...` | List of tasks to run, see [Task names](#task-names). |
### `list`
Lists all the available task names. If a task has multiple names, they are all shown, separated by a comma.
#### Options
#### Options for `list`
| Option | Description |
| --- | --- |
| `--all` | Shows a task tree to see which are built in parallel. |
| `<task>...` | This is the same list of tasks that can be given in the `build` command. With `--all`, this will only show the tasks that would be built. |
### `options`
Lists all the options after parsing the INIs and the command line.
### `release`
Creates a release in `prefix/releases`. Only supports devbuilds for now. A release is made out of three archives:
- Binaries from `prefix/install/bin`;
- PDBs from `prefix/install/pdb`;
- Sources from various directories in `prefix/build`.
- Binaries from `prefix/install/bin`;
- PDBs from `prefix/install/pdb`;
- Sources from various directories in `prefix/build`.
The archive filename is `Mod.Organizer-version-suffix-what.7z`, where:
- `version` is taken from `ModOrganizer.exe`, `version.rc` or from `--version`;
- `suffix` is the optional `--suffix` argument;
- `what` is either nothing, `src` or `pdbs`.
- `version` is taken from `ModOrganizer.exe`, `version.rc` or from `--version`;
- `suffix` is the optional `--suffix` argument;
- `what` is either nothing, `src` or `pdbs`.
#### Options for `release`
#### Options
| Option | Description |
| --- | --- |
| `--bin`,<br>`--no-bin` | Whether the binary archive is created [default: yes] |
| `--pdbs`,<br>`--no-pdbs` | Whether the PDBs archive is created [default: yes] |
| `--src`,<br>`--no-src` | Whether the source archive is created [default: yes] |
| `--bin`, `--no-bin` | Whether the binary archive is created [default: yes] |
| `--pdbs`, `--no-pdbs` | Whether the PDBs archive is created [default: yes] |
| `--src`,, `--no-src` | Whether the source archive is created [default: yes] |
| `--version-from-exe` | Retrieves version information from ModOrganizer.exe [default] |
| `--version-from-rc` | Retrieves version information from `modorganizer/src/version.rc` |
| `--rc <PATH>` | Overrides the path to `version.rc` |
| `--version <VERSION>` | Overrides the version string, ignores `--version-from-exe` and `--version-from-rc` |
| `--output-dir <PATH>` | Sets the output directory to use instead of `prefix/releases` |
| `--suffix <SUFFIX>` | Optional suffix to add to the archive filenames
| `--suffix <SUFFIX>` | Optional suffix to add to the archive filenames. |
| `--force` | `mob` will refuse to create a source archive over 20MB because it would probably be incorrect. This ignores the file size warnings and creates the archive regardless of its size. |
### `git`
Various commands to manage the git repos. Includes `usvfs`, `NexusClientCli` and all the projects under `modorganizer_super`.
#### `set-remotes`
Does the same thing as the when `set_origin_remotes` is set in the INI: renames `origin` to `upstream` and adds a new `origin` with the options below. See [Origin and upstream remotes](#origin-and-upstream-remotes).
| Option | Description |
| --- | --- |
| `--username <USERNAME>` | Git username |
| `--email <EMAIL>` | Git email |
| `--key <PATH>` | Path to a putty key |
| `--no-push` | Disables pushing to `upstream` by changing the push url to `nopushurl` to avoid accidental pushes |
| `--push-origin` | Sets the new `origin` remote as the default push target
| `<path>` | Only use this repo instead of going through all of them |
| `--username <USERNAME>` | Git username. |
| `--email <EMAIL>` | Git email. |
| `--key <PATH>` | Path to a putty key. |
| `--no-push` | Disables pushing to `upstream` by changing the push url to `nopushurl` to avoid accidental pushes. |
| `--push-origin` | Sets the new `origin` remote as the default push target. |
| `<path>` | Only use this repo instead of going through all of them. |
#### `add-remote`
Simply adds a new remote with the given parameters to all the git repos.
| Option | Description |
@@ -324,31 +359,22 @@ Simply adds a new remote with the given parameters to all the git repos.
| `--push-origin` | Sets this new remote as the default push target |
| `<path>` | Only use this repo instead of going through all of them |
### `cmake-config`
### `cmake`
Runs `cmake` in a directory, as if `mob` had done it as part of the build process for a `modorganizer` project. The `cmake` invocation will contain all variables required for `cmake_common` to work.
The `cmake-config` command can display the `CMAKE_INSTALL_PREFIX` and
`CMAKE_PREFIX_PATH` variable using by `mob` itself when building so that you can run
your own `cmake`.
By default, this runs:
Below is a typical use of the command:
```powershell
# configure the current project with preset vs2022-windows using mob PATH
cmake --preset vs2022-windows `
("-DCMAKE_INSTALL_PREFIX=" + (mob cmake-config install-prefix)) `
("-DCMAKE_PREFIX_PATH=" + (mob cmake-config prefix-path))
```
cmake
-G "Visual Studio version year"
-A x64
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_MESSAGE=NEVER
<all defines>
--log-level=ERROR
--no-warn-unused-cli
..
```
#### Options
| Option | Description |
| --- | --- |
| `--generator <GEN>` | Sets the `-G` option |
| `--cmd` | Sets the last bit of the command, defaults to `..` |
| `--x86`, `--x64` | Whether to use the 32-bit or 64-bit vcvars. If `--generator` is not given, also sets `-A`. |
| `--install-prefix <PATH>` | Passes `-DCMAKE_INSTALL_PREFIX=<path>` to cmake |
### `inis`
Shows a list of the all the INIs that would be loaded, in order of priority. See [INI files](#ini-files).
Shows a list of the all the INIs that would be loaded, in order of priority.
See [INI files](#override-options-using-ini-files).
+1 -1
View File
@@ -4,7 +4,7 @@ file(GLOB_RECURSE source_files *.cpp)
file(GLOB_RECURSE header_files *.h)
add_executable(mob ${source_files} ${header_files})
set_target_properties(mob PROPERTIES CXX_STANDARD 20)
set_target_properties(mob PROPERTIES CXX_STANDARD 23)
target_compile_definitions(mob PUBLIC NOMINMAX)
target_compile_options(mob PUBLIC "/MT")
-70
View File
@@ -1,70 +0,0 @@
#include "pch.h"
#include "../tasks/tasks.h"
#include "commands.h"
namespace mob {
cmake_command::cmake_command() : command(requires_options) {}
command::meta_t cmake_command::meta() const
{
return {"cmake", "runs cmake in a directory"};
}
clipp::group cmake_command::do_group()
{
return clipp::group(
clipp::command("cmake").set(picked_),
(clipp::option("-h", "--help") >> help_) % "shows this message",
(clipp::option("-G", "--generator") & clipp::value("GEN") >> gen_) %
("sets the -G option for cmake [default: VS]"),
(clipp::option("-c", "--cmd") & clipp::value("CMD") >> cmd_) %
"overrides the cmake command line [default: \"..\"]",
(clipp::option("--x64").set(x64_, true) |
clipp::option("--x86").set(x64_, false)) %
"whether to use the x64 or x86 vcvars; if -G is not set, "
"whether to pass \"-A Win32\" or \"-A x64\" for the default "
"VS generator [default: x64]",
(clipp::option("--install-prefix") & clipp::value("PATH") >> prefix_) %
"sets CMAKE_INSTALL_PREFIX [default: empty]",
(clipp::option("-d", "--debug").set(debug_, true)) %
"whether to configure for debug mode [default: false]",
(clipp::value("PATH") >> path_) % "path from which to run `cmake`");
}
int cmake_command::do_run()
{
auto t = tasks::modorganizer::create_cmake_tool(
fs::path(utf8_to_utf16(path_)), mob::cmake::generate,
debug_ ? config::debug : config::relwithdebinfo);
t.generator(gen_);
t.cmd(cmd_);
t.prefix(prefix_);
t.output(path_);
if (!x64_)
t.architecture(arch::x86);
// copy the global context, the tool will modify it
context cxcopy(gcx());
t.run(cxcopy);
return 0;
}
std::string cmake_command::do_doc()
{
return "Runs `cmake ..` in the given directory with the same command line\n"
"as the one used for modorganizer projects.";
}
} // namespace mob
+43
View File
@@ -0,0 +1,43 @@
#include "pch.h"
#include "../core/conf.h"
#include "../tasks/tasks.h"
#include "commands.h"
namespace mob {
cmake_config_command::cmake_config_command() : command(requires_options) {}
command::meta_t cmake_config_command::meta() const
{
return {"cmake-config", "print CMake configuration variables"};
}
clipp::group cmake_config_command::do_group()
{
return clipp::group(
clipp::command("cmake-config").set(picked_),
(clipp::option("-h", "--help") >> help_) % ("shows this message"),
clipp::command("prefix-path").set(var_, variable::prefix_path) |
clipp::command("install-prefix").set(var_, variable::install_prefix));
}
std::string cmake_config_command::do_doc()
{
return "Print CMake variables to be used when configuring projects.\n";
}
int cmake_config_command::do_run()
{
switch (var_) {
case variable::prefix_path:
u8cout << tasks::modorganizer::cmake_prefix_path();
break;
case variable::install_prefix:
u8cout << conf().path().install().string();
break;
}
return 0;
}
} // namespace mob
+16 -23
View File
@@ -281,7 +281,6 @@ namespace mob {
void make_bin();
void make_pdbs();
void make_src();
void make_uibase();
void make_installer();
protected:
@@ -297,7 +296,6 @@ namespace mob {
bool bin_ = true;
bool src_ = true;
bool pdbs_ = true;
bool uibase_ = true;
bool installer_ = false;
std::string utf8out_;
fs::path out_;
@@ -367,27 +365,6 @@ namespace mob {
std::vector<fs::path> get_repos() const;
};
// runs cmake in a directory with the same parameters as `build` would
//
class cmake_command : public command {
public:
cmake_command();
meta_t meta() const override;
protected:
clipp::group do_group() override;
int do_run() override;
std::string do_doc() override;
private:
std::string gen_;
std::string cmd_;
bool x64_ = true;
bool debug_ = false;
std::string prefix_;
std::string path_;
};
// lists the inis found by mob
//
class inis_command : public command {
@@ -427,4 +404,20 @@ namespace mob {
void do_build();
};
// print CMake configuration variables
//
class cmake_config_command : public command {
public:
cmake_config_command();
meta_t meta() const override;
protected:
clipp::group do_group() override;
int do_run() override;
std::string do_doc() override;
enum class variable { prefix_path, install_prefix };
variable var_;
};
} // namespace mob
+13 -31
View File
@@ -44,9 +44,19 @@ namespace mob {
u8cout << "making src archive " << path_to_utf8(out) << "\n";
const std::vector<std::string> ignore = {"\\..+", // dot files
".*\\.log", ".*\\.tlog", ".*\\.dll",
".*\\.exe", ".*\\.lib", ".*\\.obj",
".*\\.ts", ".*\\.aps", "vsbuild"};
"explorer\\+\\+",
"stylesheets",
"transifex-translations"
".*\\.log",
".*\\.tlog",
".*\\.dll",
".*\\.exe",
".*\\.lib",
".*\\.obj",
".*\\.ts",
".*\\.aps",
"(bin|lib)",
"vsbuild(32|64)?"};
const std::vector<std::regex> ignore_re(ignore.begin(), ignore.end());
@@ -77,25 +87,6 @@ namespace mob {
op::archive_from_files(gcx(), files, tasks::modorganizer::super_path(), out);
}
void release_command::make_uibase()
{
const auto out = out_ / make_filename("uibase");
u8cout << "making uibase archive " << path_to_utf8(out) << "\n";
std::vector<fs::path> files;
if (!fs::exists(tasks::modorganizer::super_path())) {
gcx().bail_out(context::generic, "modorganizer super path not found: {}",
tasks::modorganizer::super_path());
}
op::archive_from_glob(
gcx(), tasks::modorganizer::super_path() / "uibase" / "src" / "*.h", out,
{});
op::archive_from_files(gcx(), {conf().path().install_libs() / "uibase.lib"},
conf().path().install_libs(), out);
}
void release_command::make_installer()
{
const auto file = "Mod.Organizer-" + version_ + ".exe";
@@ -178,11 +169,6 @@ namespace mob {
clipp::option("--no-src").set(src_, false)) %
"sets whether the source archive is created [default: yes]",
//(
// clipp::option("--uibase").set(uibase_, true) |
// clipp::option("--no-uibase").set(uibase_, false)
//) % "sets whether the uibase archive is created [default: yes]",
(clipp::option("--inst").set(installer_, true) |
clipp::option("--no-inst").set(installer_, false)) %
"sets whether the installer is copied [default: no]",
@@ -271,9 +257,6 @@ namespace mob {
if (src_)
make_src();
if (uibase_)
make_uibase();
if (installer_)
make_installer();
@@ -299,7 +282,6 @@ namespace mob {
make_bin();
make_pdbs();
make_src();
make_uibase();
make_installer();
return 0;
+26 -18
View File
@@ -51,24 +51,32 @@ namespace mob::details {
// returns a string from conf, bails out if it doesn't exist
//
std::string get_string(std::string_view section, std::string_view key)
std::string get_string(std::string_view section, std::string_view key,
std::optional<std::string> default_)
{
auto sitor = g_conf.find(section);
if (sitor == g_conf.end())
gcx().bail_out(context::conf, "[{}] doesn't exist", section);
auto kitor = sitor->second.find(key);
if (kitor == sitor->second.end())
gcx().bail_out(context::conf, "no key '{}' in [{}]", key, section);
if (kitor == sitor->second.end()) {
if (!default_.has_value()) {
gcx().bail_out(context::conf, "no key '{}' in [{}]", key, section);
}
return *default_;
}
return kitor->second;
}
// calls get_string(), converts to int
//
int get_int(std::string_view section, std::string_view key)
int get_int(std::string_view section, std::string_view key,
std::optional<int> default_)
{
const auto s = get_string(section, key);
const auto s = get_string(section, key, default_.transform([](auto v) {
return std::to_string(v);
}));
try {
return std::stoi(s);
@@ -80,9 +88,12 @@ namespace mob::details {
// calls get_string(), converts to bool
//
bool get_bool(std::string_view section, std::string_view key)
bool get_bool(std::string_view section, std::string_view key,
std::optional<bool> default_)
{
const auto s = get_string(section, key);
const auto s = get_string(section, key, default_.transform([](auto v) {
return v ? "true" : "false";
}));
return bool_from_string(s);
}
@@ -428,13 +439,8 @@ namespace mob {
MOB_ASSERT(!tasks.empty());
for (auto& t : tasks) {
if (t->name() != task &&
details::find_string_for_task(t->name(), key)) {
continue;
}
for (auto& t : tasks)
details::set_string_for_task(t->name(), key, value);
}
}
else {
// global task option
@@ -509,9 +515,10 @@ namespace mob {
set_path_if_empty("pf_x86", find_program_files_x86);
set_path_if_empty("pf_x64", find_program_files_x64);
set_path_if_empty("vs", find_vs);
set_path_if_empty("vcpkg", find_vcpkg); // set after vs as it will use the VS
set_path_if_empty("qt_install", find_qt);
set_path_if_empty("temp_dir", find_temp_dir);
set_path_if_empty("patches", find_in_root("patches"));
set_path_if_empty("icons", find_in_root("icons"));
set_path_if_empty("licenses", find_in_root("licenses"));
set_path_if_empty("qt_bin", qt::installation_path() / "bin");
set_path_if_empty("qt_translations", qt::installation_path() / "translations");
@@ -530,15 +537,14 @@ namespace mob {
resolve_path("install", p.prefix(), "install");
resolve_path("install_installer", p.install(), "installer");
resolve_path("install_bin", p.install(), "bin");
resolve_path("install_libs", p.install(), "libs");
resolve_path("install_libs", p.install(), "lib");
resolve_path("install_pdbs", p.install(), "pdb");
resolve_path("install_dlls", p.install_bin(), "dlls");
resolve_path("install_loot", p.install_bin(), "loot");
resolve_path("install_plugins", p.install_bin(), "plugins");
resolve_path("install_licenses", p.install_bin(), "licenses");
resolve_path("install_pythoncore", p.install_bin(), "pythoncore");
resolve_path("install_stylesheets", p.install_bin(), "stylesheets");
resolve_path("install_translations", p.install_bin(), "translations");
resolve_path("install_extensions", p.install_bin(), "extensions");
// finally, resolve the tools that are unlikely to be in PATH; all the
// other tools (7z, jom, patch, etc.) are assumed to be in PATH (which
@@ -684,7 +690,7 @@ namespace mob {
return {};
}
conf_prebuilt conf::prebuilt()
conf_translations conf::translation()
{
return {};
}
@@ -777,6 +783,8 @@ namespace mob {
conf_build_types::conf_build_types() : conf_section("build-types") {}
conf_translations::conf_translations() : conf_section("translations") {}
conf_prebuilt::conf_prebuilt() : conf_section("prebuilt") {}
conf_paths::conf_paths() : conf_section("paths") {}
+32 -14
View File
@@ -9,7 +9,8 @@ namespace mob::details {
// returns an option named `key` from the given `section`
//
std::string get_string(std::string_view section, std::string_view key);
std::string get_string(std::string_view section, std::string_view key,
std::optional<std::string> default_ = {});
// convert a string to the given type
template <class T>
@@ -25,11 +26,13 @@ namespace mob::details {
// calls get_string(), converts to bool
//
bool get_bool(std::string_view section, std::string_view key);
bool get_bool(std::string_view section, std::string_view key,
std::optional<bool> default_ = {});
// calls get_string(), converts to in
//
int get_int(std::string_view section, std::string_view key);
int get_int(std::string_view section, std::string_view key,
std::optional<int> default_ = {});
// sets the given option, bails out if the option doesn't exist
//
@@ -60,9 +63,17 @@ namespace mob {
template <class DefaultType>
class conf_section {
public:
DefaultType get(std::string_view key) const
DefaultType get(std::string_view key,
std::optional<DefaultType> default_ = {}) const
{
const auto value = details::get_string(name_, key);
const auto value = [=] {
if constexpr (std::is_same_v<DefaultType, std::string>) {
return details::get_string(name_, key, default_);
}
else {
return details::get_string(name_, key);
}
}();
if constexpr (std::is_convertible_v<std::string, DefaultType>) {
return value;
@@ -74,18 +85,18 @@ namespace mob {
// undefined
template <class T>
T get(std::string_view key) const;
T get(std::string_view key, std::optional<T> default_ = {}) const;
template <>
bool get<bool>(std::string_view key) const
bool get<bool>(std::string_view key, std::optional<bool> default_) const
{
return details::get_bool(name_, key);
return details::get_bool(name_, key, default_);
}
template <>
int get<int>(std::string_view key) const
int get<int>(std::string_view key, std::optional<int> default_) const
{
return details::get_int(name_, key);
return details::get_int(name_, key, default_);
}
void set(std::string_view key, std::string_view value)
@@ -223,6 +234,13 @@ namespace mob {
conf_build_types();
};
// options in [translations]
//
class conf_translations : public conf_section<std::string> {
public:
conf_translations();
};
// options in [prebuilt]
//
class conf_prebuilt : public conf_section<std::string> {
@@ -245,7 +263,7 @@ namespace mob {
VALUE(third_party);
VALUE(prefix);
VALUE(cache);
VALUE(patches);
VALUE(icons);
VALUE(licenses);
VALUE(build);
@@ -256,14 +274,13 @@ namespace mob {
VALUE(install_pdbs);
VALUE(install_dlls);
VALUE(install_loot);
VALUE(install_plugins);
VALUE(install_extensions);
VALUE(install_stylesheets);
VALUE(install_licenses);
VALUE(install_pythoncore);
VALUE(install_translations);
VALUE(vs);
VALUE(vcpkg);
VALUE(qt_install);
VALUE(qt_bin);
VALUE(qt_translations);
@@ -285,6 +302,7 @@ namespace mob {
conf_cmake cmake();
conf_tools tool();
conf_transifex transifex();
conf_translations translation();
conf_prebuilt prebuilt();
conf_versions version();
conf_build_types build_types();

Some files were not shown because too many files have changed in this diff Show More