Compare commits

...
Sign in to create a new pull request.

8 commits

3 changed files with 387 additions and 0 deletions

View file

@ -0,0 +1,81 @@
{
lib,
pkg-config,
stdenv,
upp,
}:
{
assembly ? ".",
extraAssemblies ? [],
includeUppsrcAssembly ? true,
package,
flags ? [],
buildMethod ? if stdenv.cc.isClang then "CLANG" else "GCC",
buildShared ? false,
...
}@args:
let
flagsString = lib.optionalString (flags != []) ( "+" + lib.concatStringsSep "," flags);
output = if buildShared then "lib/${package}.so" else "bin/${package}";
in
stdenv.mkDerivation (self: {
nativeBuildInputs = [
pkg-config
upp
] ++ args.nativeBuildInputs or [];
buildInputs = upp.uppsrcDependencies ++ args.buildInputs or [];
assemblies = lib.concatStringsSep "," (
lib.singleton assembly
++ extraAssemblies
++ lib.optional includeUppsrcAssembly "${upp.src}/uppsrc"
);
postUnpack = ''
mkdir -p .home
export HOME=$(realpath .home)
'';
UPP_NO_BUILD_INFO = true;
# https://www.ultimatepp.org/app$ide$umk$en-us.html
# s - use shared libraries
# S - use shared libraries and build shared libraries
# u - use target directory
# v - verbose
# r - release mode
# FIXME: writing to $out should be done in the install phase
buildPhase = ''
runHook preBuild
mkdir -p $out/${if buildShared then "lib" else "bin"}
umk \
"$assemblies" \
${lib.escapeShellArg package} \
${buildMethod} \
-${if buildShared then "S" else "s"}uvr "-H$NIX_BUILD_CORES" \
${flagsString} \
$out/${output}
runHook postBuild
'';
# Don't run installPhase unless the user explicitly provides it
dontInstall = !lib.hasAttr "installPhase" args;
} // lib.removeAttrs args [
"assembly"
"extraAssemblies"
"includeUppsrcAssembly"
"package"
"flags"
"buildMethod"
"buildShared"
"nativeBuildInputs"
"buildInputs"
])

View file

