From 7634b3df93f40361c631d6e83f417e36880952fd Mon Sep 17 00:00:00 2001 From: nekobit Date: Sun, 26 Mar 2023 06:31:33 +0000 Subject: [PATCH] Fully switch to premake (a little more sane to write and maintain) FossilOrigin-Name: fe55e222e21c7ba224ea4c584f727fcb827b7d4aeaff910a2befcd3f3d90f203 --- CMakeLists.txt | 145 ------------------------- Makefile | 34 ++++++ premake4.lua | 77 +++++++++++++- treebird.make | 284 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 391 insertions(+), 149 deletions(-) delete mode 100644 CMakeLists.txt create mode 100644 Makefile create mode 100644 treebird.make diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 80f4b87..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,145 +0,0 @@ -# Invocations -# cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .. -# cmake -DCMAKE_BUILD_TYPE=Debug .. -# cmake -DCMAKE_BUILD_TYPE=Release .. - -# Things to perfect here: [ REMOVE WHEN DONE ] -# - Make sure the Mastodont-c folder can be linked/used directly again -# - Finish TODO's in here - -# TODO Poke at this -cmake_minimum_required(VERSION 3.14) -project(treebird - VERSION 0.7 - DESCRIPTION "A very lightweight and beautiful Pleroma frontend" - LANGUAGES C) - -if(CMAKE_C_COMPILER_ID STREQUAL "Clang") - # Shitty hack with Perl libraries :-( - set(CLANG_ONLY_HACK "-Wno-compound-token-split-by-macro -W") -endif() - -# Import local build if it exists. -# This is a current solution unless distributions provide their own packages -if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/mastodont-c") - include(mastodont-c/cmake/mastodont-config.cmake) -else() - find_package(MASTODONT REQUIRED CONFIG) -endif() -#message("${CMAKE_PREFIX_PATH} ${MASTODONT_INCLUDE_DIR}") - -add_executable(treebird ${SRC_FILES}) - -# Useful for most text editors, doesn't hurt *shrugs* -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -include(cmake/os_hacks.cmake) -# List helper -include(cmake/append_and_def.cmake) -find_package(PkgConfig REQUIRED) -# Link stuff -### find_package(CURL REQUIRED) # Required for mastodont-c - -# Note: See cmake/os_hacks.cmake as imported before! -# There's an issue with FreeBSD (possible others) where... well, FCGI doesn't have a pkg-config file... -# So we have to "emulate" a package here ourselves. :-) -pkg_check_modules(FCGI fcgi REQUIRED) - -# For some reason the arguments from Perl are stored as a full string -# Blame CMake(?), not me... -find_package(PerlLibs REQUIRED) - -# It returns in CMake terms, "the command", but we want ("the" "command"). -# `target_compile_options' wants this. -# I'm still learning CMake, don't know why it stores lists like this, but it's -# whatever -string(REPLACE " " ";" _PERL_EXTRA_C_FLAGS ${PERL_EXTRA_C_FLAGS}) -# We could also use this somehow: -# separate_arguments(_PERL_EXTRA_C_FLAGS UNIX_COMMAND -# "${PERL_EXTRA_C_FLAGS}") - -# Useful for GNU Emacs or VS Code -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -# Setup compile options -target_compile_options(treebird PUBLIC - -Wall -Wextra -std=c99 - -Wshadow -Wcast-align -Wstrict-prototypes - ${CLANG_ONLY_HACK} - ${_PERL_EXTRA_C_FLAGS} - $<$:-Og> - $<$:-g> - $<$:-O2> -) - -# hack is on me -# target_link_options(treebird PUBLIC -# # -lmastodont -# ) - -# Read CMakeLists.txt in test file -#add_subdirectory(test) - -set(SRC_FILES - src/main.c - src/types.c - src/cookie.c - src/easprintf.c - src/error.c - src/memory.c - src/helpers.c - src/key.c - src/local_config.c - src/local_config_set.c - src/query.c - src/string.c - src/string_helpers.c - src/request.c - src/session.c - src/path.c - src/mime.c -) - -# Pages -append_and_def(treebird PUBLIC ${SRC_FILES} - src/about.c - src/account.c - src/applications.c - src/attachments.c - src/base_page.c - src/conversations.c - src/emoji.c - src/emoji_reaction.c - src/global_cache.c - src/global_perl.c - src/hashtag.c - src/http.c - src/index.c - src/lists.c - # src/login.c - # src/memory_page.c - # src/notifications.c - # src/page_config.c - # src/scrobble.c - # src/search.c - # src/status.c - # src/timeline.c -) - -add_executable(file-to-c src/file-to-c/main.c) - - -target_sources(treebird PUBLIC ${SRC_FILES}) - -target_include_directories(treebird PUBLIC - ${PERL_INCLUDE_DIRS} - ${FCGI_INCLUDE_DIRS} - ${MASTODONT_INCLUDE_DIRS} - ${CURL_INCLUDE_DIRS}) - -# Build! Note the mastodont hack, this _should_ change soon. -target_link_libraries(treebird PUBLIC - ${PERL_LIBRARIES} - ${CURL_LIBRARIES} - ${FCGI_LIBRARIES} - ${MASTODONT_LIBRARIES}) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..06775cc --- /dev/null +++ b/Makefile @@ -0,0 +1,34 @@ +# GNU Make solution makefile autogenerated by Premake +# Type "make help" for usage help + +ifndef config + config=debug +endif +export config + +PROJECTS := treebird + +.PHONY: all clean help $(PROJECTS) + +all: $(PROJECTS) + +treebird: + @echo "==== Building treebird ($(config)) ====" + @${MAKE} --no-print-directory -C . -f treebird.make + +clean: + @${MAKE} --no-print-directory -C . -f treebird.make clean + +help: + @echo "Usage: make [config=name] [target]" + @echo "" + @echo "CONFIGURATIONS:" + @echo " debug" + @echo " release" + @echo "" + @echo "TARGETS:" + @echo " all (default)" + @echo " clean" + @echo " treebird" + @echo "" + @echo "For more information, see http://industriousone.com/premake/quick-start" diff --git a/premake4.lua b/premake4.lua index 405daa1..65a1834 100644 --- a/premake4.lua +++ b/premake4.lua @@ -1,16 +1,85 @@ -solution "Treebird" +premake.gcc.cc = os.getenv("CC") or 'cc'; + +if not os.isfile('config.h') then + print("Note: `config.h' not found, until a new Treebird release comes out,"); + print(" please copy `config.def.h' and edit it."); + os.exit(1); +end + +solution "Treebird"; configurations { "Debug", "Release" }; +local c_files = { + 'main.c', + 'types.c', + 'cookie.c', + 'easprintf.c', + 'error.c', + 'memory.c', + 'helpers.c', + 'key.c', + 'local_config.c', + 'local_config_set.c', + 'query.c', + 'string.c', + 'string_helpers.c', + 'request.c', + 'session.c', + 'path.c', + 'mime.c' +}; + +-- Not actually real 'pages', but the ones we compile in / create definitions +local pages = { + 'about.c', + 'account.c', + 'applications.c', + 'attachments.c', + 'base_page.c', + 'conversations.c', + 'emoji.c', + 'emoji_reaction.c', + 'global_cache.c', + 'global_perl.c', + 'hashtag.c', + 'http.c', + 'index.c', + 'lists.c', +-- 'login.c', +-- 'memory_page.c', +-- 'notifications.c', +-- 'page_config.c', +-- 'scrobble.c', +-- 'search.c', +-- 'status.c', +-- 'timeline.c', +}; + +local definitions = {}; + +-- Create definitions for page enabling +for i=1, table.getn(pages) do + local def = 'CMP_ENABLE_' .. string.upper(string.sub(pages[i], 0, -3)); + table.insert(definitions, def); +end + +-- Prepend with 'src/' +for i=1, table.getn(c_files) do c_files[i] = 'src/'.. c_files[i] end +for i=1, table.getn(pages) do pages[i] = 'src/'.. pages[i] end + -- BEGIN Mastodont project project("treebird"); kind("ConsoleApp"); language("C"); -cdialect("C99"); -files { "src/*.h", "src/*.c" }; +--files { table.unpack(c_files), table.unpack(pages) }; +files(c_files); +files(pages); includedirs { "include/" }; +defines(definitions); configuration { "linux", "bsd", "gmake" }; linkoptions { "`pkg-config --libs mastodont`" }; +-- TODO figure out perl... configuration { "Debug" }; defines { "DEBUG" }; @@ -31,4 +100,4 @@ newaction { os.mkdir(prefix .. "/share/treebird"); os.execute("install -d dist/ " .. prefix .. "/share/treebird"); end -} \ No newline at end of file +} diff --git a/treebird.make b/treebird.make new file mode 100644 index 0000000..9b9d0c7 --- /dev/null +++ b/treebird.make @@ -0,0 +1,284 @@ +# GNU Make project makefile autogenerated by Premake +ifndef config + config=debug +endif + +ifndef verbose + SILENT = @ +endif + +CC = cc +CXX = g++ +AR = ar + +ifndef RESCOMP + ifdef WINDRES + RESCOMP = $(WINDRES) + else + RESCOMP = windres + endif +endif + +ifeq ($(config),debug) + OBJDIR = obj/Debug + TARGETDIR = . + TARGET = $(TARGETDIR)/treebird + DEFINES += -DCMP_ENABLE_ABOUT -DCMP_ENABLE_ACCOUNT -DCMP_ENABLE_APPLICATIONS -DCMP_ENABLE_ATTACHMENTS -DCMP_ENABLE_BASE_PAGE -DCMP_ENABLE_CONVERSATIONS -DCMP_ENABLE_EMOJI -DCMP_ENABLE_EMOJI_REACTION -DCMP_ENABLE_GLOBAL_CACHE -DCMP_ENABLE_GLOBAL_PERL -DCMP_ENABLE_HASHTAG -DCMP_ENABLE_HTTP -DCMP_ENABLE_INDEX -DCMP_ENABLE_LISTS -DDEBUG + INCLUDES += -Iinclude + ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) + ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -g + ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) + ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) + ALL_LDFLAGS += $(LDFLAGS) + LDDEPS += + LIBS += $(LDDEPS) + LINKCMD = $(CC) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS) + define PREBUILDCMDS + endef + define PRELINKCMDS + endef + define POSTBUILDCMDS + endef +endif + +ifeq ($(config),release) + OBJDIR = obj/Release + TARGETDIR = . + TARGET = $(TARGETDIR)/treebird + DEFINES += -DCMP_ENABLE_ABOUT -DCMP_ENABLE_ACCOUNT -DCMP_ENABLE_APPLICATIONS -DCMP_ENABLE_ATTACHMENTS -DCMP_ENABLE_BASE_PAGE -DCMP_ENABLE_CONVERSATIONS -DCMP_ENABLE_EMOJI -DCMP_ENABLE_EMOJI_REACTION -DCMP_ENABLE_GLOBAL_CACHE -DCMP_ENABLE_GLOBAL_PERL -DCMP_ENABLE_HASHTAG -DCMP_ENABLE_HTTP -DCMP_ENABLE_INDEX -DCMP_ENABLE_LISTS -DNDEBUG + INCLUDES += -Iinclude + ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) + ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -O2 + ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) + ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) + ALL_LDFLAGS += $(LDFLAGS) -s + LDDEPS += + LIBS += $(LDDEPS) + LINKCMD = $(CC) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS) + define PREBUILDCMDS + endef + define PRELINKCMDS + endef + define POSTBUILDCMDS + endef +endif + +OBJECTS := \ + $(OBJDIR)/main.o \ + $(OBJDIR)/types.o \ + $(OBJDIR)/cookie.o \ + $(OBJDIR)/easprintf.o \ + $(OBJDIR)/error.o \ + $(OBJDIR)/memory.o \ + $(OBJDIR)/helpers.o \ + $(OBJDIR)/key.o \ + $(OBJDIR)/local_config.o \ + $(OBJDIR)/local_config_set.o \ + $(OBJDIR)/query.o \ + $(OBJDIR)/string.o \ + $(OBJDIR)/string_helpers.o \ + $(OBJDIR)/request.o \ + $(OBJDIR)/session.o \ + $(OBJDIR)/path.o \ + $(OBJDIR)/mime.o \ + $(OBJDIR)/about.o \ + $(OBJDIR)/account.o \ + $(OBJDIR)/applications.o \ + $(OBJDIR)/attachments.o \ + $(OBJDIR)/base_page.o \ + $(OBJDIR)/conversations.o \ + $(OBJDIR)/emoji.o \ + $(OBJDIR)/emoji_reaction.o \ + $(OBJDIR)/global_cache.o \ + $(OBJDIR)/global_perl.o \ + $(OBJDIR)/hashtag.o \ + $(OBJDIR)/http.o \ + $(OBJDIR)/index.o \ + $(OBJDIR)/lists.o \ + +RESOURCES := \ + +SHELLTYPE := msdos +ifeq (,$(ComSpec)$(COMSPEC)) + SHELLTYPE := posix +endif +ifeq (/bin,$(findstring /bin,$(SHELL))) + SHELLTYPE := posix +endif + +.PHONY: clean prebuild prelink + +all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET) + @: + +$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES) + @echo Linking treebird + $(SILENT) $(LINKCMD) + $(POSTBUILDCMDS) + +$(TARGETDIR): + @echo Creating $(TARGETDIR) +ifeq (posix,$(SHELLTYPE)) + $(SILENT) mkdir -p $(TARGETDIR) +else + $(SILENT) mkdir $(subst /,\\,$(TARGETDIR)) +endif + +$(OBJDIR): + @echo Creating $(OBJDIR) +ifeq (posix,$(SHELLTYPE)) + $(SILENT) mkdir -p $(OBJDIR) +else + $(SILENT) mkdir $(subst /,\\,$(OBJDIR)) +endif + +clean: + @echo Cleaning treebird +ifeq (posix,$(SHELLTYPE)) + $(SILENT) rm -f $(TARGET) + $(SILENT) rm -rf $(OBJDIR) +else + $(SILENT) if exist $(subst /,\\,$(TARGET)) del $(subst /,\\,$(TARGET)) + $(SILENT) if exist $(subst /,\\,$(OBJDIR)) rmdir /s /q $(subst /,\\,$(OBJDIR)) +endif + +prebuild: + $(PREBUILDCMDS) + +prelink: + $(PRELINKCMDS) + +ifneq (,$(PCH)) +$(GCH): $(PCH) + @echo $(notdir $<) + $(SILENT) $(CC) -x c-header $(ALL_CFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) -o "$@" -MF "$(@:%.gch=%.d)" -c "$<" +endif + +$(OBJDIR)/main.o: src/main.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/types.o: src/types.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/cookie.o: src/cookie.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/easprintf.o: src/easprintf.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/error.o: src/error.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/memory.o: src/memory.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/helpers.o: src/helpers.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/key.o: src/key.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/local_config.o: src/local_config.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/local_config_set.o: src/local_config_set.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/query.o: src/query.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/string.o: src/string.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/string_helpers.o: src/string_helpers.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/request.o: src/request.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/session.o: src/session.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/path.o: src/path.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/mime.o: src/mime.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/about.o: src/about.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/account.o: src/account.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/applications.o: src/applications.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/attachments.o: src/attachments.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/base_page.o: src/base_page.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/conversations.o: src/conversations.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/emoji.o: src/emoji.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/emoji_reaction.o: src/emoji_reaction.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/global_cache.o: src/global_cache.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/global_perl.o: src/global_perl.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/hashtag.o: src/hashtag.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/http.o: src/http.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/index.o: src/index.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/lists.o: src/lists.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +-include $(OBJECTS:%.o=%.d) +ifneq (,$(PCH)) + -include $(OBJDIR)/$(notdir $(PCH)).d +endif