Fully switch to premake (a little more sane to write and maintain)

FossilOrigin-Name: fe55e222e21c7ba224ea4c584f727fcb827b7d4aeaff910a2befcd3f3d90f203
This commit is contained in:
nekobit 2023-03-26 06:31:33 +00:00
parent 4e8c7defc3
commit 7634b3df93
4 changed files with 391 additions and 149 deletions

View File

@ -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}
$<$<CONFIG:DEBUG>:-Og>
$<$<CONFIG:DEBUG>:-g>
$<$<CONFIG:RELEASE>:-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})

34
Makefile Normal file
View File

@ -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"

View File

@ -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
}
}

284
treebird.make Normal file
View File

@ -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