@ -0,0 +1,131 @@
diff --git a b
index a3e9af6..0ff3dd8 100644
--- a/Makefile
+++ b/Makefile
@@ -100,8 +100,14 @@ all: prepare $(OutFile)
.PHONY: build_info
build_info:
- (date '+#define bmYEAR %y%n#define bmMONTH %m%n#define bmDAY %d%n#define bmHOUR %H%n#define bmMINUTE %M%n#define bmSECOND %S%n#define bmTIME Time( %y, %m, %d, %H, %M, %S )' | sed 's| 0\([[:digit:]]\)| \1|g' && \
- echo '#define bmMACHINE "'`hostname`'"' && \
- echo '#define bmUSER "'`whoami`'"') > "$(UPPOUT)/build_info.h"
+ (echo '#define bmYEAR 1970' && \
+ echo '#define bmMONTH 1' && \
+ echo '#define bmDAY 1' && \
+ echo '#define bmHOUR 0' && \
+ echo '#define bmMINUTE 0' && \
+ echo '#define bmSECOND 1' && \
+ echo '#define bmTIME Time(1970, 1, 1, 0, 0, 1)' && \
+ echo '#define bmMACHINE ""' && \
+ echo '#define bmUSER ""') > "$(UPPOUT)/build_info.h"
.PHONY: prepare
prepare: \
index a3e9af6..0ff3dd8 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -100,8 +100,14 @@ all: prepare $(OutFile)
.PHONY: build_info
build_info:
- (date '+#define bmYEAR %y%n#define bmMONTH %m%n#define bmDAY %d%n#define bmHOUR %H%n#define bmMINUTE %M%n#define bmSECOND %S%n#define bmTIME Time( %y, %m, %d, %H, %M, %S )' | sed 's| 0\([[:digit:]]\)| \1|g' && \
- echo '#define bmMACHINE "'`hostname`'"' && \
- echo '#define bmUSER "'`whoami`'"') > "$(UPPOUT)/build_info.h"
+ (echo '#define bmYEAR 1970' && \
+ echo '#define bmMONTH 1' && \
+ echo '#define bmDAY 1' && \
+ echo '#define bmHOUR 0' && \
+ echo '#define bmMINUTE 0' && \
+ echo '#define bmSECOND 1' && \
+ echo '#define bmTIME Time(1970, 1, 1, 0, 0, 1)' && \
+ echo '#define bmMACHINE ""' && \
+ echo '#define bmUSER ""') > "$(UPPOUT)/build_info.h"
.PHONY: prepare
prepare: \
--- a/umkMakefile
+++ b/umkMakefile
@@ -52,8 +52,14 @@ all: prepare $(OutFile)
.PHONY: build_info
build_info:
- (date '+#define bmYEAR %y%n#define bmMONTH %m%n#define bmDAY %d%n#define bmHOUR %H%n#define bmMINUTE %M%n#define bmSECOND %S%n#define bmTIME Time( %y, %m, %d, %H, %M, %S )' | sed 's| 0\([[:digit:]]\)| \1|g' && \
- echo '#define bmMACHINE "'`hostname`'"' && \
- echo '#define bmUSER "'`whoami`'"') > "$(UPPOUT)/build_info.h"
+ (echo '#define bmYEAR 1970' && \
+ echo '#define bmMONTH 1' && \
+ echo '#define bmDAY 1' && \
+ echo '#define bmHOUR 0' && \
+ echo '#define bmMINUTE 0' && \
+ echo '#define bmSECOND 1' && \
+ echo '#define bmTIME Time(1970, 1, 1, 0, 0, 1)' && \
+ echo '#define bmMACHINE ""' && \
+ echo '#define bmUSER ""') > "$(UPPOUT)/build_info.h"
.PHONY: prepare
prepare: \
--- a/umkMakefile.in
+++ b/umkMakefile.in
@@ -52,8 +52,14 @@ all: prepare $(OutFile)
.PHONY: build_info
build_info:
- (date '+#define bmYEAR %y%n#define bmMONTH %m%n#define bmDAY %d%n#define bmHOUR %H%n#define bmMINUTE %M%n#define bmSECOND %S%n#define bmTIME Time( %y, %m, %d, %H, %M, %S )' | sed 's| 0\([[:digit:]]\)| \1|g' && \
- echo '#define bmMACHINE "'`hostname`'"' && \
- echo '#define bmUSER "'`whoami`'"') > "$(UPPOUT)/build_info.h"
+ (echo '#define bmYEAR 1970' && \
+ echo '#define bmMONTH 1' && \
+ echo '#define bmDAY 1' && \
+ echo '#define bmHOUR 0' && \
+ echo '#define bmMINUTE 0' && \
+ echo '#define bmSECOND 1' && \
+ echo '#define bmTIME Time(1970, 1, 1, 0, 0, 1)' && \
+ echo '#define bmMACHINE ""' && \
+ echo '#define bmUSER ""') > "$(UPPOUT)/build_info.h"
.PHONY: prepare
prepare: \
--- a/uppsrc/ide/Builders/CppBuilder.cpp
+++ b/uppsrc/ide/Builders/CppBuilder.cpp
@@ -580,19 +580,32 @@ void CppBuilder::SaveBuildInfo(const String& package)
RealizePath(path);
FileOut info(path);
Time t = GetSysTime();
- info << "#define bmYEAR " << (int)t.year << "\r\n";
- info << "#define bmMONTH " << (int)t.month << "\r\n";
- info << "#define bmDAY " << (int)t.day << "\r\n";
- info << "#define bmHOUR " << (int)t.hour << "\r\n";
- info << "#define bmMINUTE " << (int)t.minute << "\r\n";
- info << "#define bmSECOND " << (int)t.second << "\r\n";
- info << Format("#define bmTIME Time(%d, %d, %d, %d, %d, %d)\r\n",
- (int)t.year, (int)t.month, (int)t.day, (int)t.hour, (int)t.minute, (int)t.second);
- info << "#define bmMACHINE " << AsCString(GetComputerName()) << "\r\n";
- info << "#define bmUSER " << AsCString(GetUserName()) << "\r\n";
-
- if(package == mainpackage)
- info << Join(RepoInfo(package), "\r\n");
+ char* no_build_info = getenv("NO_BUILD_INFO");
+ if((no_build_info != NULL) && strcmp(no_build_info, "1")) {
+ info << "#define bmYEAR " << (int)t.year << "\r\n";
+ info << "#define bmMONTH " << (int)t.month << "\r\n";
+ info << "#define bmDAY " << (int)t.day << "\r\n";
+ info << "#define bmHOUR " << (int)t.hour << "\r\n";
+ info << "#define bmMINUTE " << (int)t.minute << "\r\n";
+ info << "#define bmSECOND " << (int)t.second << "\r\n";
+ info << Format("#define bmTIME Time(%d, %d, %d, %d, %d, %d)\r\n",
+ (int)t.year, (int)t.month, (int)t.day, (int)t.hour, (int)t.minute, (int)t.second);
+ info << "#define bmMACHINE " << AsCString(GetComputerName()) << "\r\n";
+ info << "#define bmUSER " << AsCString(GetUserName()) << "\r\n";
+
+ if(package == mainpackage)
+ info << Join(RepoInfo(package), "\r\n");
+ } else {
+ info << "#define bmYEAR 1970\r\n";
+ info << "#define bmMONTH 1\r\n";
+ info << "#define bmDAY 1\r\n";
+ info << "#define bmHOUR 0\r\n";
+ info << "#define bmMINUTE 0\r\n";
+ info << "#define bmSECOND 1\r\n";
+ info << "#define bmTIME Time(1970, 1, 1, 0, 0, 1)\r\n";
+ info << "#define bmMACHINE \"\"\r\n";
+ info << "#define bmUSER \"\"\r\n";
+ }
}
String CppBuilder::DefinesTargetTime(const char *sep, const String& package, const Package& pkg)

