From 57489e8764d2277451bc9f8bc0eb9c4f95c43ebb Mon Sep 17 00:00:00 2001 From: Rick Guo Date: Tue, 18 Aug 2026 19:09:55 +0800 Subject: [PATCH 1/2] feat(cqrlib): add CQRlib formula --- yayahjb/cqrlib/CQRlib-1.0.4/CMakeLists.txt | 19 +++ yayahjb/cqrlib/CQRlib-1.0.4/cqrlib_llar.gox | 131 ++++++++++++++++++++ yayahjb/cqrlib/versions.json | 4 + 3 files changed, 154 insertions(+) create mode 100644 yayahjb/cqrlib/CQRlib-1.0.4/CMakeLists.txt create mode 100644 yayahjb/cqrlib/CQRlib-1.0.4/cqrlib_llar.gox create mode 100644 yayahjb/cqrlib/versions.json diff --git a/yayahjb/cqrlib/CQRlib-1.0.4/CMakeLists.txt b/yayahjb/cqrlib/CQRlib-1.0.4/CMakeLists.txt new file mode 100644 index 0000000..67e09ae --- /dev/null +++ b/yayahjb/cqrlib/CQRlib-1.0.4/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.15) +project(CQRlib LANGUAGES C) + +add_library(CQRlib ${CQRLIB_SRC_DIR}/cqrlib.c) +target_include_directories(CQRlib PRIVATE ${CQRLIB_SRC_DIR}) +set_target_properties(CQRlib PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE) + +find_library(M_LIB m) +if(M_LIB) + target_link_libraries(CQRlib PRIVATE ${M_LIB}) +endif() + +include(GNUInstallDirs) +install(TARGETS CQRlib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} +) +install(FILES ${CQRLIB_SRC_DIR}/cqrlib.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) diff --git a/yayahjb/cqrlib/CQRlib-1.0.4/cqrlib_llar.gox b/yayahjb/cqrlib/CQRlib-1.0.4/cqrlib_llar.gox new file mode 100644 index 0000000..60cb430 --- /dev/null +++ b/yayahjb/cqrlib/CQRlib-1.0.4/cqrlib_llar.gox @@ -0,0 +1,131 @@ +import ( + "os" + "path/filepath" + "slices" + "strings" +) + +const cConsumerSource = `#include + +int main(void) { + CQRQuaternionHandle q; + CQRCreateEmptyQuaternion(&q); + return 0; +} +` + +const cppConsumerSource = `#include + +int main() { + CPPQR q; + return 0; +} +` + +id "yayahjb/cqrlib" + +// CQRlib-1.0.4 is the first upstream tag with the C++ CPPQR consumer API. +fromVer "CQRlib-1.0.4" + +defaults { + "shared": "OFF", + "fPIC": "ON", +} + +filter => { + for name, values in target.options { + if name != "shared" && name != "fPIC" { + return false + } + for value in values { + if value != "ON" && value != "OFF" { + return false + } + } + } + return true +} + +onBuild ctx => { + installDir := ctx.outputDir + + cmakeLists := ctx.Proj.readFile("CQRlib-1.0.4/CMakeLists.txt")! + os.writeFile(filepath.join(ctx.SourceDir, "CMakeLists.txt"), cmakeLists, 0o644)! + + shared := slices.contains(target.options["shared"], "ON") + fPIC := slices.contains(target.options["fPIC"], "ON") + + c := cmake.new(ctx.SourceDir, filepath.join(ctx.SourceDir, "_build"), installDir) + c.define "CQRLIB_SRC_DIR", ctx.SourceDir + c.defineBool "BUILD_SHARED_LIBS", shared + c.defineBool "CMAKE_POSITION_INDEPENDENT_CODE", fPIC + c.configure + c.build + c.install + + licenseDir := filepath.join(installDir, "licenses") + os.mkdirAll(licenseDir, 0o755)! + os.writeFile(filepath.join(licenseDir, "lgpl.txt"), os.readFile(filepath.join(ctx.SourceDir, "lgpl.txt"))!, 0o644)! + + flags := []string{ + "-I" + filepath.join(installDir, "include"), + "-L" + filepath.join(installDir, "lib"), + "-lCQRlib", + } + if slices.contains(target.require["os"], "linux") || slices.contains(target.require["os"], "freebsd") { + flags = append(flags, "-lm") + } + ctx.setMetadata strings.join(flags, " ") +} + +onTest ctx => { + installDir := ctx.outputDir + testDir := filepath.join(ctx.SourceDir, "_llar_consumer") + os.mkdirAll(testDir, 0o755)! + + cSource := filepath.join(testDir, "consumer.c") + os.writeFile(cSource, []byte(cConsumerSource), 0o644)! + cBinary := filepath.join(testDir, "consumer-c") + cArgs := []string{ + cSource, + "-I" + filepath.join(installDir, "include"), + "-L" + filepath.join(installDir, "lib"), + "-lCQRlib", + } + if slices.contains(target.require["os"], "linux") || slices.contains(target.require["os"], "freebsd") { + cArgs = append(cArgs, "-lm") + } + cArgs = append(cArgs, "-o", cBinary) + exec "cc", cArgs... + lastErr! + + cppSource := filepath.join(testDir, "consumer.cpp") + os.writeFile(cppSource, []byte(cppConsumerSource), 0o644)! + cppBinary := filepath.join(testDir, "consumer-cpp") + cppArgs := []string{ + cppSource, + "-I" + filepath.join(installDir, "include"), + "-L" + filepath.join(installDir, "lib"), + "-lCQRlib", + } + if slices.contains(target.require["os"], "linux") || slices.contains(target.require["os"], "freebsd") { + cppArgs = append(cppArgs, "-lm") + } + cppArgs = append(cppArgs, "-o", cppBinary) + exec "c++", cppArgs... + lastErr! + + if slices.contains(target.options["shared"], "ON") { + os.setenv("LD_LIBRARY_PATH", filepath.join(installDir, "lib"))! + os.setenv("DYLD_LIBRARY_PATH", filepath.join(installDir, "lib"))! + if slices.contains(target.require["os"], "windows") { + path := os.getenv("PATH") + os.setenv("PATH", filepath.join(installDir, "bin")+";"+path)! + } + } + + exec cBinary + lastErr! + exec cppBinary + lastErr! +} diff --git a/yayahjb/cqrlib/versions.json b/yayahjb/cqrlib/versions.json new file mode 100644 index 0000000..a56ec4f --- /dev/null +++ b/yayahjb/cqrlib/versions.json @@ -0,0 +1,4 @@ +{ + "path": "yayahjb/cqrlib", + "deps": {} +} From c2bc089ce605e84cf2a225102ac7baf7d7868863 Mon Sep 17 00:00:00 2001 From: Rick Guo Date: Wed, 19 Aug 2026 18:16:13 +0800 Subject: [PATCH 2/2] fix(cqrlib): publish relocatable pkg-config metadata --- yayahjb/cqrlib/CQRlib-1.0.4/cqrlib_llar.gox | 79 ++++++++++++--------- 1 file changed, 44 insertions(+), 35 deletions(-) diff --git a/yayahjb/cqrlib/CQRlib-1.0.4/cqrlib_llar.gox b/yayahjb/cqrlib/CQRlib-1.0.4/cqrlib_llar.gox index 60cb430..df4dedf 100644 --- a/yayahjb/cqrlib/CQRlib-1.0.4/cqrlib_llar.gox +++ b/yayahjb/cqrlib/CQRlib-1.0.4/cqrlib_llar.gox @@ -67,15 +67,40 @@ onBuild ctx => { os.mkdirAll(licenseDir, 0o755)! os.writeFile(filepath.join(licenseDir, "lgpl.txt"), os.readFile(filepath.join(ctx.SourceDir, "lgpl.txt"))!, 0o644)! - flags := []string{ - "-I" + filepath.join(installDir, "include"), - "-L" + filepath.join(installDir, "lib"), - "-lCQRlib", - } + libs := []string{"-L$${libdir}", "-lCQRlib"} if slices.contains(target.require["os"], "linux") || slices.contains(target.require["os"], "freebsd") { - flags = append(flags, "-lm") + libs <- "-lm" + } + + pcDir := filepath.join(installDir, "lib", "pkgconfig") + os.mkdirAll(pcDir, 0o755)! + version := "" + makefile := string(os.readFile(filepath.join(ctx.SourceDir, "Makefile"))!) + for line in makefile.split("\n") { + parts := line.splitN("=", 2) + if parts.len == 2 && strings.trimSpace(parts[0]) == "RELEASE" { + version = strings.trimSpace(parts[1]) + break + } } - ctx.setMetadata strings.join(flags, " ") + if version == "" { + panic "CQRlib Makefile has no RELEASE" + } + pc := `prefix=$${pcfiledir}/../.. +exec_prefix=$${prefix} +libdir=$${prefix}/lib +includedir=$${prefix}/include + +Name: CQRlib +Description: C quaternion rotation library +Version: ` + version + ` +Libs: ` + strings.join(libs, " ") + ` +Cflags: -I$${includedir} +` + os.writeFile(filepath.join(pcDir, "cqrlib.pc"), []byte(pc), 0o644)! + + pkgconfig.use installDir + ctx.setMetadata pkgconfig.lookup("cqrlib")! } onTest ctx => { @@ -86,34 +111,20 @@ onTest ctx => { cSource := filepath.join(testDir, "consumer.c") os.writeFile(cSource, []byte(cConsumerSource), 0o644)! cBinary := filepath.join(testDir, "consumer-c") - cArgs := []string{ - cSource, - "-I" + filepath.join(installDir, "include"), - "-L" + filepath.join(installDir, "lib"), - "-lCQRlib", - } - if slices.contains(target.require["os"], "linux") || slices.contains(target.require["os"], "freebsd") { - cArgs = append(cArgs, "-lm") - } - cArgs = append(cArgs, "-o", cBinary) - exec "cc", cArgs... - lastErr! + pkgconfig.use installDir + flags := strings.fields(pkgconfig.lookup("cqrlib")!) + cArgs := []string{cSource} + cArgs <- flags... + cArgs <- "-o", cBinary + cc! cArgs... cppSource := filepath.join(testDir, "consumer.cpp") os.writeFile(cppSource, []byte(cppConsumerSource), 0o644)! cppBinary := filepath.join(testDir, "consumer-cpp") - cppArgs := []string{ - cppSource, - "-I" + filepath.join(installDir, "include"), - "-L" + filepath.join(installDir, "lib"), - "-lCQRlib", - } - if slices.contains(target.require["os"], "linux") || slices.contains(target.require["os"], "freebsd") { - cppArgs = append(cppArgs, "-lm") - } - cppArgs = append(cppArgs, "-o", cppBinary) - exec "c++", cppArgs... - lastErr! + cppArgs := []string{cppSource} + cppArgs <- flags... + cppArgs <- "-o", cppBinary + exec! "c++", cppArgs... if slices.contains(target.options["shared"], "ON") { os.setenv("LD_LIBRARY_PATH", filepath.join(installDir, "lib"))! @@ -124,8 +135,6 @@ onTest ctx => { } } - exec cBinary - lastErr! - exec cppBinary - lastErr! + exec! cBinary + exec! cppBinary }