Включить файлы через пользовательскую функцию qmake - PullRequest
0 голосов
/ 31 января 2020

Я новичок в qmake и экспериментирую со структурами проекта. Я прямо сейчас структурировал свой проект как

./src/
   logic/
   ui/
   controller/
   etc...
./inc/
   logic/
   ui/
   controller/
   etc...

Я хотел создать функцию, которая правильно включает новый файл * .h и *. cpp соответственно, поэтому я сделал:

cont = "controller"
logic = "logic"
ui = "ui"

defineReplace(myFunction) {
    path = $$1
    name = $$2
    HEADERS *= ./inc/$${path}/$${name}.h
    SOURCES *= ./src/$${path}/$${name}.cpp
}

myFunction(cont,file1)

Я ожидал, что результат будет таким, как если бы я просто сказал:

HEADERS *= ./inc/controller/file1.h
SOURCES *= ./src/controller/file1.cpp

Но я просто получил myFunction is not a recognized test function.

Что я делаю не так?

1 Ответ

0 голосов
/ 02 февраля 2020

Что я делаю не так?

Qmake делает различие между "replace" -функциями (т. Е. Возвращает строку, например, подстановку переменной в make; обычно используется в правой части присваивания ) и «тестовые» -функции (возвращающие логическое значение, подходящее для условного оператора).

myFunction(cont, file) - это вызов тестовой функции; $$myFunction(cont, file) - это вызов функции замены.

Также обратите внимание, что файл Qmake в основном состоит из назначений и условий. Следовательно, myFunction(cont, file) интерпретируется как

myFunction(cont, file) {
    # nothing
} else {
    # nothing
}

Другая проблема заключается в том, что функции в Qmake работают с собственной частной копией переменных, поэтому вы должны использовать export(), чтобы сделать ваши изменения видимыми снаружи. Следовательно, имеем:

# replace function example code
defineReplace(myFunction) {
    HEADERS *= ./inc/$$1/$${2}.h
    SOURCES *= ./src/$$1/$${2}.cpp
    export(HEADERS)
    export(SOURCES)
    # warning: conditional must expand to exactly one word
    #return()
    # warning: conditional must expand to exactly one word
    #return(foo bar)
    # ok: any word will do as we don't care for true/false evaluation
    return(baz)
}

# test function example code
defineTest(myFunction) {
    HEADERS *= ./inc/$$1/$${2}.h
    SOURCES *= ./src/$$1/$${2}.cpp
    export(HEADERS)
    export(SOURCES)
    # warning: unexpected return value
    #return(foo)
    # ok: returns true
    #return(true)
    # ok: also returns true
    #return()
    # ...or simply return true by default
}

# calling replace function
$$myFunction(cont, file)
# calling test function
myFunction(cont, file)
...