View file

@ -0,0 +1,175 @@
{
lib,
callPackage,
fetchFromGitHub,
fetchpatch,
makeWrapper,
pkg-config,
stdenv,
makeDesktopItem,
copyDesktopItems,
# pkg-config dependencies
libpng,
freetype,
fontconfig,
xorg,
expat,
gtk3,
libnotify,
# other dependencies
libclang,
openssl,
}:
let
buildMethod = if stdenv.cc.isClang then "CLANG" else "GCC";
uppsrcDependencies = [
expat
fontconfig
freetype
gtk3
libnotify
libpng
openssl
xorg.libX11
xorg.libXdmcp
xorg.libXext
xorg.libXft
xorg.libXinerama
xorg.libXrender
xorg.libxcb
];
in stdenv.mkDerivation (self: let
selfBootstrap = self.overrideAttrs (selfAttrs: superAttrs: {
passthru = superAttrs.passthru // {
bootstrap = true;
};
});
in {
pname = "upp";
version = "2025.1";
src = fetchFromGitHub {
owner = "ultimatepp";
repo = "ultimatepp";
tag = "2025.1";
hash = "sha256-/hsjQvc5+HxyaytZ5kryhSxbuaAx0eXuH285q7NPiiw=";
};
enableParallelBuilding = true;
nativeBuildInputs = [
makeWrapper
pkg-config
] ++ lib.optional (!self.passthru.bootstrap) copyDesktopItems;
buildInputs = uppsrcDependencies ++ lib.optional (!self.passthru.bootstrap) libclang;
patches = [
./no-build-info.patch
(fetchpatch {
# https://github.com/ultimatepp/ultimatepp/pull/271
url = "https://github.com/ultimatepp/ultimatepp/commit/db5cad68673f9571e6571116e0570e22e3e44fe8.patch";
hash = "sha256-t2PducjE6b5MjDSAIKvEMdHnT8oTGmI073qYuhLFCh0=";
})
];
postPatch = ''
patchShebangs ./configure_makefile
echo "#define IDE_VERSION \"${self.version}\"" > uppsrc/ide/version.h
'' + lib.optionalString (!self.passthru.bootstrap) ''
mkdir -p .home
export HOME=$(realpath .home)
'';
NIX_LDFLAGS = [
"-L${libclang.lib}/lib"
"-lclang"
];
NIX_CFLAGS_COMPILE = [
"-DflagLCLANG"
];
UPP_NO_BUILD_INFO = true;
buildPhase = ''
runHook preBuild
'' + (
# Don't build theide in bootstrap to save resources
if self.passthru.bootstrap then ''
make -f umkMakefile -j $NIX_BUILD_CORES "$makeFlagsArray"
'' else ''
${lib.getExe' selfBootstrap "umk"} uppsrc ide ${buildMethod} -rvs "-H$NIX_BUILD_CORES"
${lib.getExe' selfBootstrap "umk"} uppsrc umk ${buildMethod} -rvs "-H$NIX_BUILD_CORES"
'') + ''
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out/bin
'' + (if self.passthru.bootstrap then ''
mv ./umk $out/bin/umk
'' else ''
mv $HOME/.cache/upp.out/umk/${buildMethod}.Main.Shared/umk $out/bin/umk
mv $HOME/.cache/upp.out/ide/${buildMethod}.Gui.Main.Shared/ide $out/bin/theide
wrapProgram $out/bin/theide \
--unset WAYLAND_DISPLAY
mkdir -p $out/share/icons/hicolor/scalable/apps
cp uppsrc/ide/icon.svg $out/share/icons/hicolor/scalable/apps/upp-theide.svg
for size in 16 32 64 128 256 512; do
mkdir -p $out/share/icons/hicolor/''${size}x''${size}/apps
cp uppsrc/ide/icon''${size}x''${size}.png $out/share/icons/hicolor/''${size}x''${size}/apps/upp-theide.png
done
'') + ''
runHook postInstall
'';
desktopItems = [
(makeDesktopItem {
name = "upp-theide";
exec = "theide";
icon = "upp-theide";
desktopName = "TheIDE";
comment = "The U++ Framework IDE";
categories = [ "Development" "IDE" ];
terminal = false;
})
];
passthru = {
bootstrap = false;
inherit uppsrcDependencies;
buildUppPackage = callPackage ./buildUppPackage.nix {};
tests = lib.genAttrs [
"AddressBookXML2"
"Bombs"
"Days"
"SQLApp"
"httpcli"
] (examplePackageName: self.passthru.buildUppPackage {
pname = examplePackageName;
version = self.version;
package = examplePackageName;
src = self.src;
includeUppsrcAssembly = false;
buildInputs = self.passthru.uppsrcDependencies;
assembly = "examples";
extraAssemblies = [
"uppsrc"
];
});
};
meta = {
homepage = "https://www.ultimatepp.org";
description = "C++ cross-platform rapid application development framework";
license = lib.licenses.bsd2;
mainProgram = "umk";
};
})