Skip to content

Commit 2f7fc4f

Browse files
committed
feat: Better CMake 2
1 parent f7d758f commit 2f7fc4f

7 files changed

Lines changed: 77 additions & 87 deletions

File tree

.editorconfig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
[*.{h,cpp,py,json,page,txt}]
22
indent_style = space
33
indent_size = 4
4+
end_of_line = lf
5+
charset = utf-8
6+
trim_trailing_whitespace = true
47

58
[*.{xml,css,md,blp,yml}]
69
indent_style = space
710
indent_size = 2
11+
end_of_line = lf
12+
charset = utf-8
13+
trim_trailing_whitespace = true

CMakeLists.txt

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,6 @@ set(SHORT_NAME "application")
1919
set(DISPLAY_NAME "Application")
2020
include(GNUInstallDirs)
2121

22-
file(STRINGS "${CMAKE_SOURCE_DIR}/resources/po/POTFILES" TRANSLATE_FILES)
23-
file(STRINGS "${CMAKE_SOURCE_DIR}/resources/po/LINGUAS" LINGUAS)
24-
set(POT_FILE "${CMAKE_SOURCE_DIR}/resources/po/${SHORT_NAME}.pot")
25-
26-
find_program(GETTEXT_XGETTEXT_EXECUTABLE xgettext)
27-
find_program(GETTEXT_MSGMERGE_EXECUTABLE msgmerge)
28-
find_program(GETTEXT_MSGFMT_EXECUTABLE msgfmt)
29-
if(EXISTS "${GETTEXT_XGETTEXT_EXECUTABLE}")
30-
if(EXISTS "${GETTEXT_MSGMERGE_EXECUTABLE}")
31-
if(EXISTS "${GETTEXT_MSGFMT_EXECUTABLE}")
32-
set(HAS_GETTEXT TRUE)
33-
endif()
34-
endif()
35-
endif()
36-
3722
add_subdirectory("lib${SHORT_NAME}")
3823
if(WIN32)
3924
add_subdirectory("${PROJECT_NAME}.qt")

cmake/helpers.cmake

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
function(generate_translations target)
2+
file(STRINGS "${CMAKE_SOURCE_DIR}/resources/po/POTFILES" TRANSLATE_FILES)
3+
file(STRINGS "${CMAKE_SOURCE_DIR}/resources/po/LINGUAS" LINGUAS)
4+
set(POT_FILE "${CMAKE_SOURCE_DIR}/resources/po/${SHORT_NAME}.pot")
5+
6+
find_program(GETTEXT_XGETTEXT_EXECUTABLE xgettext)
7+
find_program(GETTEXT_MSGMERGE_EXECUTABLE msgmerge)
8+
find_program(GETTEXT_MSGFMT_EXECUTABLE msgfmt)
9+
if(EXISTS "${GETTEXT_XGETTEXT_EXECUTABLE}")
10+
if(EXISTS "${GETTEXT_MSGMERGE_EXECUTABLE}")
11+
if(EXISTS "${GETTEXT_MSGFMT_EXECUTABLE}")
12+
set(HAS_GETTEXT TRUE)
13+
endif()
14+
endif()
15+
endif()
16+
17+
if(HAS_GETTEXT)
18+
add_custom_command(TARGET ${target} PRE_BUILD COMMAND "${GETTEXT_XGETTEXT_EXECUTABLE}" --from-code=utf-8 --c++ --force-po --output="${POT_FILE}" --keyword=_ --keyword=_f --keyword=_n:1,2 --keyword=_fn:1,2 --keyword=_p:1c,2 --keyword=_pn:1c,2,3 --keyword=C_:1c,2 --width=80 ${TRANSLATE_FILES} WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
19+
foreach(LINGUA IN ITEMS ${LINGUAS})
20+
add_custom_command(TARGET ${target} PRE_BUILD COMMAND "${GETTEXT_MSGMERGE_EXECUTABLE}" --backup=off --update "${CMAKE_SOURCE_DIR}/resources/po/${LINGUA}.po" "${POT_FILE}")
21+
endforeach()
22+
foreach(LINGUA IN ITEMS ${LINGUAS})
23+
if(MSVC)
24+
add_custom_command(TARGET ${OUTPUT_NAME} PRE_BUILD COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${LINGUA}/LC_MESSAGES")
25+
add_custom_command(TARGET ${OUTPUT_NAME} PRE_BUILD COMMAND "${GETTEXT_MSGFMT_EXECUTABLE}" "${CMAKE_SOURCE_DIR}/resources/po/${LINGUA}.po" --output-file="${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${LINGUA}/LC_MESSAGES/${SHORT_NAME}.mo")
26+
else()
27+
add_custom_command(TARGET ${OUTPUT_NAME} PRE_BUILD COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/${LINGUA}/LC_MESSAGES")
28+
add_custom_command(TARGET ${OUTPUT_NAME} PRE_BUILD COMMAND "${GETTEXT_MSGFMT_EXECUTABLE}" "${CMAKE_SOURCE_DIR}/resources/po/${LINGUA}.po" --output-file="${CMAKE_CURRENT_BINARY_DIR}/${LINGUA}/LC_MESSAGES/${SHORT_NAME}.mo")
29+
endif()
30+
endforeach()
31+
else()
32+
message(WARNING "gettext not found, translations will not be generated")
33+
endif()
34+
endfunction()
35+
36+
function(generate_linux_install is_gtk)
37+
if(NOT LINUX)
38+
return()
39+
endif()
40+
configure_file("${CMAKE_SOURCE_DIR}/resources/linux/${PROJECT_NAME}.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.desktop" @ONLY)
41+
configure_file("${CMAKE_SOURCE_DIR}/resources/linux/${PROJECT_NAME}.in" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}" @ONLY)
42+
configure_file("${CMAKE_SOURCE_DIR}/resources/linux/${PROJECT_NAME}.metainfo.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.metainfo.xml" @ONLY)
43+
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/" DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}")
44+
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_NAME}" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}")
45+
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE DESTINATION "${CMAKE_INSTALL_BINDIR}")
46+
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.desktop" DESTINATION "${CMAKE_INSTALL_DATADIR}/applications")
47+
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.metainfo.xml" DESTINATION "${CMAKE_INSTALL_DATADIR}/metainfo")
48+
install(FILES "${CMAKE_SOURCE_DIR}/resources/${PROJECT_NAME}.svg" "${CMAKE_SOURCE_DIR}/resources/${PROJECT_NAME}-devel.svg" DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps")
49+
install(FILES "${CMAKE_SOURCE_DIR}/resources/${PROJECT_NAME}-symbolic.svg" DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/symbolic/apps")
50+
find_program(GTK_UPDATE_ICON_CACHE_EXECUTABLE gtk-update-icon-cache)
51+
if(GTK_UPDATE_ICON_CACHE_EXECUTABLE)
52+
install(CODE "execute_process(COMMAND ${GTK_UPDATE_ICON_CACHE_EXECUTABLE})")
53+
else()
54+
message(WARNING "gtk-update-icon-cache not found, icons will not be updated")
55+
endif()
56+
find_program(UPDATE_DESKTOP_DATABASE_EXECUTABLE update-desktop-database)
57+
if(UPDATE_DESKTOP_DATABASE_EXECUTABLE)
58+
install(CODE "execute_process(COMMAND ${UPDATE_DESKTOP_DATABASE_EXECUTABLE})")
59+
else()
60+
message(WARNING "update-desktop-database not found, desktop database will not be updated")
61+
endif()
62+
endfunction()

libapplication/CMakeLists.txt

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,3 @@ endif()
2222

2323
find_package(libnick CONFIG REQUIRED)
2424
target_link_libraries(libapplication PUBLIC libnick::libnick)
25-
26-
if(HAS_GETTEXT)
27-
add_custom_command(TARGET libapplication PRE_BUILD COMMAND "${GETTEXT_XGETTEXT_EXECUTABLE}" --from-code=utf-8 --c++ --force-po --output="${POT_FILE}" --keyword=_ --keyword=_f --keyword=_n:1,2 --keyword=_fn:1,2 --keyword=_p:1c,2 --keyword=_pn:1c,2,3 --keyword=C_:1c,2 --width=80 ${TRANSLATE_FILES} WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
28-
foreach(LINGUA IN ITEMS ${LINGUAS})
29-
add_custom_command(TARGET libapplication PRE_BUILD COMMAND "${GETTEXT_MSGMERGE_EXECUTABLE}" --backup=off --update "${CMAKE_SOURCE_DIR}/resources/po/${LINGUA}.po" "${POT_FILE}")
30-
endforeach()
31-
else()
32-
message(WARNING "gettext not found, translations will not be generated")
33-
endif()

org.nickvision.application.gnome/CMakeLists.txt

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
include(${CMAKE_SOURCE_DIR}/cmake/helpers.cmake)
2+
13
if(NOT WIN32)
24
set(OUTPUT_NAME "${PROJECT_NAME}.gnome")
35
set(GNOME_NOTIFICATIONS true)
@@ -44,35 +46,6 @@ if(NOT WIN32)
4446
message(FATAL_ERROR "blueprint-compiler not found, UI will not be compiled")
4547
endif()
4648

47-
if(HAS_GETTEXT)
48-
foreach(LINGUA IN ITEMS ${LINGUAS})
49-
add_custom_command(TARGET ${OUTPUT_NAME} PRE_BUILD COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/${LINGUA}/LC_MESSAGES")
50-
add_custom_command(TARGET ${OUTPUT_NAME} PRE_BUILD COMMAND "${GETTEXT_MSGFMT_EXECUTABLE}" "${CMAKE_SOURCE_DIR}/resources/po/${LINGUA}.po" --output-file="${CMAKE_CURRENT_BINARY_DIR}/${LINGUA}/LC_MESSAGES/${SHORT_NAME}.mo")
51-
endforeach()
52-
endif()
53-
54-
configure_file("${CMAKE_SOURCE_DIR}/resources/linux/${PROJECT_NAME}.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.desktop" @ONLY)
55-
configure_file("${CMAKE_SOURCE_DIR}/resources/linux/${PROJECT_NAME}.in" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}" @ONLY)
56-
configure_file("${CMAKE_SOURCE_DIR}/resources/linux/${PROJECT_NAME}.metainfo.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.metainfo.xml" @ONLY)
57-
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/" DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}")
58-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_NAME}" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}")
59-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE DESTINATION "${CMAKE_INSTALL_BINDIR}")
60-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.desktop" DESTINATION "${CMAKE_INSTALL_DATADIR}/applications")
61-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.metainfo.xml" DESTINATION "${CMAKE_INSTALL_DATADIR}/metainfo")
62-
install(FILES "${CMAKE_SOURCE_DIR}/resources/${PROJECT_NAME}.svg" "${CMAKE_SOURCE_DIR}/resources/${PROJECT_NAME}-devel.svg" DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps")
63-
install(FILES "${CMAKE_SOURCE_DIR}/resources/${PROJECT_NAME}-symbolic.svg" DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/symbolic/apps")
64-
65-
find_program(GTK_UPDATE_ICON_CACHE_EXECUTABLE gtk-update-icon-cache)
66-
if(GTK_UPDATE_ICON_CACHE_EXECUTABLE)
67-
install(CODE "execute_process(COMMAND ${GTK_UPDATE_ICON_CACHE_EXECUTABLE})")
68-
else()
69-
message(WARNING "gtk-update-icon-cache not found, icons will not be updated")
70-
endif()
71-
72-
find_program(UPDATE_DESKTOP_DATABASE_EXECUTABLE update-desktop-database)
73-
if(UPDATE_DESKTOP_DATABASE_EXECUTABLE)
74-
install(CODE "execute_process(COMMAND ${UPDATE_DESKTOP_DATABASE_EXECUTABLE})")
75-
else()
76-
message(WARNING "update-desktop-database not found, desktop database will not be updated")
77-
endif()
49+
generate_translations(${OUTPUT_NAME})
50+
generate_linux_install(ON)
7851
endif()

org.nickvision.application.qt/CMakeLists.txt

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
include(${CMAKE_SOURCE_DIR}/cmake/helpers.cmake)
2+
13
set(OUTPUT_NAME "${PROJECT_NAME}.qt")
24
set(CMAKE_AUTOMOC ON)
35
set(CMAKE_AUTOUIC ON)
@@ -40,34 +42,5 @@ if(WIN32)
4042
add_custom_command(TARGET ${OUTPUT_NAME} POST_BUILD COMMAND "mt.exe" -manifest "${CMAKE_SOURCE_DIR}/resources/windows/${PROJECT_NAME}.manifest" -inputresource:\"$<TARGET_FILE:${OUTPUT_NAME}>\"\;\#1 -outputresource:\"$<TARGET_FILE:${OUTPUT_NAME}>\"\;\#1)
4143
endif()
4244
43-
if(HAS_GETTEXT)
44-
foreach(LINGUA IN ITEMS ${LINGUAS})
45-
if(MSVC)
46-
add_custom_command(TARGET ${OUTPUT_NAME} PRE_BUILD COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${LINGUA}/LC_MESSAGES")
47-
add_custom_command(TARGET ${OUTPUT_NAME} PRE_BUILD COMMAND "${GETTEXT_MSGFMT_EXECUTABLE}" "${CMAKE_SOURCE_DIR}/resources/po/${LINGUA}.po" --output-file="${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${LINGUA}/LC_MESSAGES/${SHORT_NAME}.mo")
48-
else()
49-
add_custom_command(TARGET ${OUTPUT_NAME} PRE_BUILD COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/${LINGUA}/LC_MESSAGES")
50-
add_custom_command(TARGET ${OUTPUT_NAME} PRE_BUILD COMMAND "${GETTEXT_MSGFMT_EXECUTABLE}" "${CMAKE_SOURCE_DIR}/resources/po/${LINGUA}.po" --output-file="${CMAKE_CURRENT_BINARY_DIR}/${LINGUA}/LC_MESSAGES/${SHORT_NAME}.mo")
51-
endif()
52-
endforeach()
53-
endif()
54-
55-
if(LINUX)
56-
configure_file("${CMAKE_SOURCE_DIR}/resources/linux/${PROJECT_NAME}.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.desktop" @ONLY)
57-
configure_file("${CMAKE_SOURCE_DIR}/resources/linux/${PROJECT_NAME}.in" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}" @ONLY)
58-
configure_file("${CMAKE_SOURCE_DIR}/resources/linux/${PROJECT_NAME}.metainfo.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.metainfo.xml" @ONLY)
59-
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/" DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}")
60-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_NAME}" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}")
61-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE DESTINATION "${CMAKE_INSTALL_BINDIR}")
62-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.desktop" DESTINATION "${CMAKE_INSTALL_DATADIR}/applications")
63-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.metainfo.xml" DESTINATION "${CMAKE_INSTALL_DATADIR}/metainfo")
64-
install(FILES "${CMAKE_SOURCE_DIR}/resources/${PROJECT_NAME}.svg" "${CMAKE_SOURCE_DIR}/resources/${PROJECT_NAME}-devel.svg" DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps")
65-
install(FILES "${CMAKE_SOURCE_DIR}/resources/${PROJECT_NAME}-symbolic.svg" DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/symbolic/apps")
66-
67-
find_program(UPDATE_DESKTOP_DATABASE_EXECUTABLE update-desktop-database)
68-
if(UPDATE_DESKTOP_DATABASE_EXECUTABLE)
69-
install(CODE "execute_process(COMMAND ${UPDATE_DESKTOP_DATABASE_EXECUTABLE})")
70-
else()
71-
message(WARNING "update-desktop-database not found, desktop database will not be updated")
72-
endif()
73-
endif()
45+
generate_translations(${OUTPUT_NAME})
46+
generate_linux_install(OFF)

resources/po/application.pot

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ msgid ""
88
msgstr ""
99
"Project-Id-Version: PACKAGE VERSION\n"
1010
"Report-Msgid-Bugs-To: \n"
11-
"POT-Creation-Date: 2025-06-08 16:16-0400\n"
11+
"POT-Creation-Date: 2025-06-08 17:44-0400\n"
1212
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414
"Language-Team: LANGUAGE <LL@li.org>\n"

0 commit comments

Comments
 (0)